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)



















