OpenCV中的Floodfill功能

时间:2013-02-17 10:36:09

标签: opencv colors flood-fill

documentation of floodfill function中给出的浮动范围和固定范围的含义是什么?

我使用了填充功能来显示如下所示的灰度图像。该图像具有三个不同强度的区域。

input image

  1. 外部矩形= 170
  2. 内部椭圆= 175
  3. 内部矩形= 180
  4. 我想将170和175的区域一起填充为单个连接的组件和区域,其中180个作为单独的组件。

    我修改了code from here并按如下方式运行:

      #include <iostream>
    #include <vector>
    
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    void FindBlobs(const cv::Mat &binary, std::vector < std::vector<cv::Point2i> > &blobs);
    
    int main(int argc, char **argv)
    {
        cv::Mat img = cv::imread("blob.png", 0); // force greyscale
    
        if(!img.data) {
            std::cout << "File not found" << std::endl;
            return -1;
        }
    
        cv::namedWindow("binary");
        cv::namedWindow("labelled");
    
        cv::Mat output = cv::Mat::zeros(img.size(), CV_8UC3);
    
        cv::Mat binary=img.clone();
        std::vector < std::vector<cv::Point2i > > blobs;
    
        FindBlobs(binary, blobs);
    
        // Randomy color the blobs
        for(size_t i=0; i < blobs.size(); i++) {
            unsigned char r = 255 * (rand()/(1.0 + RAND_MAX));
            unsigned char g = 255 * (rand()/(1.0 + RAND_MAX));
            unsigned char b = 255 * (rand()/(1.0 + RAND_MAX));
    
            for(size_t j=0; j < blobs[i].size(); j++) {
                int x = blobs[i][j].x;
                int y = blobs[i][j].y;
    
                output.at<cv::Vec3b>(y,x)[0] = b;
                output.at<cv::Vec3b>(y,x)[1] = g;
                output.at<cv::Vec3b>(y,x)[2] = r;
            }
        }
    
        cv::imshow("binary", img);
        cv::imshow("labelled", output);
        cv::waitKey(0);
    
        return 0;
    }
    
    void FindBlobs(const cv::Mat &binary, std::vector < std::vector<cv::Point2i> > &blobs)
    {
        blobs.clear();
    
        cv::Mat label_image;
        binary.convertTo(label_image, CV_32FC1); 
    
        int label_count = 2; 
    
        for(int y=0; y < binary.rows; y++) {
        {
         for(int x=0; x < binary.cols; x++) {
             {   if((int)label_image.at<float>(y,x) < 150) {  //start labelling only when pixel > 150
                 {
             continue;
                 }
    
                cv::Rect rect;
                cv::floodFill(label_image, cv::Point(x,y), cv::Scalar(label_count), &rect, cv::Scalar(0), cv::Scalar(6), 4+CV_FLOODFILL_FIXED_RANGE);
    
                std::vector <cv::Point2i> blob;
    
                for(int i=rect.y; i < (rect.y+rect.height); i++) {
                {   for(int j=rect.x; j < (rect.x+rect.width); j++) {
                    {   if((int)label_image.at<float>(i,j) != label_count) {
                        {    continue;
                        }
    
                        blob.push_back(cv::Point2i(j,i));
                    }
                }
    
                blobs.push_back(blob);
    
                label_count++;
            }
        }
    }
    

    我使用标志CV_FLOODFILL_FIXED_RANGE使用固定范围(我使用的方式是否正确?

    我指定 loDiff = 0和upDiff = 6

    预期当种子变为170时,所有点的范围在170-0到170 + 6之间,即 170到176 外部矩形和内部椭圆)用相同的标签填充,因为内部矩形是180,它将有不同的标签。

    但是我得到如下输出: -

    enter image description here

    外部矩形和内部椭圆没有相同的标签。可能是什么错误?

    预期o / p:内椭圆也是橙色(与外部矩形相同)

0 个答案:

没有答案