本文分享内容来自图书《学习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
腐蚀运算计算核覆盖范围内的局部最小值,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.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.12
cv2.imshow("open_img", open_img)
#闭运算
close_img = cv2.morphologyEx(src, cv2.MORPH_CLOSE, element)
#如图4.13
cv2.imshow("close_img", close_img)
#形态学梯度运算
grad_img = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, element)
#如图4.14
cv2.imshow("grad_img", grad_img)
#顶帽运算
tophat_img = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, element)
#如图4.15
cv2.imshow("tophat_img", tophat_img)
#底帽运算
blackhat_img = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, element)
#如图4.16
cv2.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