我有这张照片: 我想从该图像创建一个蒙版,以放置在原始图像的顶部。我要获得的面罩是顶部的黑色部分。
我尝试使用OpenCV中的simpleBlobDetector尝试将白色部分检测为一个大斑点。我没有获得期望的结果,不确定该怎么做。
已经使用过R,但是我的问题不是专门关于如何在R中实现这一点。我得到的结果在代码下方。
library(Rvision)
x <- simpleBlobDetector(im, min_threshold = 0, max_threshold = 255)
plot(x)
我不明白为什么将这三个黑盒子选为斑点,而还有更多的黑盒子未被选中。
编辑:当我添加blob_color = 255
以便搜索白色斑点时,什么也没检测到。
答案 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);
您应该获得以下内容:
答案 1 :(得分:-1)
我认为您可以将输入转换为bianry,然后提取连接的分量,计算关联的直方图,并只需(通过阈值化)保持人口最多的直方图类 问候