1.图像平滑
图像平滑是一项简单且使用频率很高的图像处理方法,可以用来压制、弱化或消除图像中的细节、突变、边缘和噪声,最常见的是用来减少图像上的噪声。
常用的滤波器主要为:
均值滤波器:并不能完全消除噪声,只能相对消除噪声。
中值滤波器:主要用于椒盐噪声,效果会好点。
高斯滤波器:进行平滑的同时,保持更好的分布。
img = cv2.imread('lenaNoise.png')#这个是一个有噪声的图片
# cv_show('img',img)
#均值滤波
#简单的平均卷积操作
blur = cv2.blur(img,(3,3))
# 方框滤波
# 基本和均值一样,可以选择归一化
box = cv2.boxFilter(img,-1,(3,3), normalize=True)
# 方框滤波
# 基本和均值一样,可以选择归一化,容易越界
box = cv2.boxFilter(img,-1,(3,3), normalize=False)
# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img, (5, 5), 1)#X方向方差主要控制权重。
# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img, 5) # 中值滤波
# 展示所有的
res = np.hstack((img,blur,aussian,median))
cv_show('res',res)
该结果从左到到右分别为原图、均值、方框、高斯滤波的三种比较方式。
2.形态学操作
腐蚀和膨胀都是对图片中白色的部分操作,腐蚀会使得白色部分变小,膨胀
2.1腐蚀操作
img = cv2.imread('./dige.png')
cv_show('img',img)
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations=1)
res = np.hstack((img,erosion))
cv_show('res',res)
# cv_show('pie',pie)
kernel = np.ones((30,30),np.uint8)
erosion1 = cv2.erode(img,kernel,iterations=1)
erosion2 = cv2.erode(img,kernel,iterations=2)
erosion3 = cv2.erode(img,kernel,iterations=3)
res = np.hstack((erosion1,erosion2,erosion3))
cv_show('res',res)
img = cv2.imread('./dige.png')
cv_show('img',img)
kernel = np.ones((3,3),np.uint8)
dige_erosion = cv2.dilate(img,kernel,iterations = 1)
res = np.hstack((img,dige_erosion))
cv_show('res',res)
2.2 膨胀效果
增加白色区域的效果
pie= cv2.imread('./pie.png')
cv_show('pie',pie)
kernel = np.ones((30,30),np.uint8)
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv_show('res',res)
图中分别是迭代1次、2次、3次的效果。
2.3开运算和闭运算
开运算主要过程:先经历腐蚀后经过膨胀,消除黑色中白色的点。
闭运算主要过程:先经历膨胀后经过腐蚀,消除白色中黑色的点。
# 开:先腐蚀,再膨胀
img = cv2.imread('dige.png')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
res = np.hstack((img,opening,closing))
cv_show('res',res)
左边是原图。
中间为开运算,消除黑色中白色的点。所以旁边的chichi消失了。
右边为闭运算,消除白色中黑色的点。因为没有所以基本没有变化。
2.4梯度运算
一张图片分别做膨胀与腐蚀操作,最后用膨胀后的图片减去腐蚀的图片,得到的新图片便是该图片的梯度运算。
即:梯度运算 (img) = 膨胀 (img) - 腐蚀 (img)
通过梯度运算可以得到前景物体的轮廓。
pie = cv2.imread('./pie.png')
kernel = np.ones((7,7),np.uint8)
dilate = cv2.dilate(pie,kernel,iterations=5)
erode = cv2.dilate(pie,kernel,iterations=5)
res = np.hstack((pie,dilate,erode))
cv_show('res',res )
#梯度计算
gradient = cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)
cv_show('gradient',gradient)
可以得出腐蚀和膨胀后的两者效果并不大
改图为梯度计算的错的前景物体轮廓。
2.5礼帽和黑帽
礼帽运算用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
img = cv2.imread('./dige.png')
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
res = np.hstack((tophat,blackhat))
cv_show('res',res)
左边为礼帽,右边为黑帽。tophat和blackhat的区别。