一 图像阈值处理

准备一张灰度图像

阈值处理通常是设定一个阈值,让图片的所有像素点的值与其比较做出一系列的操作。

在opencv常用的阈值处理函数有五种,分别是THRESH_BINARY、THRESH_BINARY_INV、THRESH_TRUNC、THRESH_TOZERO、THRESH_TOZERO_INV。接下来分别看下这几种处理图片后的效果

1. THRESH_BINAR

# 像素值超过127的变成255,否则为0,亮的更亮
ret,threshold1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)

2.  THRESH_BINARY_INV

 
# 像素值超过127的变成0,否则为255,亮的更暗
ret,threshold2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)

3. THRESH_TRUNC

# 像素值超过127的变成127,否则不变,理解成图片整体变暗
ret,threshold3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)

4. THRESH_TOZERO

# 像素值超过127的不变,否则为0,理解成加大图片的对比度
ret,threshold4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)

5.  THRESH_TOZERO_INV

# 像素值超过127的为0,否则不变
ret,threshold5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)

阈值处理的使用场景我会在后续的博客中写出~~~

二 . 滤波

滤波的原理是通过指定大小的单位矩阵与图像做相关运算,具体的线性代数的东西这里不展开,若后续工作会深入,再回来完善...

经常使用到的滤波操作有三种,均值滤波、高斯滤波、中位值滤波。

1.均值滤波(通过求与单位矩阵做内积和的平均值做图像处理)

blur = cv2.blur(img,(3,3)) 

2. 高斯滤波 (根据正态分布处理图像,越靠近中心点,值越接近)

blur2 = cv2.GaussianBlur(img,(3,3),1) 

3.  中位值滤波(取指定大小矩阵的所有元素值的中位值处理)

blur3 = cv2.medianBlur(img,5) 

把这几张图片水平拼接观察,不难发现在处理噪点的场景中,使用中位值滤波效果最为明显

三. 腐蚀与膨胀

1. 腐蚀

img = cv2.imread("test.png")
img2 = cv2.erode(img,kernel=numpy.ones((9,9),numpy.uint8),iterations=9) 和单位矩阵做处理,迭代9次,意味这腐蚀的程度
cv2.imshow("IMage",numpy.hstack((img,img2)))
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 膨胀 (嗯,和腐蚀操作刚好相反)

img2 = cv2.dilate(img,kernel=numpy.ones((9,9),numpy.uint8),iterations=9)
cv2.imshow("IMage",numpy.hstack((img,img2)))
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 梯度运算(膨胀-腐蚀)

img2=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel=numpy.ones((5,5),numpy.uint8))
cv2.imshow("IMage",img2)

4. 礼帽与黑帽

img2 = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel=numpy.ones((5,5),numpy.uint8)) # 就是腐蚀掉的部分

img3 = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel=numpy.ones((5,5),numpy.uint8)) # 原始部分的外壳

四. 图像梯度与边缘检测

1.Sobel算子

这里的图片借鉴自https://blog.csdn.net/JimmyFu0055/article/details/83718901

Gx,Gy分别代表水平与竖直方向上的梯度

原图:

img = cv2.imread("test.png")
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3) # 1,0代表求水平dx方向上的梯度
sobelx = cv2.convertScaleAbs(sobelx)         sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3) # 0,1代表求水平dy方向上的梯度
sobely = cv2.convertScaleAbs(sobely) sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
sobelxy2 = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3) # 不推荐这一种方法求边界 cv2.imshow("IMage",sobelxy)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

结语:这段时间工作实在太忙了,不是评论提醒都快忘记继续写博客了,这部分的内容学过比较久了,今天整理一下方便他人也方便自己。

                   ——2019-10-17 22:42:32

opencv——常见的操作的更多相关文章

  1. opencv笔记4:模板运算和常见滤波操作

    time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...

  2. c#常见stream操作

    原文: c#常见stream操作 常见并常用的stream一共有 文件流(FileStream), 内存流(MemoryStream), 压缩流(GZipStream), 加密流(CrypToStre ...

  3. java常见文件操作

    收集整理的java常见文件操作,方便平时使用: //1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if ( ...

  4. touch.js——常见应用操作

    touch.js--常见应用操作 基本事件: touchstart   //手指刚接触屏幕时触发 touchmove    //手指在屏幕上移动时触发 touchend     //手指从屏幕上移开时 ...

  5. Selenium 定位页面元素 以及总结页面常见的元素 以及总结用户常见的操作

    1. Selenium常见的定位页面元素 2.页面常见的元素 3. 用户常见的操作 1. Selenium常见的定位页面元素 driver.findElement(By.id());driver.fi ...

  6. Python 常见文件操作的函数示例(转)

    转自:http://www.cnblogs.com/txw1958/archive/2012/03/08/2385540.html # -*-coding:utf8 -*- ''''' Python常 ...

  7. JavaScript常见集合操作

    JavaScript常见集合操作 集合的遍历 FOR循环(效率最高) 优点:JavaScript最普遍的for循环,执行效率最高 缺点:无法遍历对象 for(let i=0;i<array.le ...

  8. OpenCV中Mat操作clone() 与copyto()的区别

    OpenCV中Mat操作clone() 与copyto()的区别 // Mat is basically a class with two data parts: the matrix header ...

  9. 如何用OpenCV跟踪鼠标操作

    转载:如何用OpenCV跟踪鼠标操作 http://blog.skyoung.org/2014/05/01/how-to-track-mouse/ 在视频第一帧手动标记出目标的位置是在线视觉跟踪中最基 ...

随机推荐

  1. HDU 6242 Geometry Problem(计算几何 + 随机化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6242 思路:当 n == 1 时 任取一点 p 作为圆心即可. n >= 2 && ...

  2. The Preliminary Contest for ICPC Asia Shenyang 2019 H

    H. Texas hold'em Poker 思路:根据每个牌型分等级,然后排序按照等级优先,最大值次之,次大值,最后比较剩下值的和. #include<bits/stdc++.h> us ...

  3. Redis Sentinel用法

    1 Redis Sentinel 1.1 哨兵的作用 1. 监控:监控主从是否正常 2. 通知:出现问题时,可以通知相关人员 3. 故障迁移:自动主从切换 4. 统一的配置管理:连接者询问sentin ...

  4. java中接口的简单运用&java中的一些异常(运用myeclipse)

    package test;//创建一个名为test的包 public class A4paper implements Paper { public String getSize(){ return& ...

  5. vim以超级用户权限保存文件

    以普通用户打开文件 保存时执行 :w !sudo tee % > /dev/null

  6. android service 样例(电话录音和获取系统当前时间)

    关于android service 的具体解释请參考: android四大组件--android service具体解释.以下将用两个实例具体呈现Android Service的两种实现. 一个是st ...

  7. 【hihoCoder】每周一题(从week 220开始)

    2018/9/17-2018/9/23  week 220 push button I 题目链接:https://hihocoder.com/contest/hiho220/problem/1 有N个 ...

  8. 【TJOI2018】教科书般的亵渎

    题面 题目描述 小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为\(a_i\),且每个怪物血量均不相同,小豆手里有无限张"亵渎".亵渎的效果是对所有的怪造成11点伤 ...

  9. leetcode-按奇偶排序数组II

    Python解决方法: class Solution(object): def sortArrayByParityII(self, A): j = 1 for i in xrange(0, len(A ...

  10. Clickhouse集群部署

    1.集群节点信息 10.12.110.201 ch201 10.12.110.202 ch202 10.12.110.203 ch203 2. 搭建一个zookeeper集群 在这三个节点搭建一个zo ...