<LearnOpenCV(8) C++>形态学操作(一)

形态学操作(一)

简单了解二值图像的形态学操作(并没有用二值图像)

膨胀与腐蚀

getStructuringElement()

了解一个基础API,返回指定形状和尺寸的结构元素,这里用于指示膨胀和腐蚀用到的核。

CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
  • shape 结构形状 可选 MORPH_RECT、MORPH_CROSS、MORPH_ELLIPSE等
  • ksize 形状尺寸
  • anchor 核心位置 (-1,-1)是默认中心

膨胀

高值扩散,用指定结构遍历图像,计算邻域内最高值赋予当前像素。

API

CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor = Point(-1,-1), int iterations = 1,
                          int borderType = BORDER_CONSTANT,
                          const Scalar& borderValue = morphologyDefaultBorderValue() );
  • src 输入图像
  • dst 输出图像
  • kernel 遍历核心 可有getStructuringElement()获取
  • anchor 核心
  • iterations 迭代次数

代码

<LearnOpenCV(8) C++>形态学操作(一)_第1张图片

src = imread("girl6.jpg");
	if (!src.data)
	{
		printf("can not loading data!\n");
		return -1;
	}
Mat element = getStructuringElement(MORPH_RECT, Size(2 * StructElement_Size + 1, 2 * StructElement_Size + 1), Point(StructElement_Size, StructElement_Size));
dilate(src, dst_dilate, element);
imshow("dst_dilate", dst_dilate);

腐蚀

API

CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );
  • src 输入图像
  • dst 输出图像
  • kernel 遍历核心 可有getStructuringElement()获取
  • anchor 核心
  • iterations 迭代次数

代码

<LearnOpenCV(8) C++>形态学操作(一)_第2张图片

src = imread("girl6.jpg");
	if (!src.data)
	{
		printf("can not loading data!\n");
		return -1;
	}
	Mat element = getStructuringElement(MORPH_RECT, Size(2 * StructElement_Size + 1, 2 * StructElement_Size + 1), Point(StructElement_Size, StructElement_Size));
	erode(src, dst_erode, element);
	imshow("dst_erode", dst_erode);

加点细节

<LearnOpenCV(8) C++>形态学操作(一)_第3张图片

#include 
#include 

using namespace std;
using namespace cv;

Mat src, dst;
int mo = 0;
int StructElement_Size = 3;

void Process();
void setmo(int, void*);
void setStructElement_Size(int, void*);
int main() {
	src = imread("girl6.jpg");
	if (!src.data)
	{
		printf("can not loading data!\n");
		return -1;
	}
	namedWindow("Input", WINDOW_AUTOSIZE);
	namedWindow("Output", WINDOW_AUTOSIZE);

	createTrackbar("erode/dilate","Output",&mo,1,setmo,NULL);
	createTrackbar("StructElement Size", "Output", &StructElement_Size, 10, setStructElement_Size, NULL);
	
	imshow("Input", src);
	waitKey(0);
	return -1;
}
void Process() {
	Mat element = getStructuringElement(MORPH_RECT, Size(2 * StructElement_Size + 1, 2 * StructElement_Size + 1), Point(StructElement_Size, StructElement_Size));
	if (mo == 1)
	{
		dilate(src, dst, element);//标记为1 膨胀
	}
	else
	{
		erode(src, dst, element);//否则腐蚀
	}
	imshow("Output",dst);
	return;
}

void setmo(int, void*) {
	Process();
	return;
}
void setStructElement_Size(int, void*) {
	Process();
	return;
}

你可能感兴趣的:(c++,计算机视觉,opencv)