我想从输入图像中获取以下结果图像。生成的图像被具有相同边框大小和类型但边框矩形大小不同的框架包围。有没有办法做到这一点?我认为我需要首先检测边界所包围的区域。但是不知道。我正在尝试在ImageMagick中找到它。
更新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的方法不错,但不足以满足以下要求。(我没有在第一篇文章中提到)唯一的蓝色矩形被提取。背景颜色可能是白色。
这可以在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安装此类程序或找到其他方法来执行此操作。
效果很好。但请给我更多时间。正如您所提到的,我已经确认如果它是白色后端颜色,则它不起作用。颜色也可以按我的要求进行(是的,我没有在问题中提及。很抱歉..)。我正在尝试寻找解决方案。
您是否需要所有文本段落?如果是这样,则需要稍微不同的方法。首先,将所有文本在白色背景上设为黑色。然后模糊文本或打开我们的形态以连接每个段落中的文本。门槛。然后使用连接的组件查找文本区域边界框。然后使用边界框裁剪输入。
你好 不,我不需要文本段落。我需要提取output1.png和output2.png。我在问题中添加了细节。(更新2)