如何提高图像质量? [英] How to improve image quality?

查看:73
本文介绍了如何提高图像质量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作一个读取ID卡的OCR.使用YOLO获得感兴趣的区域后,我将该裁剪的区域交给Tesseract进行阅读.由于这些裁切后的图像非常小且模糊,因此Tesseract无法读取它们.当它可以读取它们时,它给出了错误的预测.我认为,通过改善裁剪图像的图像质量,可以解决这些问题.

I am making an OCR which reads ID cards. After getting region of interest by using YOLO, I am giving that cropped region to Tesseract to read it. As those cropped images are very small and blurry, Tesseract is unable to read them. When it can read them, it gives wrong predictions. I think that by improving image quality of cropped images, these problems can be solved.

其中一张裁剪的图像:

One of the cropped images:

我的问题是,我将如何改善此类图像?

My question is, how would I go about improving such images?

推荐答案

@vasilisg的答案.是一个非常好的解决方案.对此进行进一步改进的一种方法是使用形态学打开操作去除残留的斑点.但是,这仅适用于小于图像中数字的线厚的斑点.另一个选择是使用openCV连接的组件模块删除少于N个像素的岛".例如,您可以执行以下操作:

The answer of @vasilisg. is a very nice sollution. One way to further improve upon this is to remove the remaining spots using a morphological opening operation. However, this will only work for spots smaller than the linethickness of the numbers in your image. Another option is to remove 'islands' of less than N pixels using the openCV connected components module. You could do this for example as following:

# External libraries used for
# Image IO
from PIL import Image

# Morphological filtering
from skimage.morphology import opening
from skimage.morphology import disk

# Data handling
import numpy as np

# Connected component filtering
import cv2

black = 0
white = 255
threshold = 160

# Open input image in grayscale mode and get its pixels.
img = Image.open("image.jpg").convert("LA")
pixels = np.array(img)[:,:,0]

# Remove pixels above threshold
pixels[pixels > threshold] = white
pixels[pixels < threshold] = black


# Morphological opening
blobSize = 1 # Select the maximum radius of the blobs you would like to remove
structureElement = disk(blobSize)  # you can define different shapes, here we take a disk shape
# We need to invert the image such that black is background and white foreground to perform the opening
pixels = np.invert(opening(np.invert(pixels), structureElement))


# Create and save new image.
newImg = Image.fromarray(pixels).convert('RGB')
newImg.save("newImage1.PNG")

# Find the connected components (black objects in your image)
# Because the function searches for white connected components on a black background, we need to invert the image
nb_components, output, stats, centroids = cv2.connectedComponentsWithStats(np.invert(pixels), connectivity=8)

# For every connected component in your image, you can obtain the number of pixels from the stats variable in the last
# column. We remove the first entry from sizes, because this is the entry of the background connected component
sizes = stats[1:,-1]
nb_components -= 1

# Define the minimum size (number of pixels) a component should consist of
minimum_size = 100

# Create a new image
newPixels = np.ones(pixels.shape)*255

# Iterate over all components in the image, only keep the components larger than minimum size
for i in range(1, nb_components):
    if sizes[i] > minimum_size:
        newPixels[output == i+1] = 0

# Create and save new image.
newImg = Image.fromarray(newPixels).convert('RGB')
newImg.save("newImage2.PNG")

在此示例中,我同时执行了打开和连接组件方法,但是,如果使用连接组件方法,通常可以省略打开操作.

In this example I have performed both the opening and connected component method, however if you use the connected component method you can usually omit the opening operation.

结果如下:

开启阈值后:

阈值化之后,打开并连接组件过滤:

After thresholding, opening and connected component filtering:

这篇关于如何提高图像质量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆