在OpenCV(Python)

时间:2017-07-26 13:16:10

标签: python opencv extraction roi

我有以下代码,给定图像,它从中提取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)

这是用于运行代码的图片:

extracted.jpg

结果如下:

Extracted ROI

绿色很好,就像其他图像一样。

尽可能(勉强......)看,第五号(29.jpg)有问题。

Detailed ROI problem

char上方有一部分错过了提取的ROI。

我认为cv2.boundingRect()函数存在问题。要明确,这是一个例外。如果我给出更多的数字,让我们说它识别并提取10个附近的7位数。其他人有像上面那样的问题...

另外,我看到ROI矩形给自己的尺寸(宽度和高度)与他们找到的数字相匹配。

我尝试添加其他图像预处理,如自适应阈值或medianBlur,但它不会改变。也许是因为图像已经满足某些条件(例如白纸上的黑色书写......)

我还找到了link to another question,但我不明白问题是否与我相同..

为什么会这样?我要修改什么?我的意思是,甚至可以对边界矩形必须裁剪的区域“给出指令”吗?

如果有人可以提供帮助,我们将不胜感激。

谢谢

更新1:尝试使用cannyEdge过滤器,但是相同。已经尝试过膨胀和侵蚀,但结果是一样的.. 现在我真的认为问题可能是OpenCV核心内的boundingRect函数。

0 个答案:

没有答案