OpenCV 仅发现图像边界作为轮廓
OpenCV finds only image border as contour
我想用 RETR_EXTERNAL
获取所有外部轮廓,但出于某种奇怪的原因,openCV 认为图像边界也是一个轮廓,因此丢弃所有内部轮廓。我到底做错了什么?
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(imageA, contours, hierarchy, Imgproc.RETR_EXTERNAL,
Imgproc.CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++) {
double[] c = hierarchy.get(0, i);
Rect rect = Imgproc.boundingRect(contours.get(i));
Core.rectangle(image, new Point(rect.x, rect.y),
new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0), 3);
}
输入(imageA在contour-finding之前被处理成这个):
输出:
编辑:
问题部分解决
反转像素,使黑色为背景,白色为前景,有助于上图。但是,我仍然可以在某些图像上看到内部轮廓。喜欢这个:
输入
输出
您的输入图像不够好,无法提取您想要的轮廓。
您的输入轮廓是这些(图像的一部分):
每种颜色都是一个轮廓(和一些白色的)
对于红色轮廓,我绘制了边界矩形,这与您用来显示轮廓的方法相同。所有其他彩色轮廓都不在红色轮廓内,而是在边界矩形内,这就是为什么即使您选择仅查找外部轮廓也能找到它们的原因。
你真正想要的是这样的:
但要获得该结果,您的输入图像也必须连接椭圆的那条线!!
对于您的输入图像,如果不获取地面线,将很难提取这些线,但一种简单的方法是先使用几个膨胀操作,然后对您的图像进行相同数量的侵蚀操作输入图像,在提取轮廓之前。虽然这对所有设置都不稳定 ;)
我想用 RETR_EXTERNAL
获取所有外部轮廓,但出于某种奇怪的原因,openCV 认为图像边界也是一个轮廓,因此丢弃所有内部轮廓。我到底做错了什么?
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(imageA, contours, hierarchy, Imgproc.RETR_EXTERNAL,
Imgproc.CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++) {
double[] c = hierarchy.get(0, i);
Rect rect = Imgproc.boundingRect(contours.get(i));
Core.rectangle(image, new Point(rect.x, rect.y),
new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0), 3);
}
输入(imageA在contour-finding之前被处理成这个):
输出:
编辑: 问题部分解决 反转像素,使黑色为背景,白色为前景,有助于上图。但是,我仍然可以在某些图像上看到内部轮廓。喜欢这个:
输入
输出
您的输入图像不够好,无法提取您想要的轮廓。
您的输入轮廓是这些(图像的一部分):
每种颜色都是一个轮廓(和一些白色的)
对于红色轮廓,我绘制了边界矩形,这与您用来显示轮廓的方法相同。所有其他彩色轮廓都不在红色轮廓内,而是在边界矩形内,这就是为什么即使您选择仅查找外部轮廓也能找到它们的原因。
你真正想要的是这样的:
但要获得该结果,您的输入图像也必须连接椭圆的那条线!!
对于您的输入图像,如果不获取地面线,将很难提取这些线,但一种简单的方法是先使用几个膨胀操作,然后对您的图像进行相同数量的侵蚀操作输入图像,在提取轮廓之前。虽然这对所有设置都不稳定 ;)