zoukankan      html  css  js  c++  java
  • 《图像处理实例》 之 填充封闭区域


    填充封闭区域

    这是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 }
  • 相关阅读:
    10、Python的while与死循环
    8、 Python的if分支练习题
    7、 Python中的if多重判断
    6、Python的if判断和两重判断
    5、运算符
    4、数据类型:字典
    placeholder 颜色更改
    禁止video在苹果手机上的自动全屏播放
    点击label出发两次点击事件
    instanceof 和 typeof
  • 原文地址:https://www.cnblogs.com/wjy-lulu/p/7636962.html
Copyright © 2011-2022 走看看