Opencv 你有什么奇怪的行为?
我从二值图像(面积小于阈值的轮廓)中过滤小斑点。 掩模是二值图像 如果我评论行Opencv 你有什么奇怪的行为?,opencv,contour,opencv-contour,opencv-drawcontour,Opencv,Contour,Opencv Contour,Opencv Drawcontour,我从二值图像(面积小于阈值的轮廓)中过滤小斑点。 掩模是二值图像 如果我评论行 drawContours(mask, contours, -1, Scalar(255), CV_FILLED, 8); 然后,当我用0个小斑点填充后保存蒙版时,会得到奇怪的结果 我也不明白为什么行未注释时它会工作,因为 drawContours(mask, contours, -1, Scalar(255), CV_FILLED, 8); 掩码逻辑上应与输入掩码相同(除了图像周围的1像素边界) void Fi
drawContours(mask, contours, -1, Scalar(255), CV_FILLED, 8);
然后,当我用0个小斑点填充后保存蒙版时,会得到奇怪的结果
我也不明白为什么行未注释时它会工作,因为
drawContours(mask, contours, -1, Scalar(255), CV_FILLED, 8);
掩码逻辑上应与输入掩码相同(除了图像周围的1像素边界)
void FilterSmallBlobs(垫子和遮罩、浮顶)
{
//作为副作用,此代码扩展了具有1像素边框的内孔,并从图像边框中删除了1像素边框。
矢量等值线;
//findContours(遮罩、轮廓、CV_RETR_列表、CV_链近似_简单);
找到的轮廓(遮罩、轮廓、CV_RETR_列表、CV_链_近似值_无);
vector badContours;//要擦除的轮廓
对于(int i=0;i<(int)等高线.size();i++)
{
如果(轮廓面积(轮廓[i]),如以下文件所述:
注意:此函数修改源图像
因此,在您的例子中,您看到的是修改图像的某些部分,而其他部分被覆盖,因为您将小斑点绘制为黑色
这段代码应该澄清这一点:
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);
vector<vector<Point>> contours;
Mat1b will_be_modified = img.clone();
findContours(will_be_modified, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); ++i)
{
if (contourArea(contours[i]) < 3000)
{
drawContours(img, contours, i, Scalar(0), CV_FILLED);
}
}
imshow("img", img);
imshow("After findContours", will_be_modified);
waitKey();
return 0;
}
#包括
使用名称空间cv;
int main()
{
Mat1b img=imread(“路径到图像”,imread\U灰度);
矢量等值线;
Mat1b将被修改=img.clone();
找到的轮廓(将被修改,轮廓,重建列表,链近似简单);
对于(int i=0;i
结果:
图像传递到findContours
:
在FindCountors中使用mask.clone(),否则将修改mask并显示奇怪的内容artifact@Miki不明白它有什么帮助,我需要修改蒙版,我用0填充坏轮廓。findContours
修改输入图像mask
。您只在未绘制的大斑点“下方”看到修改的部分使用findContours(mask.clone(),…
,就可以了。
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);
vector<vector<Point>> contours;
Mat1b will_be_modified = img.clone();
findContours(will_be_modified, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); ++i)
{
if (contourArea(contours[i]) < 3000)
{
drawContours(img, contours, i, Scalar(0), CV_FILLED);
}
}
imshow("img", img);
imshow("After findContours", will_be_modified);
waitKey();
return 0;
}