如何从二进制图像中找到最大的白色像素区域

时间:2016-02-18 08:52:32

标签: python python-2.7 opencv

我一直在opencv python上处理二进制图像。我需要得到最大的区域。我使用了以下代码,但我没有获得所需的输出。

...
var saveTo = './test.png',
    ws = fs.createWriteStream(saveTo);

ws.on('close', function () {
    cb();
});
req.pipe(ws);
...

3 个答案:

答案 0 :(得分:1)

您不需要使用canny输出来执行此操作。只需直接在findContoursim_bw,您就可以获得所需的结果。如果仍然不是您想要的,请尝试使用不同的阈值(假设您的原始图像不是BW本身)

(_, im_bw) = threshold(frame, 100, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
(cnts, _) = cv2.findContours(im_bw.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
c = max(cnts, key = cv2.contourArea)

答案 1 :(得分:0)

你真的没有解释你在寻找什么,“最大的地区”?您发布的代码将为您提供找到的最大轮廓,但您需要了解什么是OpenCV轮廓here。现在,根据您的图像,您可能会产生很多噪音,这使得OpenCV不会为您提供您期望的“区域”,因此您需要降低噪音。在应用Canny或阈值之前,您可以将BLUR应用于图片EROTION and/or DILATION

算法应该是这样的:

  • 获取框架/图像
  • 灰度级
  • 涂抹Blur / Erode / Dilate以减少噪音
  • 应用Canny或阈值
  • 查找轮廓
  • 获取最大的
  • 做你需要的事情

Here你会在Python中找到很好的文档。

答案 2 :(得分:0)

我正在使用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

输入图像-

enter image description here

输出图像-

enter image description here