<LearnOpenCV(9) C++>形态学操作(二)

形态学操作(一)

简单了解二值图像的复合形态学操作(还是用二值图像吧)

API

CV_EXPORTS_W 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 = morphologyDefaultBorderValue() );

  • src 输入图像
  • dst 输出图像
  • op 操作类型 MORPH_OPEN、 MORPH_CLOSE、 MORPH_TOPHAT等
  • kernel 遍历结构 (由前述getStructuringElement()获取)
  • anchor 核心
  • iterations 遍历次数等

开操作

先腐蚀后膨胀,应用得看前景和背景的具体情况,在前景白后景黑的时候可以用于去除小的影响。
<LearnOpenCV(9) C++>形态学操作(二)_第1张图片
但是反过来就是可以补漏洞
<LearnOpenCV(9) C++>形态学操作(二)_第2张图片

闭操作

先膨胀后腐蚀。同上,看具体情况
<LearnOpenCV(9) C++>形态学操作(二)_第3张图片

形态学梯度

膨胀减去腐蚀,就是基本梯度。

弱梯度位置(邻域低频,像素值变化不大)扩散高值与扩散低值差距不大,结果图像值偏小(黑色)。强梯度位置(邻域高频,像素值变化大),扩散高值与扩散低值差距大,结果图像偏大。

<LearnOpenCV(9) C++>形态学操作(二)_第4张图片

顶帽 tophat

原图减开操作

<LearnOpenCV(9) C++>形态学操作(二)_第5张图片

黑帽 blackhat

闭操作减原图

<LearnOpenCV(9) C++>形态学操作(二)_第6张图片

代码

#include 
#include 
using namespace std;
using namespace cv;
#define kernelSize 12
int main() {
	Mat src, dst_open, dst_close, dst_gradient, dst_tophat, dst_blackhat,dst_dilate,dst_erode;
	src = imread("3.jpg");

	if (!src.data)
	{
		printf("can not loading data!\n");
		return -1;
	}
	Mat kernel = getStructuringElement(MORPH_RECT, Size(kernelSize, kernelSize), Point(-1, -1));
	morphologyEx(src, dst_open, MORPH_OPEN, kernel);//开操作 MORPH_OPEN
	morphologyEx(src, dst_close, MORPH_CLOSE, kernel);
	dilate(src, dst_dilate, kernel);
	erode(src, dst_erode, kernel);
	dst_gradient = dst_dilate - dst_erode;//形态学梯度等于膨胀-腐蚀
	morphologyEx(src, dst_tophat, MORPH_TOPHAT, kernel);
	morphologyEx(src, dst_blackhat, MORPH_BLACKHAT, kernel);

	imshow("dst_open", dst_open);
	imshow("dst_close", dst_close);

	imshow("src", src);
	imshow("dst_gradient", dst_gradient);
	imshow("dst_blackhat", dst_blackhat);
	imshow("dst_tophat", dst_tophat);


	waitKey(0);
	return 1;
}

玩起来了

<LearnOpenCV(9) C++>形态学操作(二)_第7张图片
其实开操作可以去除rgb图像中高值细节,闭操作可以去除低值细节,所以对比两个图像的话可以看到它们部分地方互补。

你可能感兴趣的:(c++,计算机视觉,图像处理)