使用 OpenCV 及 Tesseract 進行 OCR 辨識(2)-使用 OpenCV 進行影像前處理

NTT DATA IDI+ Platform
NTT DATA IDI+ Platform
7 min readApr 16, 2021

本文為「使用 OpenCV 及 Tesseract 進行 OCR 辨識」系列文章的第二篇「使用 OpenCV 進行影像前處理」,第一篇為「OCR 介紹」,第三篇則為「使用 Tesseract 進行 OCR 辨識」。

影像前處理

在上一篇「使用 OpenCV 及 Tesseract 進行 OCR 辨識(1)-OCR 介紹」文章中提到,我們要對影像進行 OCR 辨識之前,要先將辨識的影像進行前處理,來減少字元辨識的干擾。而所謂的影像前處理,就是將最初的影像經過一系列的處理後,讓最後的 OCR 辨識程式能有最佳的辨識結果。

常見的影像前處理方法包括:

  • 對影像進行縮放、翻轉、旋轉等幾何轉換
  • 二值化模糊化邊緣強化色彩空間轉換
  • 腐蝕、膨脹、開運算、閉運算等形態學轉換

常用的 Python 影像前處理套件有 Pillow 以及 OpenCV,以下將會以 OpenCV 的影像處理套件來示範上述常見的影像前處理方法。

OpenCV 全名為 Open Source Computer Vision Library,是一個跨平台的電腦視覺庫。由 Intel 發起並參與開發,並以 BSD 授權條款發行。OpenCV 可用於開發即時的圖像處理、電腦視覺以及圖形識別程式。

OpenCV 常用的影像前處理功能

要使用 OpenCV 套件來進行影像前處理,我們要先下載 OpenCV 套件,可以使用 pip install opencv-python 來下載,並在程式中 import cv2 即可使用 OpenCV 套件的 functions。

基本操作

  • 讀取影像:cv2.imread(filename, flags)
  • 顯示影像:cv2.imshow(window_name, image)
  • 儲存影像:cv2.imwrite(save_filename, image)
OpenCV 基本操作

幾何轉換

OpenCV 有許多 function 可以對影像進行幾何轉換,如影像的縮放翻轉旋轉等。

  • 縮放cv2.resize(image, size, interpolation)
將影像大小縮放成 300x300
  • 翻轉cv2.flip(image, flipCode)
將影像水平翻轉及垂直翻轉
  • 旋轉
M = cv2.getRotationMatrix2D(rotate_center, rotate_angle, ratio) 
rot_img = cv2.warpAffine(image, M, size)
將影像旋轉90度及30度

色彩空間轉換

在 OpenCV 中影像有多種色彩空間,包含 RGB、HSI、HSL、HSV、HSB 等,我們可以使用 cv2.cvtColor 來對影像進行色彩空間的轉換,例如我們可以將影像從 RGB 轉換成 GRAY,將 colorspace_num 設為 7 即可達成。

  • 灰階cv2.cvtColor(image, colorspace_num=7)
灰階

二值化

在做影像辨識時,通常會將影像進行二值化處理,讓影像色彩只剩下黑與白,使後續的辨識程式能更準確地判讀。

  • 簡單二值化 Simple Thresholdingcv2.threshold(image, thresh, maxval, cv2.THRESH_BINARY)[1]
  • 自適應二值化 Adaptive Thresholdingcv2.adaptiveThreshold(image, thresh, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, block size, delta)
二值化
  • 簡單二值化反轉 Simple Thresholding, Invertedcv2.threshold(image, thresh, maxval, cv2.THRESH_BINARY_INV)[1]
  • 自適應二值化反轉 Adaptive Thresholding, Invertedcv2.adaptiveThreshold(image, thresh, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, block size, delta)
二值化反轉

形態學轉換

影像在經過上述二值化處理後,有些字體並沒有特別清晰,這時候就可以透過形態學轉換的方法, 讓影像中的字體變得更清晰明顯。

  • 腐蝕cv2.erode(image, kernel, iterations=1)
  • 膨脹cv2.dilate(image, kernel, iterations=1)
  • 開運算cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
  • 閉運算cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
形態學轉換

模糊化

影像在經過二值化及形態學轉換等處理後,可能還是會有些雜訊影響影像辨識的結果,這時候可以使用 OpenCV 的模糊化處理 function 來進行影像平滑模糊化的處理。

  • Averaging Blur:cv2.blur(image, kernel_size)
  • Gaussian Blur:cv2.GaussianBlur(image, kernel_size, 0)
  • Median Blur:cv2.medianBlur(image, kernel_size)
模糊化

邊緣強化

當我們想要對原始影像進行分割時,可以透過 OpenCV 的邊緣強化 function 來作為分割的依據。

  • Laplacian:cv2.Laplacian(image, cv2.CV_64F)
  • Canny:cv2.Canny(image, low_threshold, high_threshold)
  • Sobel X:cv2.Sobel(image, cv2.CV_64F, 1, 0, kernel_size)
  • Sobel Y:cv2.Sobel(image, cv2.CV_64F, 0, 1, kernel_size)
邊緣強化

以上分享了許多在進行 OCR 辨識時,常會使用的影像前處理方法,以及如何使用 OpenCV 套件來實現。如果想要對 OpenCV 套件的方法或操作有深入的了解,可以到 OpenCV 官方文件去學習及查詢。

在下一篇文章中,將會示範再將影像透過 OpenCV 進行前處理之後,如何使用 Tesseract 進行 OCR 辨識。

--

--