cv2.morphologyEx:三个对应的参数
目的:消除噪声、分割出独立的图像元素、在图像中连接相邻的元素、寻找出图像中的明显的极大值区域或者极小值区域、寻找图像的梯度
同样膨胀也是这个目的!下面是腐蚀的原理!
腐蚀就是求图像区域最小值的操作。将图像(图像的一部分区域)与核进行卷积 核可以是任意形状和大小,可以自己定义,或者称为锚点 核与图像进行卷积,就是计算核覆盖的区域的像素点的最大值(最小值),分别对应膨胀和腐蚀 腐蚀和膨胀是一对好朋友,是相反的一对操作, 腐蚀就是求局部最小值的操作 ,而膨胀是求局部最大值的操作。
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('../image/caicai.jpg')
# cv2.imshow('img',img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
"""
1、腐蚀和膨胀
将图像(图像的一部分区域)与核进行卷积
核可以是任意形状和大小,可以自己定义,或者称为锚点
核与图像进行卷积,就是计算核覆盖的区域的像素点的最大值(最小值),分别对应膨胀和腐蚀
腐蚀和膨胀是一对好朋友,是相反的一对操作
腐蚀就是求局部最小值的操作
而膨胀是求局部最大值的操作
"""
kernel = np.ones((5,5),np.uint8)
print(kernel,kernel.shape)
erosion = cv2.erode(img,kernel,iterations=1)
# cv2.imshow('erosion',erosion)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
pie = cv2.imread('../image/caicai.jpg')
cv2.imshow('pie',pie)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
kernel2 = np.ones((30,30),np.uint8)
erosion_1 = cv2.erode(pie,kernel2,iterations=1)
erosion_2 = cv2.erode(pie,kernel2,iterations=2)
erosion_3 = cv2.erode(pie,kernel2,iterations=3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图:后面的图像都是基于这张图片!!!
显示出1,2,3次迭代后的图像
就是求图像区域的最大值操作,将图像的区域与卷积核进行卷积操作,这个核的大小我们自己可以自己设置,计算核覆盖的区域的像素点的最大值,然后把最大值赋给参考点指定的像素,会使得图像的高亮区域变得更明显!也就是本来很优秀,变得更优秀了呢?你说气不气人!!!这就是膨胀!下面是原理图!
import cv2
import numpy as np
"""
膨胀操作
核与图像区域进行卷积,然后求局部最大值
效果就是线条变得更加粗糙
"""
img = cv2.imread('../image/caicai.jpg')
# cv2.imshow('img',img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
kernel = np.ones((3,3),np.uint8)
dilate = cv2.dilate(img,kernel,iterations=1)
res = np.hstack((img,dilate))
# cv2.imshow('res',res)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
#线条变得更粗糙了
kernel2 = np.ones((4,4),np.uint8)
dilate_1 = cv2.dilate(img,kernel2,iterations=1)
dilate_2 = cv2.dilate(img,kernel2,iterations=2)
dilate_3 = cv2.dilate(img,kernel2,iterations=3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
上面分别分别代表膨胀迭代次数为1,2,3的结果
就是先执行腐蚀操作后,再进行膨胀!
import cv2
import numpy as np
"""
开运算:
先腐蚀后膨胀
"""
img = cv2.imread('../image/caicai.jpg')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv2.imshow('opening',opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
先膨胀后腐蚀操作
import cv2
import numpy as np
"""
闭操作
先膨胀,再腐蚀
"""
img = cv2.imread('../image/caicai.jpg')
close = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel=(5,5))
cv2.imshow('close',close)
cv2.waitKey(0)
cv2.destroyAllWindows()
梯度运算:膨胀 — 腐蚀
先对图像做膨胀操作,再做腐蚀操作,然后膨胀减去腐蚀即可得到梯度运算!
import cv2
import numpy as np
"""
梯度:膨胀-腐蚀
"""
img = cv2.imread('../image/smiledog.jpg')
kernel = np.ones((7,7),np.uint8)
dilate = cv2.dilate(img,kernel,iterations=5)
ersion = cv2.erode(img,kernel,iterations=5)
res = np.hstack((img,dilate,ersion))
# cv2.imshow('res',res)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
gradient = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('gradient',gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
顶帽:原始输入 — 开运算结果,然后得到的是图像的噪声!
顶帽运算(img) = 原始图像(img) - 开运算(img)
黑帽:闭运算 — 原始输入,得到图像内部的小孔,或者前景色中的小黑点
黑帽运算(img) = 闭运算图像(img) - 原始图像(img)
import cv2
import numpy as np
"""
顶帽=原始输入-开运算结果(先腐蚀后膨胀,细节就被腐蚀没了,然后再膨胀)
黑帽=闭运算(先膨胀细节就被扩大,然后再腐蚀)-原始输入(原图像的内容)
"""
#顶帽
img = cv2.imread('../image/smiledog.jpg')
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel=(3,3))
# cv2.imshow('tophat',tophat)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
#黑帽
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel=(7,7))
# cv2.imshow('blackhat',blackhat)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
res = np.hstack((tophat,blackhat))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果换了条狗,结果更加明显点!
具体的细节可能没讲到,大家可以自行度娘!