如何使用CV2将图像的一部分切割成单独的图像?

2024-04-20 14:15:22 发布

您现在位置:Python中文网/ 问答频道 /正文

enter image description here我有一个图像,其中包含许多大小相同的矩形面板,用空格分隔。我想把每个矩形面板分割成它自己的图像。有什么建议吗

我想用cv2.floodfill填充面板之间的空白,然后反转遮罩。但是,这只创建了一个遮罩,而不是一组遮罩,我可以用它们来识别坐标,然后将面板分割成图像

任何关于如何巧妙地做到这一点的建议都将不胜感激


1条回答
网友
1楼 · 发布于 2024-04-20 14:15:22

您可以尝试在图像上应用轮廓,使用二值图像cv2.THRESH_BINARY比灰度图像更有效的轮廓 -&燃气轮机;应用等高线

过滤轮廓

第一个过滤器-是第一级with no parent Contours Hierarchy

第二个过滤器-具有相同范围的矩形,偏差为1%

然后是轮廓边界框和切片图像

import numpy as np
import cv2 as cv
filename = r'UcbZn.jpg'
im = cv.imread(filename)
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 240, 255, cv.THRESH_BINARY)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

# Filter -1 Filtering countours with first level with no parent
a = [[cv.contourArea(c), h, c] for c, h in zip(contours, hierarchy[0]) if h[3]==0]
a.sort(key=lambda x: -x[0])

base_contour = a[0]
# Filter-2 contours of rectangle size
res = [c for c in a if c[0] >= base_contour[0]*0.99]


count = 0
for c in res:
    x,y,w,h = cv.boundingRect(c[2])
    cv.imwrite('objects_{}.jpg'.format(str(count)), im[y:y+h,x:x+w, :])
    count+=1
      

enter image description here

相关问题 更多 >