时隔一个月 小李又上线了!拖延症晚期实锤了。
原本教资考完要更 结果考完心态不是很好 所以拖了…上礼拜要更 结果头摔破了 所以又拖到了这周…三月是没有断更了,但过得太艰难了,希望接下来都顺利!
今天就记录一下在图像处理中形态学的几个操作。
图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。
膨胀类似“领域扩张”,将图像的高亮区域或白色部分扩张,运行结果图比原图的高亮区域更大;
腐蚀类似“领域被蚕食”,将图像的高亮区域或白色部分缩减细化,运行结果图比原图的高亮区域更小。
1.图像膨胀
公式:
膨胀原理:求局部最大值;
①定义一个卷积核B,
核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
②将核B与图像A进行卷积,计算核B覆盖区域的像素点最大值;
③将这个最大值赋值给参考点指定的像素;
因此,图像中的高亮区域逐渐增长。也可理解为把图像变胖
二值化图,只有0和255,所以小区域内有一个是局部最大像素点就为255:
2.图像腐蚀
公式:
腐蚀:局部最小值(与膨胀相反);
①定义一个卷积核B,
核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
②将核B与图像A进行卷积,计算核B覆盖区域的像素点最小值;
③将这个最小值赋值给参考点指定的像素;
因此,图像中的高亮区域逐渐减小。也可理解为图像变瘦。
二值化图,只有0和255,所以小区域内有一个是0该像素点就为0:
对比效果(膨胀VS腐蚀)
3.图像开/闭运算
开运算和闭运算就是将腐蚀和膨胀按照一定的次序进行处理。但这两者并不是可逆的,即先开后闭并不能得到原先的图像。
开运算:先腐蚀后膨胀
作用:分离物体,消除小区域,常用于去除噪声
闭运算:先膨胀后腐蚀
作用:常用于填充前景物体中的小洞,或者前景物体上的小黑点.
代码
"""
腐蚀
cv2.erode(src, # 输入图像
kernel, # 卷积核
dst=None,
anchor=None,
iterations=None, # 迭代次数,默认1
borderType=None,
borderValue=None)
膨胀
cv2.dilate(src, # 输入图像
kernel, # 卷积核
dst=None,
anchor=None,
iterations=None, # 迭代次数,默认1
borderType=None,
borderValue=None)
"""
import cv2
import numpy as np
original_img = cv2.imread('F:/image/8.jpg')
res = cv2.resize(original_img,None,fx=0.6, fy=0.6,
interpolation = cv2.INTER_CUBIC) #图形太大了缩小一点
B, G, R = cv2.split(res) #获取红色通道
img = R
_,RedThresh = cv2.threshold(img,160,255,cv2.THRESH_BINARY)
#OpenCV定义的结构矩形元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
eroded = cv2.erode(RedThresh,kernel) #腐蚀图像
dilated = cv2.dilate(RedThresh,kernel) #膨胀图像
cv2.imshow("original_img", res) #原图像
cv2.imshow("Eroded Image",eroded) #显示腐蚀后的图像
cv2.imshow("Dilated Image",dilated) #显示膨胀后的图像
#NumPy定义的结构元素
NpKernel = np.uint8(np.ones((3,3)))
Nperoded = cv2.erode(RedThresh,NpKernel) #腐蚀图像
cv2.imshow("Eroded by NumPy kernel",Nperoded) #显示腐蚀后的图像
cv2.waitKey(0)
cv2.destroyAllWindows()
original_img = cv2.imread('F:/image/8.jpg',0)
gray_res = cv2.resize(original_img,None,fx=0.8,fy=0.8,
interpolation = cv2.INTER_CUBIC) #图形太大了缩小一点
# B, G, img = cv2.split(res)
# _,RedThresh = cv2.threshold(img,160,255,cv2.THRESH_BINARY) #设定红色通道阈值160(阈值影响开闭运算效果)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)) #定义矩形结构元素
closed1 = cv2.morphologyEx(gray_res, cv2.MORPH_CLOSE, kernel,iterations=1) #闭运算1
closed2 = cv2.morphologyEx(gray_res, cv2.MORPH_CLOSE, kernel,iterations=3) #闭运算2
opened1 = cv2.morphologyEx(gray_res, cv2.MORPH_OPEN, kernel,iterations=1) #开运算1
opened2 = cv2.morphologyEx(gray_res, cv2.MORPH_OPEN, kernel,iterations=3) #开运算2
gradient = cv2.morphologyEx(gray_res, cv2.MORPH_GRADIENT, kernel) #梯度
#显示如下腐蚀后的图像
cv2.imshow("Close1",closed1)
cv2.imshow("Close2",closed2)
cv2.imshow("Open1", opened1)
cv2.imshow("Open2", opened2)
cv2.waitKey(0)
cv2.destroyAllWindows()
END 三月顺利鸭~
参考(https://www.jianshu.com/p/05ef50ac89ac)
(https://blog.csdn.net/wsp_1138886114/article/details/82917661)
(https://www.aiuai.cn/aifarm350.html)
网友评论