本文分享内容来自图书《学习OpenCV 4:基于Python的算法实战》,该书内容如下:
第1章 OpenCV快速入门;第2章 图像读写模块imgcodecs;第3章 核心库模块core;第4章 图像处理模块imgproc(一);第5章 图像处理模块imgproc(二);第6章 可视化模块highgui;第7章 视频处理模块videoio;第8章 视频分析模块video;第9章 照片处理模块photo;第10章 2D特征模块features2d;第11章 相机标定与三维重建模块calib3d;第12章 传统目标检测模块objdetect;第13章 机器学习模块ml;第14章 深度神经网络模块dnn
欢迎关注图书《深度学习计算机视觉实战》与《学习OpenCV4:基于Python的算法实战》,欢迎加入QQ群:187042448案例36:腐蚀
腐蚀运算计算核覆盖范围内的局部最小值,OpenCV中提供的腐蚀运算的函数erode,该函数的定义如下:
dst = erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
参数说明如下:
src,输入图像;
kernel,用于腐蚀运算的核结构;
dst,输出图像(返回值);
anchor,瞄点位置,默认是kernel对应区域的中心位置;
iterations,应用腐蚀操作迭代的次数;
borderType,边界模式,由BorderTypes定义(见3.4.5节);
borderValue,当边界模式为BORDER_CONSTANT时的边界像素值。
本案例使用的输入图像如图4.9所示。
图4.9
腐蚀运算的案例代码如下所示:
import cv2#读取图像src = cv2.imread("cvbook.jpg")#定义3×3的腐蚀运算矩形核结构element = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))# 腐蚀运算erode_img = cv2.erode(src, element)#图像显示cv2.imshow("erode_img", erode_img)cv2.waitKey(0)cv2.destroyAllWindows()
为了使效果更加明显,选用了3×3的腐蚀运算核结构,腐蚀运算的结果如图4.10所示。
图4.10
腐蚀运算选取核结构中的最小像素值作为瞄点处的像素值,因此对于图4.9中的文字,经过腐蚀运算会让黑色文字区域变大,因此文字会变粗。
与腐蚀相反,膨胀运算计算的是核覆盖范围内的局部最大值,OpenCV中提供的膨胀运算的函数dilate,该函数的定义如下:
dst = dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
参数说明如下:
src,输入图像;
kernel,用于膨胀运算的核结构;
dst,输出图像(返回值);
anchor,瞄点位置,默认是kernel对应区域的中心位置;
iterations,应用膨胀操作迭代的次数;
borderType,边界模式,由BorderTypes定义(见3.4.5节);
borderValue,当边界模式为BORDER_CONSTANT时的边界像素值。
本案例使用的输入图像如图4.9所示,膨胀运算的案例代码如下所示:
import cv2#读取图像src = cv2.imread("logo.jpg")#定义3×3的膨胀运算矩形结构element = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))# 膨胀运算dilate_img = cv2.dilate(src, element)#图像显示cv2.imshow("dilate_img", dilate_img)cv2.waitKey(0)cv2.destroyAllWindows()
膨胀运算的结果如图4.11所示。
图4.11
膨胀运算选取核结构中的最大像素值作为瞄点处的像素值,因此对于图4.9中的文字,经过膨胀运算黑色的文字区域变小,因此文字会变细,下面的较小的文字则几乎被磨灭。
对比两种运算可以发现,膨胀运算会使明亮区域扩张,腐蚀运算会使阴暗区域扩张,因此膨胀可以用于填充凹面,腐蚀可以用于消除突起。
OpenCV中提供了形态学运算的函数morphologyEx,函数定义如下:
dst = morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
参数说明如下:
src,输入图像;
op,形态学运算类型,由MorphTypes定义(见4.1节);
kernel,用于形态学运算的核结构;
dst,输出图像(返回值);
anchor,瞄点位置,默认是kernel对应区域的中心位置;
iterations,应用形态学操作迭代的次数;
borderType,边界模式,由BorderTypes定义(见3.4.5节);
borderValue,当边界模式为BORDER_CONSTANT时的边界像素值。
几种形态学运算的计算方法与用途如表4.1所示。
表4.1
本案例使用的输入图像为图4.9,腐蚀和膨胀操作在前面两节做了介绍,本节就不做赘述,其他的形态学运算的案例代码如下:
import cv2#图像读取src = cv2.imread("cvbook.jpg")#获取形态学运算结构element = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))#开运算open_img = cv2.morphologyEx(src, cv2.MORPH_OPEN, element)#如图4.12cv2.imshow("open_img", open_img)#闭运算close_img = cv2.morphologyEx(src, cv2.MORPH_CLOSE, element)#如图4.13cv2.imshow("close_img", close_img)#形态学梯度运算grad_img = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, element)#如图4.14cv2.imshow("grad_img", grad_img)#顶帽运算tophat_img = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, element)#如图4.15cv2.imshow("tophat_img", tophat_img)#底帽运算blackhat_img = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, element)#如图4.16cv2.imshow("blackhat_img", blackhat_img)cv2.waitKey(0)cv2.destroyAllWindows()
执行后的结果如图4.12~4.16所示.
开运算的计算方法为先腐蚀后膨胀,执行结果如图4.12所示。
图4.12
闭运算的计算方法为先膨胀后腐蚀,执行结果如图4.13所示。
图4.13
形态学梯度运算的计算方法为膨胀结果减去腐蚀结果,执行结果如图4.14所示。
图4.14
顶帽运算的计算方法为原始图像减去开运算的结果,执行结果如图4.15所示。
图4.15
底帽运算的计算方法为闭运算减去原始图像的结果,执行结果如图4.16所示。
图4.16