基本原理:对于一副背景为白色,目标为黑色的二值图像,如果在图中找到一点黑色,且它的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;
}