2

Floodfill函数文档中给出的浮动范围和固定范围是什么意思?

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

输入图像

  1. 外矩形 = 170
  2. 内椭圆 = 175
  3. 内部矩形 = 180

我想将 170 和 175 的区域一起作为单个连接的组件和 180 的区域作为单独的组件进行泛洪填充。

我从这里修改了 代码,功能如下:

  #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,它会有不同的标签。

但是我得到如下输出: -

在此处输入图像描述

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

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

4

0 回答 0