在 ROI 之后对图像进行排序(Python,OpenCV)
Sort images after ROI (Python, OpenCV)
我几乎是 OpenCV 世界的新手。我正在做一个项目,需要(现在)检测图像中的数字,select 它们并保存。
这是我使用的代码:
# Importing modules
import cv2
import numpy as np
# Read the input image
im = cv2.imread('C:\Users\User\Desktop\test.png')
# Convert to grayscale and apply Gaussian filtering
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im_gray = cv2.GaussianBlur(im_gray, (5, 5), 0)
# Threshold the image
ret, im_th = cv2.threshold(im_gray, 90, 255, cv2.THRESH_BINARY_INV)
# Find contours in the image
image, ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Bounding rectangle for a set of points
i = 0
#rects = [cv2.boundingRect(ctr) for ctr in ctrs]
#rects.sort()
for ctr in ctrs:
x, y, w, h = cv2.boundingRect(ctrs[i])
# Getting ROI
roi = im[y:y+h, x:x+w]
#cv2.imshow('roi',roi)
#cv2.waitKey()
i += 1
cv2.imwrite('C:\Users\User\Desktop\crop\' + str(i) + '.jpg', roi)
#print(rects)
print("OK - NO ERRORS")
成功了一半。问题是输出数字(以图像格式,它需要那样)没有按原始图像排序(如下)。
这是输出:
代码有什么问题?
此外,您可以记下 rects
变量。我用它做了一些调试,我注意到一件有趣的事情:如果我对它的内容进行排序,在控制台中图像顺序是正确的。
有没有办法按原始顺序对图像进行排序?
我也看到了这个但是我看不懂解决方法
非常感谢。
没有自然顺序,因为 ROI 可以在二维中展开 space。
如果你想按 x 坐标排序,你可以这样做:
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])
然后循环 sorted_ctrs
而不是 ctrs
.
编辑:更准确地说:
import cv2
import numpy as np
# Read the input image
im = cv2.imread('JnUpW.png')
# Convert to grayscale and apply Gaussian filtering
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im_gray = cv2.GaussianBlur(im_gray, (5, 5), 0)
# Threshold the image
ret, im_th = cv2.threshold(im_gray, 90, 255, cv2.THRESH_BINARY_INV)
# Find contours in the image
image, ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Sort the bounding boxes
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])
for i, ctr in enumerate(sorted_ctrs):
# Get bounding box
x, y, w, h = cv2.boundingRect(ctr)
# Getting ROI
roi = im[y:y+h, x:x+w]
# Write to disk
cv2.imwrite(str(i) + '.jpg', roi)
#print(rects)
print("OK - NO ERRORS")
我几乎是 OpenCV 世界的新手。我正在做一个项目,需要(现在)检测图像中的数字,select 它们并保存。
这是我使用的代码:
# Importing modules
import cv2
import numpy as np
# Read the input image
im = cv2.imread('C:\Users\User\Desktop\test.png')
# Convert to grayscale and apply Gaussian filtering
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im_gray = cv2.GaussianBlur(im_gray, (5, 5), 0)
# Threshold the image
ret, im_th = cv2.threshold(im_gray, 90, 255, cv2.THRESH_BINARY_INV)
# Find contours in the image
image, ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Bounding rectangle for a set of points
i = 0
#rects = [cv2.boundingRect(ctr) for ctr in ctrs]
#rects.sort()
for ctr in ctrs:
x, y, w, h = cv2.boundingRect(ctrs[i])
# Getting ROI
roi = im[y:y+h, x:x+w]
#cv2.imshow('roi',roi)
#cv2.waitKey()
i += 1
cv2.imwrite('C:\Users\User\Desktop\crop\' + str(i) + '.jpg', roi)
#print(rects)
print("OK - NO ERRORS")
成功了一半。问题是输出数字(以图像格式,它需要那样)没有按原始图像排序(如下)。
这是输出:
代码有什么问题?
此外,您可以记下 rects
变量。我用它做了一些调试,我注意到一件有趣的事情:如果我对它的内容进行排序,在控制台中图像顺序是正确的。
有没有办法按原始顺序对图像进行排序?
我也看到了这个
非常感谢。
没有自然顺序,因为 ROI 可以在二维中展开 space。
如果你想按 x 坐标排序,你可以这样做:
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])
然后循环 sorted_ctrs
而不是 ctrs
.
编辑:更准确地说:
import cv2
import numpy as np
# Read the input image
im = cv2.imread('JnUpW.png')
# Convert to grayscale and apply Gaussian filtering
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im_gray = cv2.GaussianBlur(im_gray, (5, 5), 0)
# Threshold the image
ret, im_th = cv2.threshold(im_gray, 90, 255, cv2.THRESH_BINARY_INV)
# Find contours in the image
image, ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Sort the bounding boxes
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])
for i, ctr in enumerate(sorted_ctrs):
# Get bounding box
x, y, w, h = cv2.boundingRect(ctr)
# Getting ROI
roi = im[y:y+h, x:x+w]
# Write to disk
cv2.imwrite(str(i) + '.jpg', roi)
#print(rects)
print("OK - NO ERRORS")