《图像处理实例》 之 填充封闭区域


填充封闭区域

这是http://www.imagepy.org/的作者想法,我只是对其理解之后改进和说明,欢迎大家使用这个小软件!

有需要源工程的朋友可以留邮箱! 


 目标:填充白色区域的内部

 说明:看似很简单的题目,如果盲目的做,半天弄不出来而且复杂度很高,在很多场合有利用。

 方法:

    1.利用边缘检测,然后去检测的点进行求平均,接着利用FloodFill进行填充。

    2.利用逆向思维,填充内部就等于填充外部,以外部的一个种子点利用FloodFill进行填充。

对方法一进行简单的阐述:

对方法二进行简单的阐述:

 本博文利用第二种方法进行操作:

上代码:

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 using namespace cv;
 6 int FillBlock(Mat src, Mat &mask, Point center);
 7 int main(int argc,char**argv)
 8 {
 9     Mat inputImage = imread("123.jpg", 0);
10     threshold(inputImage, inputImage, 1, 255, THRESH_BINARY_INV | THRESH_OTSU);
11     Mat mask = Mat::zeros(inputImage.size(), CV_8UC1);
12     mask.setTo(255);
13     Mat rows = Mat::ones(Size(inputImage.cols, 1), CV_8UC1), cols = Mat::zeros(Size(1, inputImage.rows), CV_8UC1);
14     Mat src_rows_beg = mask.row(0);
15     Mat src_rows_end = mask.row(inputImage.rows - 1);
16     Mat src_cols_beg = mask.col(0);
17     Mat src_cols_end = mask.col(inputImage.cols - 1);
18     rows.copyTo(src_rows_beg); rows.copyTo(src_rows_end);
19     cols.copyTo(src_cols_beg); cols.copyTo(src_cols_end);
20     int temp = FillBlock(inputImage, mask, Point(1, 1));
21     return 0;
22 }
23 
24 int FillBlock(Mat src, Mat &mask, Point center)
25 {
26     uchar back = src.at<uchar>(center.y, center.x);
27     vector<Point> fill_point;
28     int count = 0, count_mount = 1;
29     fill_point.push_back(center);
30     while (count < count_mount)
31     {
32         vector<uchar*> img;
33         vector<uchar*> msk;
34         for (int i = -1; i < 2; i++)
35         {
36             img.push_back(src.ptr<uchar>(fill_point[count].y + i));
37             msk.push_back(mask.ptr<uchar>(fill_point[count].y + i));
38         }
39         for (size_t i = 0; i < 3; i++)
40         {
41             for (int j = -1; j < 2; j++)
42             {
43                 if (img[i][fill_point[count].x + j] == back && !(j == 0 && i == 1) && msk[i][fill_point[count].x + j] == 255)
44                 {
45                     fill_point.push_back(Point(fill_point[count].x + j, fill_point[count].y + i - 1));
46                     msk[i][fill_point[count].x + j] = 1;
47                 }
48             }
49         }
50         msk[1][fill_point[count].x] = 1;
51         count_mount = fill_point.size() - 1;
52         fill_point.erase(fill_point.begin());
53     }
54     return 0;
55 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值