填充封闭区域
这是http://www.imagepy.org/的作者想法,我只是对其理解之后改进和说明,欢迎大家使用这个小软件!
有需要源工程的朋友可以留邮箱!
目标:填充白色区域的内部
说明:看似很简单的题目,如果盲目的做,半天弄不出来而且复杂度很高,在很多场合有利用。
![](https://img-blog.csdnimg.cn/img_convert/ae1777f309cfed07f4d100052dc41369.png)
方法:
1.利用边缘检测,然后去检测的点进行求平均,接着利用FloodFill进行填充。
2.利用逆向思维,填充内部就等于填充外部,以外部的一个种子点利用FloodFill进行填充。
对方法一进行简单的阐述:
![](https://img-blog.csdnimg.cn/img_convert/acc224087e0c5570aba496321ff85326.png)
对方法二进行简单的阐述:
![](https://img-blog.csdnimg.cn/img_convert/5cb29b1f78bf0c958dd7fa8bca65a631.png)
本博文利用第二种方法进行操作:
![](https://img-blog.csdnimg.cn/img_convert/42cbdfbae524604cdc79ec34281df81c.png)
上代码:
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 }