openCV

【OpenCV】誤差拡散ディザリング(python)

誤差拡散ディザリング

任意の閾値を定め、各画素と比較して、閾値より小さければ0を出力し、大きければ255を出力する。

ただし、次の画素は本来の画素から出力する値(0 or 255)を差し引いて誤差を求め、再度その誤差と閾値を比べます。

グレースケールを例にとると、単純な閾値との比較ではでは一律、相対的に暗い部分(0に近い)が黒く塗りつぶされ、明るい部分(256に近い)が白くなってしまいますが、誤差拡散ディザリングの場合は、元の画素に求めた誤差を加算した上で閾値との比較をする事でそれを防ぐ事ができるようになります。

元の画像
誤差拡散ディザリング

基本的な使い方

サンプルでは閾値を128に設定しています。

( 画素の値 + 誤差 )が128より小さい場合

元の画素 + 誤差 – 0を次の誤差とする。

( 画素の値 + 誤差 )が128より大きい場合

元の画素 + 誤差 -255を次の誤差とする。

サンプルコード

import cv2
import numpy as np
import random as rand


file_cat = 'img/cat.jpg'

color = cv2.imread(file_cat , 1) 
gray = cv2.imread(file_cat , 0) #グレースケール

height, width = gray.shape # 高さ・幅取得

thresh = 128 # 閾値
gosa = 0 # 誤差

for i in range(height):
    for j in range(width):
        if gray[i][j] + gosa < thresh:
            gosa = gray[i][j] + gosa - 0 # 誤差を計算
            gray[i][j] = 0
        else:
            gosa = gray[i][j] + gosa - 255 # 誤差を計算
            gray[i][j] = 255


while 1:
    cv2.imshow("gray", gray)
    
    k = cv2.waitKey(1)
    
    if k == ord('q'): # Qキーが押されたら終了
        break
        
cv2.destroyAllWindows()