誤差拡散法で画像を白黒2値化する
近年、様々な分野でデータの可視化や処理に関する技術が急速に進歩しています。特に、画像処理においては、高度な技術が未だに発展途中であり、特に黒白画像においては実用的な技術が重要です。本記事では、pythonを使用して、誤差拡散法で画像を白黒2値化する方法について解説します。
白黒画像について
白黒画像は、画像処理において基礎的なもので、画像の輝度がある一定の閾値を超えれば白、それ以外は黒とする二値化処理が一般的です。しかし、二値化処理では、画像が白か黒に潰れ、画像の情報が失われるといった問題があります。
誤差拡散法とは
誤差拡散法は、白黒2値化の中でも画質の良い処理が可能であり、画像のエッジを綺麗に検出できることが特徴です。すなわち、必要最低限の領域に細かくビットマップすることで、誤差を拡散させながら画質を高く保つことができます。このため、特許では白黒画像しか使えず、かつ画像情報を維持したまま処理したい場合に使用すると適しているといえます。
このアルゴリズムでは、まず、画像の各ピクセルの輝度値を取得し、閾値を基準に白か黒かに変換します。その後、誤差を計算し、周囲のピクセルに拡散させながら画像を処理していきます。
pythonでの実装
pythonを使用して、誤差拡散法で画像を白黒2値化するサンプルコードを以下に示します。前提として、OpenCVがインストール済みであることを指摘しておきます。
import cv2
# 画像を読み込む
img = cv2.imread('input.png', cv2.IMREAD_GRAYSCALE)
# 2値化するために、閾値を128に設定する
thresholdGray = 128
thresholdBrack = 255-10
thresholdWrite = 10
edges = cv2.Canny(img, 100, 200)
# 誤差拡散法による二値化を実行する
for y in range(img.shape[0]):
for x in range(img.shape[1]):
old_pixel = img[y, x]
if old_pixel > thresholdBrack:
img[y,x] = 255
elif old_pixel < thresholdWrite:
img[y,x] = 0
else:
new_pixel = 255 if old_pixel > thresholdGray else 0
img[y, x] = new_pixel
quant_error = old_pixel - new_pixel
# 誤差を隣接するピクセルに拡散する
if x < img.shape[1] - 1:
img[y, x + 1] += quant_error * 7. / 16
elif x > 0 and y < img.shape[0] - 1:
img[y + 1, x - 1] += quant_error * 3. / 16
elif y < img.shape[0] - 1:
img[y + 1, x] += quant_error * 5. / 16
elif x < img.shape[1] - 1 and y < img.shape[0] - 1:
img[y + 1, x + 1] += quant_error * 1. / 16
img = cv2.bitwise_not(cv2.bitwise_not(img) + edges)
# 2値化された画像を保存する
cv2.imwrite('output.png', img)
このサンプルコードでは、誤差拡散法の基本アルゴリズムをそのまま実装しています。処理する画像ファイル名は、input.png
としていますが、実際に使用する場合は、適したファイル名に変更する必要があります。
まとめ
この記事では、誤差拡散法を使用して、画像を白黒2値化する方法について解説しました。このアルゴリズムを使用することで、画像の情報を維持しながら処理が可能となります。Pythonを使用して、誤差拡散法を実装する際には、OpenCVが必要となります。是非、本記事を参考にして、誤差拡散法を使用した画像処理に挑戦してください。