Python 如何从二值图像中找到最大的白色像素区域
我一直在opencv python上处理二进制图像。我需要得到最大的区域。我使用了下面的代码,但没有得到想要的输出Python 如何从二值图像中找到最大的白色像素区域,python,python-2.7,opencv,Python,Python 2.7,Opencv,我一直在opencv python上处理二进制图像。我需要得到最大的区域。我使用了下面的代码,但没有得到想要的输出 edged = cv2.Canny(im_bw, 35, 125) (cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) c = max(cnts, key = cv2.contourArea) 您不需要使用canny输出来执行此操作。只要在im\u bw上直接执行fi
edged = cv2.Canny(im_bw, 35, 125)
(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
c = max(cnts, key = cv2.contourArea)
您不需要使用canny输出来执行此操作。只要在
im\u bw
上直接执行findContours
,您就会得到所需的结果。如果仍然不是您想要的,尝试使用不同的阈值(假设您的原始图像本身不是BW)
你真的没有解释你在找什么“最大的地区”?您发布的代码将为您提供找到的最大轮廓,但您需要了解什么是OpenCV轮廓。现在,根据您的图像,您可能会有很多噪声,这使得OpenCV提供的不是您期望的“区域”,因此您需要减少噪声。在将Canny或阈值应用于图像之前 算法应如下所示:
- 获取帧/图像
- 灰度图像
- 应用模糊/腐蚀/放大以减少噪音
- 应用Canny或threshold
- 寻找轮廓
- 得到最大的
- 做你需要的
您可以在Python中找到很好的文档。我正在使用Python的
scikit image
包,它测量岛屿的面积,并选择最大面积,如下所示-
import skimage
from skimage import measure
labels_mask = measure.label(input_mask)
regions = measure.regionprops(labels_mask)
regions.sort(key=lambda x: x.area, reverse=True)
if len(regions) > 1:
for rg in regions[1:]:
labels_mask[rg.coords[:,0], rg.coords[:,1]] = 0
labels_mask[labels_mask!=0] = 1
mask = labels_mask
输入图像-
输出图像-
您能提供一些例子吗?您所说的期望输出是什么意思?它会给你一个不是最大的片段?假设我想从二值图像中提取大象,假设大象是最大的白色像素区域。@凯拉,很抱歉迟到了,我建议使用SIFT和SURF算法使用的DoGs(高斯差分)。你也可以使用分水岭。谢谢你,但是它不起作用,你能解释一下如何显示“c”,我在那部分有错误,,
image=cv2。绘制等高线(im_bw,[cnt],0,(0255,0),3)cv2.imshow('IMG',image)
drawContours
不返回图像(查看文档),它在im\u-dw
上绘制图像。要显示图像,请使用cv2.imshow('IMG',im\u-bw)
。还要绘制最大轮廓c
使用cv2。绘制轮廓(im_bw,[c],0,(0255,0),3)
import skimage
from skimage import measure
labels_mask = measure.label(input_mask)
regions = measure.regionprops(labels_mask)
regions.sort(key=lambda x: x.area, reverse=True)
if len(regions) > 1:
for rg in regions[1:]:
labels_mask[rg.coords[:,0], rg.coords[:,1]] = 0
labels_mask[labels_mask!=0] = 1
mask = labels_mask