温馨提示:本文翻译自stackoverflow.com,查看原文请点击:opencv - Detect and extract images surrounded by a frame
imagemagick opencv

opencv - 检测并提取框架包围的图像

发布于 2020-04-04 00:40:50

我想从输入图像中获取以下结果图像。生成的图像被具有相同边框大小和类型但边框矩形大小不同的框架包围。有没有办法做到这一点?我认为我需要首先检测边界所包围的区域。但是不知道。我正在尝试在ImageMagick中找到它。

  • 输入图片(input.png)

在此处输入图片说明

  • 结果图像(output1.png)

在此处输入图片说明

  • 结果图像(output2.png)

在此处输入图片说明

  • 边界

在此处输入图片说明


更新1

这不是完美的方法,但它可用于OpenCV,如下所示。

import cv2 as cv

def main():
    image_file = '/path/to/your/input/image.png'
    src = cv.imread(image_file, cv.IMREAD_COLOR)
    height, width, channels = src.shape
    image_size = height * width
    img_gray = cv.cvtColor(src, cv.COLOR_RGB2GRAY)
    retval, dst = cv.threshold(img_gray, 1000, 255, cv.THRESH_TOZERO_INV)
    dst = cv.bitwise_not(dst)
    retval, dst = cv.threshold(dst, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    dst, contours, hierarchy = cv.findContours(
        dst, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

    xxx = 0
    for i, contour in enumerate(contours):
        area = cv.contourArea(contour)
        if area < 50000:
            continue
        if image_size * 0.99 < area:
            continue
        if abs(i - xxx) < 10:
            continue
        xxx = i
        x, y, w, h = cv.boundingRect(contour)
        cut = src[y:y+h, x:x+w]
        detector = cv.FastFeatureDetector_create()
        detector.setNonmaxSuppression(False)
        keypoints = detector.detect(cut)
        cv.imwrite('debug_%d.png' % i, cut)

if __name__ == '__main__':
    main()

从此站点引用:https : //angular.io/guide/providers


更新2

fmw42的方法不错,但不足以满足以下要求。(我没有在第一篇文章中提到)唯一的蓝色矩形被提取。背景颜色可能是白色。

  • 输入图片(input2.png)

在此处输入图片说明

  • 实际结果图像(output.png)

在此处输入图片说明

查看更多

提问者
zono
被浏览
116
fmw42 2020-02-01 14:18

这可以在ImageMagick(6)中使用-connected-components完成。

在这里,我将转换为HSV色彩空间并提取饱和度通道。白色和黑色没有饱和度,但是粉红色和蓝色有饱和度。然后,我将阈值设置为使粉红色和蓝色在黑色背景上变为白色。然后,我使用形态学腐蚀来消除边界的影响。然后,我使用连接的组件填充白色区域中的所有孔,然后获取其边界框并存储在数组中。然后,我遍历每个边界框并裁剪原始图像。

参见https://imagemagick.org/script/connected-components.php

输入:

在此处输入图片说明

Unix语法:

bboxArr=(`convert wikipedia.png \
-colorspace HSV -channel 1 -separate +channel \
-threshold 0 -type bilevel \
-morphology erode square:3 \
-define connected-components:verbose=true \
-define connected-components:mean-color=true \
-define connected-components:area-threshold=1000 \
-connected-components 4 null: | grep "gray(255)" | awk '{print $2}'`)

num=${#bboxArr[*]}

for ((i=0; i<num; i++)); do
convert wikipedia.png -crop ${bboxArr[$i]} +repage wikipedia_$i.png
done


结果:

在此处输入图片说明

在此处输入图片说明

如果使用ImageMagick 7,则将convert转换为magick。

Windows语法需要删除\之前的(和)。并将\的结尾更改为^。grep和awk是Unix工具。因此,您可能需要为Windows安装此类程序或找到其他方法来执行此操作。