1. 程式人生 > >《圖像處理實例》 之 填充封閉區域

《圖像處理實例》 之 填充封閉區域

代碼 vector ima binary otsu 實例 ptr 分享 gin


填充封閉區域

這是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 }

《圖像處理實例》 之 填充封閉區域