python - 如何提高图像质量?
问题描述
我正在制作一个读取身份证的 OCR。通过使用 YOLO 获得感兴趣的区域后,我将该裁剪区域提供给 Tesseract 以读取它。由于这些裁剪后的图像非常小且模糊,Tesseract 无法读取它们。当它可以阅读它们时,它会给出错误的预测。我认为通过提高裁剪图像的图像质量,可以解决这些问题。
我的问题是,我将如何改进这些图像?
解决方案
@vasilisg 的答案。是一个非常好的解决方案。进一步改进这一点的一种方法是使用形态学打开操作去除剩余的斑点。但是,这仅适用于小于图像中数字线厚的点。另一种选择是使用 openCV 连接组件模块删除小于 N 像素的“孤岛”。例如,您可以这样做:
# 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")
在这个例子中,我已经执行了打开和连接组件方法,但是如果您使用连接组件方法,您通常可以省略打开操作。
结果如下所示:
推荐阅读
- java - 应该如何实时计算加速度计数据(jerk)的时间导数(Java)?
- java - 为什么我得到的结果与我的预期相反?
- javascript - 使用 onStepChangingMethod (jquery-steps) 检查所有输入
- python-3.x - 如何在 20 更新后修复 pip 错误
- c++ - 如何在不传递参数数量且仅使用 3 个点的情况下使用可变参数函数?
- python - 熊猫计数范围在两个数据框中
- python - 在python中获取小数点右边的值
- ios - 本地化 iOS Info.plist 隐私字符串
- docker - Dockerized JMeter 不向 Dockerized 微服务发送请求
- javafx - 将 JavaFX 应用程序构建为 Singleton