轮廓提取

来源:互联网 发布:淘宝行业排名 编辑:程序博客网 时间:2024/05/23 18:32

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


0 0