轮廓提取

基本原理:对于一副背景为白色,目标为黑色的二值图像,如果在图中找到一点黑色,且它的8领域也均为黑色,就说明该点是目标的内部点,将其置为白色,表现为掏空状态;否则保持黑色不变,该点事目标的边界点。整幅图像按此原理处理后,便得到轮廓。

算法描述:

1.取得源图像的宽度。

2.创建一幅大小与源图像一致、全像素为白的目标图像。

3.除四周的边缘像素外,对源图像逐点扫描,如源图像当前点为黑色,则扫描其8领域,若8领域都为黑色,则将源图像当前点在目标图像中对应的点置黑。

4.重复步骤3,直至图像处理完毕。

5.所得的目标图像即为轮廓。

代码:

#include<opencv2\opencv.hpp>
using namespace cv;

Mat contour_extract(Mat &img)
{
	int width = img.cols;
	Mat mask(img.size(), img.type(), Scalar::all(255));
	for (int i = 1; i < img.rows - 1; i++)
	{
		uchar *img_data = img.ptr<uchar>(i);
		uchar *mask_data = mask.ptr<uchar>(i);
		for (int j = 1; j < img.cols - 1; j++)
		{
			int flag = 0;
			if (*img_data ==0)
			{
				
				for (int ii = 0; ii < 3; ii++)
				{
					for (int jj = 0; jj < 3; jj++)
					{
						if (*(img_data + (ii - 1)*width + (jj - 1)) != 0)
						{
							*mask_data = 0;
							flag = 1;
							break;
						}
					}
					if (flag == 1)
					{
						break;
					}
				}
			}
			img_data++;
			mask_data++;
		}
	}
	return mask;
}

int main()
{

	while (1)
	{
		Mat img = imread("2.jpg", 0);
		imshow("源图像", img);
		threshold(img, img, 240, 255, 0);
		Mat kk=contour_extract(img);
		imshow("轮廓", kk);
		waitKey(1);
	}
    return 0;
}

《轮廓提取》
《轮廓提取》

点赞