一、形态学
1、形态学概述
形态学时基于图像形态进行处理的一些基本方法,这些处理方法基本是对二进制图像进行处理,卷积核决定着图像处理后的效果。
其中形态学图像处理的方法有:腐蚀与膨胀(基础重点);开运算;闭运算;顶帽;黑帽。
2、图像二值化
将图像的每个像素变成两种值,如0,255;
二值化分为全局二值化和局部二值化;
(1)全局二值化API:threshold(img, thresh, maxVal, type)
img最好是灰度图;
thresh阈值,高于阈值变最大值,低于变0;
maxVal最大值,
type包括几种类型,详细看手册;
import cv2
import numpy as np
img = cv2.imread("F:\\tupian\\chinacar.jpeg")
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,dst = cv2.threshold(img1, 180, 255, cv2.THRESH_BINARY)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
其中thresholdType的几种类型都要学习一下:
(2)自适应阈值(区域二值化)
由于光照不均匀以及阴影的存在,只有一个阈值会使得在阴影处的白色被二值化成黑色;
adaptiThreshold(img, maxVal, adaptiveMethod, type, blockSize,C)
adaptiveMethod计算阈值的方法,自己得到阈值,一般选择高斯
Type只有两个是threshold前两个;
blockSize邻近区域的大小,
C常量,从计算出的平均值或加权平均值中减去,一般为0
import cv2
import numpy as np
img = cv2.imread('F:\\tupian\\123.png')
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = cv2.adaptiveThreshold(img1, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, C=0)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
3、腐蚀
卷积核只有在全为白色区域输出才为白色,一般情况其卷积核为全1,
API:erode(img, kernel, iterations=1)
iterations执行腐蚀的次数;
import cv2
import numpy as np
img = cv2.imread("F:\\tupian\\j.png")
kernel = np.ones((5,5),np.uint8)
dst = cv2.erode(img, kernel, iterations=1)
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
4、卷积核的类型和获取
(1)getStructuringElement( type, size)
卷积核的获取,其中size是卷积核的大小(?、?)
第一种是全1是我们使用最多的;
第二种是椭圆类型,
第三种是十字型
5、膨胀
API : dilate(img, kernel , iteration=1)
import cv2
import numpy as np
img = cv2.imread("F:\\tupian\\j.png")
# kernel = np.ones((5,5),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
print (kernel)
dst = cv2.erode(img, kernel, iterations=1)
dst1 = cv2.dilate(dst , kernel, 1)
cv2.imshow('img',img)
cv2.imshow('dst',dst1)
cv2.waitKey(0)
cv2.destroyAllWindows()
6、开运算
开运算= 腐蚀 + 膨胀(先腐蚀后膨胀)
API:morphologyEx(img, MORPH_OPEN, kernel)
import cv2
import numpy as np
img = cv2.imread("F:\\tupian\\tophat.png")
# kernel = np.ones((5,5),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50,50))
# print (kernel)
# dst = cv2.erode(img, kernel, iterations=1)
# dst1 = cv2.dilate(dst , kernel, 1)
dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
7、闭运算
闭运算 = 膨胀 + 腐蚀(先膨胀后腐蚀)
开运算和闭运算一个消除目标物体外噪点,一个消除目标物体内的噪点。
API:morphologyEx(img, MORPH_CLOSE, kernel)
import cv2
import numpy as np
img = cv2.imread("F:\\tupian\\dotinj.png")
# kernel = np.ones((5,5),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
# print (kernel)
# dst = cv2.erode(img, kernel, iterations=1)
# dst1 = cv2.dilate(dst , kernel, 1)
dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里的开运算和闭运算要注意是解决黑底白色物体。
8、形态学梯度运算
梯度 = 原图 - 腐蚀
API:morphologyEx(img, MORPH_GRADIENT, kernel)
import cv2
import numpy as np
img = cv2.imread("F:\\tupian\\j.png")
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
9、顶帽运算
顶帽 = 原图 - 开运算
API:morphologyEx(img, MORPH_TOPHAT, kernel)
import cv2
import numpy as np
img = cv2.imread("F:\\tupian\\tophat.png")
print (img.shape)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (19,19))
dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
10、黑帽运算
黑帽 = 原图 - 闭运算
顶帽只留目标物体以外的小噪点,黑帽只留目标物体以内的小噪点;
API:morphologyEx(img, MORPH_BLACKHAT, kernel)
import cv2
import numpy as np
img = cv2.imread("F:\\tupian\\dotinj.png")
print (img.shape)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))
dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()