opencv--形态学操作

开操作

  • 功能
    消除小物体;
    在纤细处分离物体;
    平滑较大的边界并不明显改变其面积;
  • 数学公式
    在这里插入图片描述

在这里插入图片描述

闭操作

  • 功能
    消除小型黑洞(黑斑)。
  • 数学公式
    在这里插入图片描述
    在这里插入图片描述

形态学梯度

  • 功能
    对二值图像进行这一操作可以将团块(blob)的边缘突出来。我们可以用形态学梯度来保留物体的边缘轮廓。
  • 数学公式
    在这里插入图片描述
    在这里插入图片描述

顶帽

  • 功能
    因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原型轮廓周围的区域更明亮的区域。且这一操作和选择的核的大小有关。

    顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的时候,可以用顶帽运算进行背景提取。

  • 数学公式
    为原图像与上文刚介绍的“开运算”的结果图之差,表达式如下:
    在这里插入图片描述
    在这里插入图片描述

黑帽

  • 功能
    黑帽(Black Hat)运算为”闭运算“的结果图与原图像之差。

    黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。
    所以,黑帽运算用来分离比邻近点暗一些的斑块。

  • 数学表达式:
    在这里插入图片描述
    在这里插入图片描述

相关API

  • 声明
    void morphologyEx( 
    		InputArray src, //
    		OutputArray dst,// 
    		int op,//形态学运算的类型
    		InputArraykernel, 
    		Pointanchor=Point(-1,-1), 
    		intiterations=1, 
    		intborderType=BORDER_CONSTANT, 
    		constScalar& borderValue=morphologyDefaultBorderValue() 
    ); 
    
  • 参数
  1. 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。

  2. 第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。

  3. int op:表示形态学运算的类型

    MORPH_OPEN – 开运算(Opening operation)
    MORPH_CLOSE – 闭运算(Closing operation)
    MORPH_GRADIENT -形态学梯度(Morphological gradient)
    MORPH_TOPHAT - “顶帽”(“Top hat”)
    MORPH_BLACKHAT - “黑帽”(“Black hat“)

  4. 第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。

在这里插入图片描述

Mat src,dst1, dst2,dst3,dst4,dst5,dst6,dst7;
int step_size = 3;
int max_size = 21;
void my_dilate(int ,void*) {
	int s = step_size * 2 + 1;
	Mat structingElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	dilate(src, dst1, structingElement);
	imshow("dilate", dst1);
	return;
}

void my_erode(int, void*) {
	int s = step_size * 2 + 1;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s));
	erode(src, dst2, kernel);
	imshow("erode", dst2);
	return;
}
void my_open(int, void*) {
	int s = step_size * 2 + 1;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s));
	morphologyEx(src, dst3, MORPH_OPEN, kernel);
	imshow("open", dst3);
}
void my_close(int, void*) {
	int s = step_size * 2 + 1;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s));
	morphologyEx(src, dst4, MORPH_CLOSE, kernel);
	imshow("close", dst4);
}
void my_gradient(int, void*) {
	int s = step_size * 2 + 1;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s));
	morphologyEx(src, dst5, MORPH_GRADIENT, kernel);
	imshow("gradient", dst5);
}
void my_tophat(int, void*) {
	int s = step_size * 2 + 1;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s));
	morphologyEx(src, dst6, MORPH_TOPHAT, kernel);
	imshow("tophat", dst6);
}
void my_blackhat(int, void*) {
	int s = step_size * 2 + 1;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s));
	morphologyEx(src, dst7, MORPH_BLACKHAT, kernel);
	imshow("blackhat", dst7);
}

int main() {
    src = imread("D:\\jing.png");
	if (src.empty()) {
		cerr << "open error" << endl;
		return -1;
	}
	imshow("cat", src);
	my_dilate(0, 0);
	my_erode(0, 0);
	my_open(0, 0);
	my_close(0, 0);
	my_gradient(0, 0);
	my_tophat(0, 0);
	my_blackhat(0, 0);
	createTrackbar("erode_size", "erode", &step_size, max_size, my_erode);
	createTrackbar("erode_size", "dilate", &step_size, max_size,my_dilate);
	createTrackbar("erode_size", "open", &step_size, max_size, my_open);
	createTrackbar("erode_size", "close", &step_size, max_size, my_close);
	createTrackbar("erode_size", "gradient", &step_size, max_size, my_gradient);
	createTrackbar("erode_size", "tophat", &step_size, max_size, my_tophat);
	createTrackbar("erode_size", "blackhat", &step_size, max_size, my_blackhat);
	waitKey(0);
}

原图:
在这里插入图片描述

  • dilate
    白点不断变大
    在这里插入图片描述
    在这里插入图片描述

  • erode
    白点逐渐变小
    在这里插入图片描述
    在这里插入图片描述

  • open
    消除小物体;
    在纤细处分离物体;
    平滑较大的边界并不明显改变其面积
    在这里插入图片描述
    在这里插入图片描述

  • close
    祛除小黑点
    在这里插入图片描述
    在这里插入图片描述

  • gradient
    使轮廓更加清晰
    在这里插入图片描述
    在这里插入图片描述

  • 顶帽

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  • 黑帽
    在这里插入图片描述
    在这里插入图片描述

好文章分享:
膨胀与腐蚀的彻底击破:https://www.cnblogs.com/daxiongblog/p/6289551.html
学习 opencv—(10)形态学图像处理(2):开运算,闭运算,形态学梯度,顶帽,黒帽合辑 https://www.cnblogs.com/wyuzl/p/6266498.html(NICE)

猜你喜欢

转载自blog.csdn.net/qq_41498261/article/details/84033812