OpenCV中的形态学
形态学概述
- 什么是形态学处理:
- 基于图像形态进行处理的一些基本方法
- 这些处理方法基本上是对二进制图像进行处理
- 卷积核决定这图像处理后的效果
- 基本方法:
- 腐蚀与膨胀
- 开运算
- 闭运算
- 顶帽
- 黑帽
图像二值化
- 将图像的每个像素变成两种值,如0,255
- 全局二值化:全局使用相同的阈值进行二值化
- 局部二值化:分成很多小块进行二值化
全局二值化
- threshold(img,thresh,maxVal,type)
- img:图像,最好是灰度图
- thresh:阈值
- maxVal:超过阈值,替换成maxVal
- thresholdType:
- THRESH_BINARY 和THRESH_BINARY _INV(加INV是将二值反过来输出)
- THRESH_TRUNC
- THRESH_TOZERO和THRESH_TOZERO_INV
#有两个返回值:执行结果ret及返回图像dst
ret,dst = cv2.threshold(img,180,255,cv2.THRESH_BINARY)
自适应阈值二值化
- 全局二值化弊端:由于光照不均匀以及阴影的存在,只有一个阈值会使得在阴影处的白色被二值化成黑色
- 使用自适应阈值二值化即可解决
- adaptiveThreshold(img,maxVal,adaptiveMethod,type,blockSize,C)
- adaptiveMethod:计算阈值的方法
- ADAPTIVE_THRESH_MEAN_C:计算临近区域的平均值
- ADAPTIVE_THRESH_GAUSSIAN_C:高斯窗口加权平均值
- type:
- THRESH_BINARY
- THRESH_BINARY _INV
- blockSize:临近区域的大小
- C:常量,应从计算出的平均值或加权平均值中减去
- adaptiveMethod:计算阈值的方法
dst =cv2.daptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,3,0)
腐蚀
- 会缩小一圈
- erode(img,kernel,iterations = 1)
- iterations腐蚀次数
kernel = np.ones((3,3),np.uint8)
dst = cv2.erode(img,kernel,iterations = 1)
获得形态学卷积核
- getStructuringElement(type,size)
- type:卷积核类型
- MORPH_RECT 矩形卷积核 全为1
- MORPH_ELLIPSE 椭圆形卷积核 内切圆(实心)为1
- MORPH_CROSS 十字架卷积核 过中心点的十字架为1
- size:一般情况下值为(3,3),(5,5),(7,7)…
- type:卷积核类型
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
- 卷积核大小与腐蚀与膨胀的效果密切相关!
膨胀
- dilate(img,kernel,iterations = 1)
- iterations膨胀次数
dst = cv2.dilate(img,kernel,iterations = 1)
开运算
- 开运算 = 腐蚀(先) + 膨胀(后)
- 能消除外部噪点
- morphlogogyEx(img,MORPH_OPEN,kernel)
- MORPH_OPEN:形态学的开运算
#可以先调用一次腐蚀操作,再调用一次膨胀操作实现
#也可以直接调用开运算API实现
dst = cv2.morphlogogyEx(img,cv2.MORPH_OPEN,kernel)
闭运算
-
闭运算 = 膨胀(先) + 腐蚀(后)
-
能消除内部噪点
-
morphlogogyEx(img,MORPH_CLOSE,kernel)
- MORPH_CLOSE:形态学的闭运算
dst = cv2.morphlogogyEx(img,cv2.MORPH_CLOSE,kernel)
形态学梯度
- 梯度 = 原图 - 腐蚀
- morphlogogyEx(img,MORPH_GRADIENT,kernel)
dst = cv2.morphlogogyEx(img,cv2.MORPH_GRADIENT,kernel)
- kernel越小,腐蚀程度越小,用原图减去后的白色边缘越清晰;f反之kernel越大,白色越壮实
顶帽运算
- 顶帽 = 原图 - 开运算
- 就剩下外部噪点了
- morphlogogyEx(img,MORPH_TOPHAT,kernel)
dst = cv2.morphlogogyEx(img,cv2.MORPH_TOPHAT,kernel)
黑帽操作
- 黑帽 = 原图 - 闭运算
- 就剩下内部噪点了
- morphlogogyEx(img,MORPH_BLACKHAT,kernel)
dst = cv2.morphlogogyEx(img,cv2.MORPH_BLACKHAT,kernel)