【学习OpenCV4】OpenCV形态学运算总结

本文分享内容来自图书《学习OpenCV 4:基于Python的算法实战》,该书内容如下:

1章 OpenCV快速入门;
第2章 图像读写模块imgcodecs;
第3章 核心库模块core;
第4章 图像处理模块imgproc(一);
第5章 图像处理模块imgproc(二);
第6章 可视化模块highgui;
第7章 视频处理模块videoio;
第8章 视频分析模块video;
第9章 照片处理模块photo;
第102D特征模块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所示。
【学习OpenCV4】OpenCV形态学运算总结_第1张图片

图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所示。
【学习OpenCV4】OpenCV形态学运算总结_第2张图片
图4.10
腐蚀运算选取核结构中的最小像素值作为瞄点处的像素值,因此对于图4.9中的文字,经过腐蚀运算会让黑色文字区域变大,因此文字会变粗。

案例37:膨胀

与腐蚀相反,膨胀运算计算的是核覆盖范围内的局部最大值,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所示。
【学习OpenCV4】OpenCV形态学运算总结_第3张图片

图4.11
膨胀运算选取核结构中的最大像素值作为瞄点处的像素值,因此对于图4.9中的文字,经过膨胀运算黑色的文字区域变小,因此文字会变细,下面的较小的文字则几乎被磨灭。
对比两种运算可以发现,膨胀运算会使明亮区域扩张,腐蚀运算会使阴暗区域扩张,因此膨胀可以用于填充凹面,腐蚀可以用于消除突起。

案例38:其他形态学运算

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
【学习OpenCV4】OpenCV形态学运算总结_第4张图片

本案例使用的输入图像为图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所示。
【学习OpenCV4】OpenCV形态学运算总结_第5张图片
图4.12
闭运算的计算方法为先膨胀后腐蚀,执行结果如图4.13所示。
【学习OpenCV4】OpenCV形态学运算总结_第6张图片
图4.13
形态学梯度运算的计算方法为膨胀结果减去腐蚀结果,执行结果如图4.14所示。
【学习OpenCV4】OpenCV形态学运算总结_第7张图片
图4.14
顶帽运算的计算方法为原始图像减去开运算的结果,执行结果如图4.15所示。
【学习OpenCV4】OpenCV形态学运算总结_第8张图片
图4.15
底帽运算的计算方法为闭运算减去原始图像的结果,执行结果如图4.16所示。
【学习OpenCV4】OpenCV形态学运算总结_第9张图片
图4.16

你可能感兴趣的:(学习OpenCV,4:基于Python的算法实战,opencv,计算机视觉,python,图像处理,算法)