如何使用 CV2 将图像的一部分切割成单独的图像?
How to use CV2 to cut portions of an image into separate images?
我有一个图像,其中包含许多相同大小的由空格分隔的矩形面板。我想将每个矩形面板分成自己的图像。关于如何去做有什么建议吗?
我想到了使用 cv2.floodfill
来填充面板之间的空白,然后反转遮罩。但是,这只会创建一个蒙版,而不是我可以用来识别坐标然后将面板拆分为图像的蒙版数组。
任何关于如何巧妙地做到这一点的指示将不胜感激。
您可以尝试在图像上应用轮廓,使用二值图像 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
我想到了使用 cv2.floodfill
来填充面板之间的空白,然后反转遮罩。但是,这只会创建一个蒙版,而不是我可以用来识别坐标然后将面板拆分为图像的蒙版数组。
任何关于如何巧妙地做到这一点的指示将不胜感激。
您可以尝试在图像上应用轮廓,使用二值图像 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