C++ OpenCV中的泛洪填充函数
浮动范围和固定范围的含义是什么 我使用了floodfill函数来生成如下所示的灰度图像。图像有三个不同强度的区域C++ OpenCV中的泛洪填充函数,c++,opencv,colors,image-segmentation,flood-fill,C++,Opencv,Colors,Image Segmentation,Flood Fill,浮动范围和固定范围的含义是什么 我使用了floodfill函数来生成如下所示的灰度图像。图像有三个不同强度的区域 外矩形=170 内椭圆=175 内矩形=180 我想将170和175区域作为单个连接组件一起填充,将180区域作为单独的组件填充 我对and函数进行了如下修改: #include <iostream> #include <vector> #include <opencv2/highgui/highgui.hpp> #include <
#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++;
}
}
}
#包括
#包括
#包括
#包括
void FindBlobs(常量cv::Mat和binary,std::vector&blobs);
int main(int argc,字符**argv)
{
cv::Mat img=cv::imread(“blob.png”,0);//强制灰度
如果(!img.data){
标准::cout和blobs)
{
blobs.clear();
cv::Mat标签_图像;
二进制.convertTo(label_image,CV_32FC1);
int label_count=2;
对于(int y=0;y150时才开始标记
{
继续;
}
cv::Rect Rect;
cv::泛光填充(标签图像,cv::点(x,y),cv::标量(标签计数),&rect,cv::标量(0),cv::标量(6),4+cv\U泛光填充固定范围);
std::向量blob;
对于(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(i,j)!=label_count){
{继续;
}
blob.push_back(cv::Point2i(j,i));
}
}
水滴。推回(水滴);
标签_计数++;
}
}
}
我使用标志CV\u FLOODFILL\u fixed\u range使用了fixed range(我使用的方法正确吗??)
我指定loDiff=0和upDiff=6
I预计当种子变为170时,170-0到170+6范围内的所有点(即170到176(外矩形和内椭圆)都用相同的标签填充,因为内矩形是180,所以它会有不同的标签
但是,我得到的输出如下:-
外矩形和内椭圆没有相同的标签。可能是什么错误
预期o/p:内部椭圆也为橙色(与外部矩形相同)您是否尝试仅应用整体填充,即放弃此
FindBlobs
等,在点(0,0)上应用整体填充
并使用与您相同的参数将泛光区域替换为灰度强度,这是结果图像:(排除问题中所示图像中引入的伪影,这是您想要的结果).我不希望这只适用于此图像…我需要将特定范围内公差为0到+5的区域,即170-175(如果170成为种子值)标记为单个组件…我必须使用FindBlobs,因为我检查条件标签。\u图像。在(y,x)<150,这意味着我只在像素大于150时才开始标记…如果我从(0,0)开始,它将在这种情况下工作,因为我知道(0,0)是170,大于150。一直以来都存在误解。如果所有代码都正常工作,那么它也将在(0,0)进行泛洪填充。这意味着您应该得到与链接图像类似的输出。由于它不提供相同的输出,因此问题与整体填充无关。因此,问题是没有意义的。目的是标记代码在迭代时完成的所有区域,以检查未标记的区域……我想问,为什么我的代码不提供作为输出的输出你的链接…虽然我已经正确地将参数传递给了floodFill函数…它应该在你的链接中标记外矩形和椭圆,在我的链接中标记内矩形…但我不明白为什么它在标记外矩形和椭圆时有所不同?你使用CV_floodFill_FIXED_RANGE是因为这个qn的动机是了解浮动和固定范围的含义…如果我使用浮动范围,我会得到预期的o/p…而不是CV_FLOODFILL_fixed_range(我在代码中使用过)