如何在不知道坐标的情况下裁剪黑色包围的矩形?

问题描述 投票:0回答:1

我有下面的图像,几乎所有背景都是黑色的。 有没有办法在不知道坐标的情况下裁剪被黑色包围的矩形,是:

  1. 高度 > 400px
  2. 高度约144px
  3. 高度约40px

我对每个大矩形上方的蓝色矩形(高度约为 45px)不感兴趣。 我想将裁剪后的矩形存储在内存中,以便对它们进行进一步处理。所以对于这个 输入图像将是存储在内存中的 4 张图像,如下所示。预先感谢您的帮助。

图1:

图2

图3:

图4:

opencv imagemagick crop
1个回答
0
投票

根据讨论,您似乎很乐意采用 OpenCV 解决方案,所以我为您制作了一个。我没有太注意根据所有标准提取您正在寻找的确切项目,我只是提取了所有高于 35px 的轮廓。您可以随意选择您感兴趣的确切高度/宽度/颜色:

#!/usr/bin/env python3

import cv2 as cv
import numpy as np

# Load image and make greyscale version
im = cv.imread('uvXcA.png')
grey = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
cv.imwrite('DEBUG-grey.png', grey)

# Threshold image to get white regions of interest on black background
_, thr = cv.threshold(grey,0, 255, cv.THRESH_BINARY)
cv.imwrite('DEBUG-thr.png', thr)

# Morphology to get rid of small artefacts
SE = cv.getStructuringElement(cv.MORPH_RECT, (3,3))
cleaned = cv.morphologyEx(thr, cv.MORPH_CLOSE, SE)
cv.imwrite('DEBUG-cleaned.png', cleaned)

# Find "interesting" objects
contours, _ = cv.findContours(cleaned, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
for i,c in enumerate(contours):
   # Get bounding rect of this contour
   x,y,w,h = cv.boundingRect(c)
   # Print if taller than 35 px
   if h>35:
      print(f'Contour: {i}, {w}x{h} @ {x},{y}')
      # Extract from original colour image, not the one we morphed
      extracted = im[y:y+h, x:x+w]
      cv.imwrite(f'DEBUG-contour{i}.png', extracted)

这是程序的输出:

Contour: 4, 894x62 @ 1001,1521
Contour: 5, 894x62 @ 70,1521
Contour: 6, 892x630 @ 1002,876
Contour: 9, 892x630 @ 71,876
Contour: 10, 892x531 @ 1002,330
Contour: 94, 892x531 @ 71,330
Contour: 98, 428x144 @ 1467,155
Contour: 99, 428x144 @ 1001,155
Contour: 100, 429x144 @ 535,155
Contour: 101, 428x144 @ 70,155
Contour: 106, 564x42 @ 1331,110
Contour: 107, 44x48 @ 0,101
Contour: 108, 1920x81 @ 0,0

这些是按处理生成顺序排列的调试图像,以及一些提取的图像:

© www.soinside.com 2019 - 2024. All rights reserved.