【问题标题】:opencv: Creating a binary mask from the imageopencv:从图像创建二进制掩码
【发布时间】:2022-01-09 12:48:36
【问题描述】:

我有这张图片,我想用它制作一个二进制掩码。主要(最大)矩形应该是白色的,图片的其他部分应该是黑色的。像这样:

为了解决这个问题,我想找到一个主矩形的轮廓。我的计划是找到所有外部轮廓。然后得到面积最高的轮廓。首先,我试图找到所有轮廓并将它们绘制为二进制图像。我的尝试:

import numpy as np 
import cv2
import matplotlib.pyplot as plt
from skimage import data, io

im = cv2.imread('train_1.jpg', 0)
contours, hierarchy = cv2.findContours(im.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
out = np.zeros_like(im)
cv2.drawContours(out, contours, -1, 255, 10)
io.imshow(out)
plt.show()

但即使是这个简单的代码也没有找到任何轮廓。它出什么问题了?以及如何获得面积最高的轮廓?也许我应该在这里应用 Canny 算法?请帮帮我。

【问题讨论】:

    标签: python opencv image-processing cv2 scikit-image


    【解决方案1】:

    您应该采用如下所示的矩形最大面积的逻辑。可以使用这个sn-p来获取区域的mask图片:

    import cv2
    import numpy as np
    
    image = cv2.imread("jigsaw.jpg")
    
    image = cv2.resize(image, (image.shape[1] // 4, image.shape[0] // 4))
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
    
    thresh = cv2.adaptiveThreshold(blur, 255, 1, 1, 11, 2)
    
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    max_area = 0
    best_cnt = None
    for counter in contours:
        area = cv2.contourArea(counter)
        if area > 1000:
            if area > max_area:
                max_area = area
                best_cnt = counter
    
    mask = np.zeros((gray.shape), np.uint8)
    
    cv2.drawContours(mask, [best_cnt], 0, 255, -1)
    cv2.drawContours(mask, [best_cnt], 0, 0, 2)
    
    cv2.imwrite('mask_jigsaw.jpg', mask)
    
    cv2.imshow("Image Mask", mask)
    cv2.waitKey(0)
    

    输入图像:

    输出图像:

    【讨论】:

    • 谢谢!我有个问题。你为什么做图像模糊?我删除了这条线,得到了和你一样的图像。
    • 它为您提供更流畅的图像
    • 谢谢@yakhyo。如果医学图像带有手动绘制的圆圈,您是否有类似的脚本。我的目标是创建一个二进制蒙版,用白色和黑色填充圆圈的内部。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2015-10-11
    • 2015-04-15
    • 2010-09-21
    • 2018-09-27
    • 1970-01-01
    • 2018-07-21
    相关资源
    最近更新 更多