在黑白图像中找到最大的斑点

时间:2019-02-18 13:59:38

标签: r opencv

我有这张照片:im 我想从该图像创建一个蒙版,以放置在原始图像的顶部。我要获得的面罩是顶部的黑色部分。

我尝试使用OpenCV中的simpleBlobDetector尝试将白色部分检测为一个大斑点。我没有获得期望的结果,不确定该怎么做。

已经使用过R,但是我的问题不是专门关于如何在R中实现这一点。我得到的结果在代码下方。

library(Rvision)
x <- simpleBlobDetector(im, min_threshold = 0, max_threshold = 255)
plot(x)

blobs

我不明白为什么将这三个黑盒子选为斑点,而还有更多的黑盒子未被选中。

编辑:当我添加blob_color = 255以便搜索白色斑点时,什么也没检测到。

2 个答案:

答案 0 :(得分:0)

您可以使用OpenCV执行以下操作:

// read input image
Mat inputImg = imread("test1.tif", IMREAD_GRAYSCALE);

// create binary image
Mat binImg;
threshold(inputImg, binImg, 254, 1, THRESH_BINARY_INV);

// compute connected components
Mat labelImg;
connectedComponents(binImg, labelImg, 8, CV_16U);

// compute histogram
Mat histogram;
int histSize = 256;
float range[] = { 0, 256 } ;
const float* histRange = { range };
calcHist(&labelImg, 1, 0, Mat(), histogram, 1, &histSize, &histRange, true, false);

// retrieve maximal population
float maxVal = 0;
int maxIdx;
for (int i=1; i<histSize; ++i) {
    if (histogram.at<float>(i) > maxVal) {
        maxVal = histogram.at<float>(i);
        maxIdx = i;
    }
}

// create output mask with bigest population
Mat resImg;
threshold(labelImg, labelImg, maxIdx, 0, THRESH_TOZERO_INV);
threshold(labelImg, resImg, maxIdx-1, 1, THRESH_BINARY);

// write result
imwrite("res.tif", resImg);

您应该获得以下内容:

resulting mask image

答案 1 :(得分:-1)

我认为您可以将输入转换为bianry,然后提取连接的分量,计算关联的直方图,并只需(通过阈值化)保持人口最多的直方图类 问候