IDカードを読み取るocrを作成しています。 YOLOを使用して関心領域を取得し、そのトリミングされた領域をtesseractに渡して読み取った後。これらのトリミングされた画像は非常に小さくぼやけているため、正八胞体はそれらを読み取ることができません。それはまた間違った予測を与え、それは非常に迷惑です!切り抜いた画像の画質を改善することで問題は解決できると思います。
そのような画像を改善する方法はありますか?
@vasilisgの答え。とても素敵なソリューションです。これをさらに改善する1つの方法は、形態学的なオープニング操作を使用して残りのスポットを削除することです。ただし、これは、画像内の数字の線の太さよりも小さいスポットに対してのみ機能します。別のオプションは、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")
この例では、開封法と連結成分法の両方を実行しましたが、連結成分法を使用する場合は、通常、開封操作を省略できます。
結果は次のようになります。
これを行う1つの方法は、画像をグレースケールに変換し、しきい値を使用してすべてのピクセルと比較して、画像を黒にするか白にするかを決定することです。 Pillow は、このタイプの処理に使用できるライブラリです。
from PIL import Image
black = (0,0,0)
white = (255,255,255)
threshold = (160,160,160)
# Open input image in grayscale mode and get its pixels.
img = Image.open("image.jpg").convert("LA")
pixels = img.getdata()
newPixels = []
# Compare each pixel
for pixel in pixels:
if pixel < threshold:
newPixels.append(black)
else:
newPixels.append(white)
# Create and save new image.
newImg = Image.new("RGB",img.size)
newImg.putdata(newPixels)
newImg.save("newImage.jpg")
結果画像: