Floodfill函数文档中给出的浮动范围和固定范围是什么意思?
我对如下所示的灰度图像使用了填充功能。图像具有三个不同强度的区域。
- 外矩形 = 170
- 内椭圆 = 175
- 内部矩形 = 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 :内椭圆也是橙色(与外矩形相同)