我有以下代码,给定图像,它从中提取ROI。
警告:代码将保存桌面上所有提取的ROI(45个文件)。
import cv2
extr_path = ('C:\\Users\\Bob\\Desktop\\')
# Read the input image
im = cv2.imread(extr_path + 'extracted.jpg')
# 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])
# Extract ROI
i = 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]
cv2.imwrite('C:\\Users\\Bob\\Desktop\\' + str(i) + '.jpg', roi)
这是用于运行代码的图片:
结果如下:
绿色很好,就像其他图像一样。
尽可能(勉强......)看,第五号(29.jpg
)有问题。
char上方有一部分错过了提取的ROI。
我认为cv2.boundingRect()函数存在问题。要明确,这是一个例外。如果我给出更多的数字,让我们说它识别并提取10个附近的7位数。其他人有像上面那样的问题...
另外,我看到ROI矩形给自己的尺寸(宽度和高度)与他们找到的数字相匹配。
我尝试添加其他图像预处理,如自适应阈值或medianBlur,但它不会改变。也许是因为图像已经满足某些条件(例如白纸上的黑色书写......)
我还找到了link to another question,但我不明白问题是否与我相同..
为什么会这样?我要修改什么?我的意思是,甚至可以对边界矩形必须裁剪的区域“给出指令”吗?
如果有人可以提供帮助,我们将不胜感激。
谢谢
更新1:尝试使用cannyEdge过滤器,但是相同。已经尝试过膨胀和侵蚀,但结果是一样的.. 现在我真的认为问题可能是OpenCV核心内的boundingRect函数。