Opencv|OpenCV——图像形态学操作

图像形态学腐蚀可以将细小的噪声区域去除,但是会将图像主要区域的面积缩小,造成主要区域的形状发生改变;图像形态学膨胀可以扩充每一个区域的面积,填充较小的空洞,但是同样会增加噪声的面积。根据两者的特性将图像腐蚀和膨胀适当的结合,便可以既去除图像中的噪声,又不缩小图像中主要区域的面积;既填充了较小的空洞,又不增加噪声所占的面积。
开运算
图像开运算可以去除图像中的噪声,消除较小连通域,保留较大连通域,同时能够在两个物体纤细的连接处将两个物体分离,并且在不明显改变较大连通域的面积的同时能够平滑连通域的边界。开运算是图像腐蚀和膨胀操作的结合,首先对图像进行腐蚀,消除图像中的噪声和较小的连通域,之后通过膨胀运算弥补较大连通域因腐蚀而造成的面积减小。图6-22给出了图像开运算的三个阶段,图6-22中左侧图像是待开运算的原图像,中间的图像是利用3×3矩形结构元素对原图像进行腐蚀后的图像,通过结果可以看到较小的连通域已经被去除,但是较大的连通域也在边界区域产生了较大的面积缩减,之后对腐蚀后的图像进行膨胀运算,得到图中右侧图像。通过结果可以看出,膨胀运算弥补了腐蚀运算造成的边界面积缩减,使得开运算的结果只去除了较小的连通域,保留了较大的连通域。
Opencv|OpenCV——图像形态学操作
文章图片

闭运算
图像闭运算可以去除连通域内的小型空洞,平滑物体轮廓,连接两个临近的连通域。闭运算是图像膨胀和腐蚀操作的结合,首先对图像进行膨胀,填充连通域内的小型空洞,扩大连通域的边界,将临近的两个连通域连接,之后通过腐蚀运算减少由膨胀运算引起的连通域边界的扩大以及面积的增加。图6-23给出了图像闭运算的三个阶段,图6-23中左侧图像是待闭运算的原图像,中间的图像是利用3×3矩形结构元素对原图像进行膨胀后的图像,通过结果可以看到较大连通域内的小型空洞已经被填充,同时临近的两个连通域也连接了在一起,但是连通域的边界明显扩张,整体的面积增加,之后对膨胀后的图像进行腐蚀运算,得到图中右侧图像。通过结果可以看出,腐蚀运算能够消除连通域因膨胀运算带来的面积增长,但是图像中依然存在较大的面积增长,主要是因为连通域膨胀后,有较大区域在图像的边缘区域,而图像边缘区域的形态学操作结果与图像的边缘外推方法有着密切的关系,因此采用默认外推方法时,边缘的连通域不会被腐蚀掉,从而产生图6-23右侧的结果。
Opencv|OpenCV——图像形态学操作
文章图片

形态学梯度
形态学梯度能够描述目标的边界,根据图像腐蚀和膨胀与原图之间的关系计算得到,形态学梯度可以分为基本梯度、内部梯度和外部梯度。基本梯度是原图像膨胀后图像和腐蚀后图像间的差值图像,内部梯度图像是原图像和腐蚀后图像间的差值图像,外部梯度是膨胀后图像和原图像间的差值图像。图给出了计算形态学基本梯度的三个阶段,图中左侧图像是原图像利用3×3矩形结构元素进行膨胀后的图像,中间的图像是原图像利用3×3矩形结构元素进行腐蚀后的图像,右侧图像是左侧图像和中间图像的差值。
Opencv|OpenCV——图像形态学操作
文章图片

顶帽运算
【Opencv|OpenCV——图像形态学操作】图像顶帽运算是原图像与开运算结果之间的差值,往往用来分离比邻近点亮一些的斑块,因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域。顶帽运算先对图像进行开运算,之后从原图像中减去开运算计算的结果,在图中给出了计算顶帽运算的三个阶段,图中左侧图像是原图像,中间的图像是利用3×3矩形结构元素对原图像进行开运算后的图像,右侧图像是左侧原与中间开运算结果图像之间的差值,即为原图像顶帽运算的结果。
Opencv|OpenCV——图像形态学操作
文章图片

黑帽运算
图像黑帽运算是与图像顶帽运算相对应的形态学操作,与顶帽运算相反,黑帽运算是原图像与闭运算结果之间的差值,往往用来分离比邻近点暗一些的斑块。
Opencv|OpenCV——图像形态学操作
文章图片

击中击不中变换
击中击不中变换是比图像腐蚀要求更加苛刻的一种形态学操作,图像腐蚀只需要图像能够将结构元素中所有非0元素包含即可,但是击中击不中变换要求原图像中需要存在与结构元素一模一样的结构,即结构元素中非0元素也需要同时被考虑。如图中所示,如果用中间的结构元素对左侧图像进行腐蚀,那么将会得到图6-24中所示的腐蚀计算结果,而用中间结构元素对左侧图像进行击中击不中变换结果为图右侧所示,因为结构元素的中心位置为0,而在原图像中符合这种结构的位置只在图像中的中心处,因此击中击不中变换的结果与图像腐蚀结果具有极大的差异。但是在使用矩形结构元素时,击中击不中变换与图像的腐蚀结果相同。
Opencv|OpenCV——图像形态学操作
文章图片

形态学函数

void morphologyEx( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = https://www.it610.com/article/morphologyDefaultBorderValue() );

  • src:输入图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
  • dst:形态学操作后的输出图像,与输入图像具有相同的尺寸和数据类型。
  • op:形态学操作类型的标志,可以选择的标志及含义在表6-6中给出。
  • kernel:结构元素,可以自己生成,也可以用getStructuringElement()函数生成。
  • anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点
  • iterations:处理的次数
  • borderType:像素外推法选择标志,取值范围在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
  • borderValue:使用边界不变外推法时的边界值。
该函数根据结构元素对输入图像进行多种形态学操作,在处理多通道图像时每个通道独立进行处理。
函数的第一个参数为待形态学处理的图像,图像通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
函数第二个参数为形态学处理后的输出图像,与输入图像具有相同的尺寸和数据类型。
函数第三个参数是形态学操作类型的选择标志,可以选择的形态学操作类型有开运算、闭运算、形态学梯度、顶帽运算、黑帽运算以及击中击不中变换,详细的参数在表6-6给出。
函数第四个和第五个参数都是与结构元素相关的参数,第四个参数为结构元素,使用的结构元素尺寸越大效果越明显,第四个参数为结构元素的中心位置,第五个参数的默认值为Point(-1,-1),表示结构元素的几何中心处为结构元素的中心点。
函数第六个参数是使用结构元素处理的次数,处理次数越多效果越明显。
函数第七个参数是图像像素外推法的选择标志,
第八个参数为使用边界不变外推法时的边界值,这两个参数对图像中主要部分的形态学操作没有影响,因此在多数情况下使用默认值即可。
Opencv|OpenCV——图像形态学操作
文章图片

简单示例
// // Created by smallflyfly on 2021/6/21. //#include "opencv2/opencv.hpp"#include using namespace std; using namespace cv; int main() { Mat im = imread("test.jpg", IMREAD_GRAYSCALE); resize(im, im, Size(0, 0), 0.5, 0.5); imshow("im", im); Mat imBin; threshold(im, imBin, 125, 255, THRESH_BINARY); imshow("imBin", imBin); Mat m = getStructuringElement(0, Size(3, 3)); // 开 闭 梯度 顶帽黑帽击不击中运算 Mat open, close, gradient, tophat, blackhat, hitmiss; morphologyEx(imBin, open, MORPH_OPEN, m, Point(-1, -1), 3); imshow("open", open); morphologyEx(imBin, close, MORPH_CLOSE, m, Point(-1, -1), 3); imshow("close", close); morphologyEx(imBin, gradient, MORPH_GRADIENT, m, Point(-1, -1), 3); imshow("gradient", gradient); morphologyEx(imBin, tophat, MORPH_TOPHAT, m, Point(-1, -1), 3); imshow("topHat", tophat); morphologyEx(imBin, blackhat, MORPH_BLACKHAT, m, Point(-1, -1), 3); imshow("blackHat", blackhat); morphologyEx(imBin, hitmiss, MORPH_HITMISS, m, Point(-1, -1), 3); imshow("hitmiss", hitmiss); waitKey(0); destroyAllWindows(); return 0; }

Opencv|OpenCV——图像形态学操作
文章图片

    推荐阅读