一 图像阈值处理

准备一张灰度图像

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

在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. ACM-ICPC 比赛环境的使用

    ACM-ICPC 现场赛不同的赛站可能比赛环境不同,不过一般都是 Ubuntu 系统.附带的软件可能略有不同,可能会有使用习惯的差异导致效率下降或者无法运行代码,但是在终端下编译运行代码都是相同的.本 ...

  2. Rust <6>:闭包

    单线程环境: 从宿主环境中捕获的变量,是引用,会改变原有的值,与 golang 的闭包行为一样: 以参数形式传入的变量,默认会发生 move:而 golang 的闭包参数,是宿主环境的副本,相当于在 ...

  3. centos7 编译打包bcache-tools

    centos7 build bcache-tools 获取源码 centos 本身不提供bcache-tools的rpm,所以需要自己build. 从fedora下载源码,也可以从github社区下载 ...

  4. MFC 模块状态的实现

    本技术备忘录介绍MFC “模块状态”结构的实现.充分理解模块状态这个概念对于在DLL中使用MFC的共享动态库是十分重要的. MFC的状态信息分为三种:全局模块状态数据.进程局部状态数据和线程局部状态数 ...

  5. 如何在vue框架中兼容IE

    IE目前已经放弃了自己的独特化,正一步步迎入互联网的主流怀抱.但迫于有用户存在,还是要兼容到IE8,9, 以上. 下面聊一下如何在vue框架中兼容IE 1.首先在index.html <meta ...

  6. React 16.4 生命周期

    补一下 React 16.4版本的生命周期图

  7. 处理CSS前缀问题的神器——AutoPrefixer

    众所周知为兼容所有浏览器,有的CSS属性需要对不同的浏览器加上前缀,然而有时添加一条属性,需要添加3~4条类似的属性只是为了满足浏览器的兼容,这不仅会增加许多的工作量. What is AutoPre ...

  8. element ui step组件在另一侧加时间轴显示

    这是我开发的时候遇到的一个问题:项目需要在步骤条(竖直方向)的另一侧加时间显示,但是我在element ui 的step组件中一直没找着设置方法,所以就自己想了个办法加进来,效果如下: 代码如下,先上 ...

  9. 浅析php-fpm和fastcgi的关系

    先讲讲CGI吧 浏览器向web server发起请求的时候,要有url,header,params等等吧,为什么有这些数据呢,这就是CGI的事了,CGI就规定了,传哪些数据,用什么样的格式传输 web ...

  10. leetcode-13双周赛-1257-最小公共区域

    题目描述: 方法: class Solution(object): def findSmallestRegion(self, regions, region1, region2): parent = ...