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

我一直在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
上直接执行
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