我有下面的图像,几乎所有背景都是黑色的。 有没有办法在不知道坐标的情况下裁剪被黑色包围的矩形,是:
我对每个大矩形上方的蓝色矩形(高度约为 45px)不感兴趣。 我想将裁剪后的矩形存储在内存中,以便对它们进行进一步处理。所以对于这个 输入图像将是存储在内存中的 4 张图像,如下所示。预先感谢您的帮助。
图1:
图2
图3:
图4:
根据讨论,您似乎很乐意采用 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
这些是按处理生成顺序排列的调试图像,以及一些提取的图像: