OpenCV:如何删除不需要的斑点,或者如何将需要的部分复制到空图像中?
从下图中,如何找到结果图像 这里显示的图像是阈值图像。我尝试过使用形态学操作符,但它们甚至可以去除我想要的斑点。我怎样才能解决这个问题? 有什么提示吗 以下是我感兴趣获取/查找的结果图像:OpenCV:如何删除不需要的斑点,或者如何将需要的部分复制到空图像中?,opencv,image-processing,computer-vision,threshold,opencv-contour,Opencv,Image Processing,Computer Vision,Threshold,Opencv Contour,从下图中,如何找到结果图像 这里显示的图像是阈值图像。我尝试过使用形态学操作符,但它们甚至可以去除我想要的斑点。我怎样才能解决这个问题? 有什么提示吗 以下是我感兴趣获取/查找的结果图像: 检测所有斑点,然后按大小、位置或任何您想要的方式对其进行排序和过滤 如果您希望有人用勺子喂您OpenCV手册的内容,可以使用各种教程 有许多方法可以删除blob并将其复制到其他图像中 删除blob的一种简单方法是将其边界框设置为零 二进制图像也是逻辑操作的理想选择 检测所有斑点,然后根据大小、位置或您
检测所有斑点,然后按大小、位置或任何您想要的方式对其进行排序和过滤 如果您希望有人用勺子喂您OpenCV手册的内容,可以使用各种教程 有许多方法可以删除blob并将其复制到其他图像中 删除blob的一种简单方法是将其边界框设置为零 二进制图像也是逻辑操作的理想选择
检测所有斑点,然后根据大小、位置或您想要的任何东西对它们进行排序和过滤 如果您希望有人用勺子喂您OpenCV手册的内容,可以使用各种教程 有许多方法可以删除blob并将其复制到其他图像中 删除blob的一种简单方法是将其边界框设置为零 二进制图像也是逻辑操作的理想选择
你已经完成了大部分工作,现在你需要做的就是找到斑点,添加一些轮廓,然后找到最大的一个。容易的!下面是C++中的代码,我将留给您解决如何将其转换为Python:
cv::Mat mat = imread("g0cVU.png");
Mat origImage = mat;
Mat canny_output = mat;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
cv::Mat greyMat, colorMat;
cv::cvtColor(mat, greyMat, CV_BGR2GRAY);
int thresh = 100;
RNG rng(12345);
///// Detect edges using canny
Canny(greyMat, canny_output, thresh, thresh * 2, 3);
/// Find contours
findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
int largest_area = 0;
int largest_contour_index = 0;
Rect bounding_rect;
/// Draw contours
Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
double a=contourArea( contours[i],false); // Find the area of contour
if(a>largest_area){
largest_area=a;
largest_contour_index=i; //Store the index of largest contour
bounding_rect=boundingRect(contours[i]); // Find the bounding rectangle for biggest contour
}
}
rectangle(origImage, bounding_rect, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)),2);
/// Show in a window
namedWindow("Contours", CV_WINDOW_AUTOSIZE);
imshow("Contours", drawing);
cv::namedWindow("img");
cv::imshow("mat", mat);
cv::imshow("mat", origImage);
cv::imshow("mat123", drawing);
cv::waitKey(0);
cv::Mat Mat=imread(“g0cVU.png”);
Mat origImage=Mat;
Mat canny_输出=Mat;
矢量等值线;
向量层次;
cv::Mat greyMat,colorMat;
cv::CVT颜色(mat、灰色、cv_bgr2灰色);
int thresh=100;
RNG RNG(12345);
/////使用canny算法检测边缘
Canny(greyMat,Canny_输出,thresh,thresh*2,3);
///寻找轮廓
findContours(canny_输出、轮廓、层次、CV_RETR_树、CV_链近似_简单、点(0,0));
int最大面积=0;
int最大轮廓指数=0;
矩形边界;
///画轮廓
Mat drawing=Mat::zeros(canny_output.size(),CV_8UC3);
对于(int i=0;i最大面积){
最大面积=a;
最大轮廓指数=i;//存储最大轮廓指数
bounding_rect=boundingRect(轮廓[i]);//查找最大轮廓的边界矩形
}
}
矩形(原点、边界、标量(rng.uniform(0255)、rng.uniform(0255)、rng.uniform(0255)),2);
///陈列
namedWindow(“轮廓”,CV\u窗口\u自动调整大小);
imshow(“轮廓”,图纸);
简历:namedWindow(“img”);
cv::imshow(“mat”,mat);
cv::imshow(“mat”,原始图像);
cv::imshow(“mat123”,图纸);
cv::waitKey(0);
结果如下:
您可以在下图中看到,最大的contor周围绘制了一个棕色矩形
o很明显,一旦你有了最大的斑点(或任何你认为“正确的斑点”),你就可以把其他所有东西都设置为黑色,这是相当简单的。你已经完成了大部分工作,你现在需要做的就是找到斑点,添加一些轮廓,然后找到最大的一个。容易的!下面是C++中的代码,我将留给您解决如何将其转换为Python:
cv::Mat mat = imread("g0cVU.png");
Mat origImage = mat;
Mat canny_output = mat;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
cv::Mat greyMat, colorMat;
cv::cvtColor(mat, greyMat, CV_BGR2GRAY);
int thresh = 100;
RNG rng(12345);
///// Detect edges using canny
Canny(greyMat, canny_output, thresh, thresh * 2, 3);
/// Find contours
findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
int largest_area = 0;
int largest_contour_index = 0;
Rect bounding_rect;
/// Draw contours
Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
double a=contourArea( contours[i],false); // Find the area of contour
if(a>largest_area){
largest_area=a;
largest_contour_index=i; //Store the index of largest contour
bounding_rect=boundingRect(contours[i]); // Find the bounding rectangle for biggest contour
}
}
rectangle(origImage, bounding_rect, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)),2);
/// Show in a window
namedWindow("Contours", CV_WINDOW_AUTOSIZE);
imshow("Contours", drawing);
cv::namedWindow("img");
cv::imshow("mat", mat);
cv::imshow("mat", origImage);
cv::imshow("mat123", drawing);
cv::waitKey(0);
cv::Mat Mat=imread(“g0cVU.png”);
Mat origImage=Mat;
Mat canny_输出=Mat;
矢量等值线;
向量层次;
cv::Mat greyMat,colorMat;
cv::CVT颜色(mat、灰色、cv_bgr2灰色);
int thresh=100;
RNG RNG(12345);
/////使用canny算法检测边缘
Canny(greyMat,Canny_输出,thresh,thresh*2,3);
///寻找轮廓
findContours(canny_输出、轮廓、层次、CV_RETR_树、CV_链近似_简单、点(0,0));
int最大面积=0;
int最大轮廓指数=0;
矩形边界;
///画轮廓
Mat drawing=Mat::zeros(canny_output.size(),CV_8UC3);
对于(int i=0;i最大面积){
最大面积=a;
最大轮廓指数=i;//存储最大轮廓指数
bounding_rect=boundingRect(轮廓[i]);//查找最大轮廓的边界矩形
}
}
矩形(原点、边界、标量(rng.uniform(0255)、rng.uniform(0255)、rng.uniform(0255)),2);
///陈列
namedWindow(“轮廓”,CV\u窗口\u自动调整大小);
imshow(“轮廓”,图纸);
简历:namedWindow(“img”);
cv::imshow(“mat”,mat);
cv::imshow(“mat”,原始图像);
cv::imshow(“mat123”,图纸);
cv::waitKey(0);
结果如下:
您可以在下图中看到,最大的contor周围绘制了一个棕色矩形
o显然,一旦你有了最大的斑点(或任何你认为“正确的斑点”),你就可以将其他所有斑点设置为黑色,这是相当简单的。这两个斑点之间的区别是什么,你是根据这两个斑点删除一个和保留另一个的?嗯,我还没有。我不知道该设定什么样的标准。但我总是对比另一个稍大/稍长的斑点感兴趣。而且在另一个之上!可以通过比较每个blob的质心来比较相对位置,也可以通过提取其轮廓和获取边界框来比较每个blob的相对大小。然而,如果你