gpt4 book ai didi

python - 如何从文档中删除图像的边框(如 MNIST 手写字符)?

转载 作者:太空宇宙 更新时间:2023-11-03 21:21:23 24 4
gpt4 key购买 nike

我想提取像这样写在盒子里的手写字符。 Form field

我正在提取宽度为 29 像素的正方形,这会给我这样的图像。

Extracted images 1 Extracted Images 2 Extracted Images 3

要正确识别字符,单个字符图像需要非常干净。像这样,

Clean chars 1 Clean chars 2

我在做什么,

  1. 计算水平和垂直投影每张图片。
  2. 遍历两个数组的每个元素。如果projection 的值大于某个阈值,则表示没有遇到边界。它会删除边框周围的空白。

  3. 然后在图像中找到轮廓。

  4. 如果轮廓面积大于某个阈值。获取边界矩形并裁剪它。

但问题是,这种方法并不那么准确。在某些情况下,它工作正常,但在大多数情况下,如果失败得很惨。它会生成像

这样的图像

enter image description here enter image description here

投影值也非常特定于此图像(或更接近此图像的图像)。它不能很好地泛化。

有没有其他方法可以很好地应对这种情况?

代码,

char = cv2.imread(image)
char_gray = cv2.cvtColor(char, cv2.COLOR_BGR2GRAY)
char_bw = cv2.adaptiveThreshold(char_gray, 255,
cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 9)

(rows, cols) = char_gray.shape

bit_not = cv2.bitwise_not(char_bw)
proj_h = cv2.reduce(bit_nv2.REDUCE_AVG)

proj_v = cv2.reduce(bit_not, 0, cv2.REDUCE_AVG)

thresh_h = 200
thresh_v = 100

start_x, start_y, end_x, end_y = 0, 0, cols - 1, rows - 1
#proj_h = proj_h[0]
proj_v = proj_v[0]

num_iter_h = cols // 8
num_iter_v = rows // 8

for _ in range(num_iter_h):
if proj_h[start_y][0] > 35:
start_y += 1

for _ in range(num_iter_h):
if proj_h[end_y][0] > 160:
end_y -= 1

for _ in range(num_iter_v):
if proj_v[start_x] > 15: #25:
start_x += 1

for _ in range(num_iter_v):
if proj_v[end_x] > 125:
end_x -= 1

print('processing.. %s.png' % idx)
output_char = char[start_y:end_y, start_x:end_x]
output_char = get_cropped_char(output_char)
return output_char


def get_cropped_char(img):
"""
Returns Grayscale cropped image
"""

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

blur = cv2.GaussianBlur(img, (3,3), 0)

thresh = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 75, 10)
im2, cnts, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

contour = None
for c in cnts:
area = cv2.contourArea(c)
if area > 100:
contour = c
if contour is None: return None
(x, y, w, h) = cv2.boundingRect(contour)
img = img[y:y+h, x:x+w]
return img

最佳答案

我认为在图像阈值后直接裁剪字符不是一个好方法。我相信 morphy-op 可以大放异彩。

block 元素排列整齐,所以尝试使用 morphy-erode-op 来分离 block (或去除 block 边界)。一旦您获得了 clean 字符图像,您就可以轻松裁剪字符图像。

...

英语不好,哈哈哈


这是我得到的结果。

裁剪图像。

enter image description here

步骤:

enter image description here

关于python - 如何从文档中删除图像的边框(如 MNIST 手写字符)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46558854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com