繁体   English   中英

opencv:从图像创建二进制掩码

[英]opencv: Creating a binary mask from the image

在此处输入图像描述

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

在此处输入图像描述

为了解决这个问题,我想找到主矩形的轮廓。 我的计划是找到所有外部轮廓。 然后得到面积最高的轮廓。 首先,我尝试将所有轮廓和 plot 作为二值图像查找。 我的尝试:

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 算法? 请帮我。

您应该采用如下所示的矩形最大面积的逻辑。 您可以使用此代码段来获取该区域的蒙版图像:

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)

输入图像: 在此处输入图像描述

Output 图像: 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM