Python 2.7 使用OpenCV查找连接的组件
我正在尝试使用python OpenCV查找并分离边缘检测图像中的所有边缘。边缘可以是轮廓的形式,但它们不必是轮廓。我只想把所有连接的边和像素组合在一起。因此,从技术上讲,算法在程序上可能是这样的:Python 2.7 使用OpenCV查找连接的组件,python-2.7,opencv,edge-detection,connected-components,Python 2.7,Opencv,Edge Detection,Connected Components,我正在尝试使用python OpenCV查找并分离边缘检测图像中的所有边缘。边缘可以是轮廓的形式,但它们不必是轮廓。我只想把所有连接的边和像素组合在一起。因此,从技术上讲,算法在程序上可能是这样的: 对于每个边缘像素,找到一个相邻的(连接的)边缘像素并将其添加到图像的当前细分中,直到再也找不到为止 然后移动到下一个未选中的边缘像素,开始新的细分,然后再次执行1) 我查看了cv.findContours,但结果并不令人满意,可能是因为它是用于轮廓(封闭边)而不是自由端的。结果如下: 检测到原始边缘
cv.findContours
,但结果并不令人满意,可能是因为它是用于轮廓(封闭边)而不是自由端的。结果如下:
检测到原始边缘:
轮廓处理后:
我原以为这五条边都会被分成自己的图像细分,但显然cv2.findContours函数会将其中两条边进一步细分为我不想要的细分
以下是我用来保存这两幅图像的代码:
def contourForming(imgData):
cv2.imshow('Edge', imgData)
cv2.imwrite('EdgeOriginal.png', imgData)
contours = cv2.findContours(imgData, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow('Contours', imgData)
cv2.imwrite('AfterFindContour.png', imgData)
cv2.waitKey(0)
pass
然而,我的实现有一些限制。我必须使用Python2.7和OpenCV2。除此之外,我不能使用任何其他版本或语言。我之所以这么说是因为我知道OpenCV 2有一个使用C++的连接组件函数。我本可以使用它,但问题是,由于某些限制,我无法使用它
那么,你知道我应该如何处理这个问题吗?使用是正确的方法,你只是做错了
仔细查看文档:
注意:此函数修改源图像
您的“轮廓处理后”图像实际上是来自findContours
的垃圾结果。因此,如果您希望在调用findContours
后原始图像保持完整,通常的做法是将克隆图像传递给函数
findContours
的有意义的结果是在等高线中。您需要使用绘制轮廓
,通常在新图像上绘制轮廓
这是我得到的结果:
以下C++代码:
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv)
{
// Load the grayscale image
Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);
// Prepare the result image, 3 channel, same size as img, all black
Mat3b res(img.rows, img.cols, Vec3b(0,0,0));
// Call findContours
vector<vector<Point>> contours;
findContours(img.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
// Draw each contour with a random color
for (int i = 0; i < contours.size(); ++i)
{
drawContours(res, contours, i, Scalar(rand() & 255, rand() & 255, rand() & 255));
}
// Show results
imshow("Result", res);
waitKey();
return 0;
}
#包括
使用名称空间cv;
int main(int argc,字符**argv)
{
//加载灰度图像
Mat1b img=imread(“路径到图像”,imread\U灰度);
//准备结果图像,3通道,与img尺寸相同,全黑
Mat3b res(img.rows,img.cols,Vec3b(0,0,0));
//呼叫发现者
矢量等值线;
findContours(img.clone()、轮廓、外部修复、链近似无);
//用随机颜色绘制每个轮廓
对于(int i=0;i
移植到Python应该相当容易(很抱歉,我不能给您Python代码,因为我无法测试它)。您还可以查看特定的,以检查如何正确使用findContours
和drawContours
您可以在提取轮廓之前尝试cv::放大边缘,但这可能会改变结果!我想现在可以了。我不知道您提供的opencv3.0.0文档()也适用于opencv2.7。