我一直在opencv python上处理二进制图像。我需要得到最大的区域。我使用了以下代码,但我没有获得所需的输出。
...
var saveTo = './test.png',
ws = fs.createWriteStream(saveTo);
ws.on('close', function () {
cb();
});
req.pipe(ws);
...
答案 0 :(得分:1)
您不需要使用canny输出来执行此操作。只需直接在findContours
上im_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。
算法应该是这样的:
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
输入图像-
输出图像-