0

scipy の KMeans で画像を処理した後、量子化誤差を拡散するために Floyd-Steinberg ディザリングを使用します。指定されたデータは、グレースケールとカラーの両方の RGB ファイルです。問題は視覚化です-ディザリングはありません。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

im = Image.open('file.png').convert('RGB')
pic = np.array(im, dtype = np.float)/255
im.close()

KMeans の部分を省略して、Floyd-Steinberg に焦点を当てたいと思います。

"""pic - as above, original array; image - processed image"""

def dither(pic, image):
    v, c, s = pic.shape
    Floyd = np.copy(image)
    for i in range(1, v-1):
        for j in range(1, c-1):
            quan = pic[i][j] - image[i][j] #Quantization error
            Floyd[i][j + 1] = quan * (np.float(7 / 16)) + Floyd[i][j + 1]
            Floyd[i + 1][j - 1] = quan * (np.float(3 / 16)) + Floyd[i + 1][j - 1]
            Floyd[i + 1][j] = quan * (np.float(5 / 16)) + Floyd[i + 1][j]
            Floyd[i + 1][j + 1] = quan * (np.float(1 / 16)) + Floyd[i + 1][j + 1]
    return Floyd

Floyd = dither(pic, image)

plt.imshow(Floyd)
plt.show()

Floyd を pic に置き換えると、少しディザリングが発生しFloyd[i + 1][j] = quan * (np.float(5 / 16)) + pic[i + 1][j]ます。ただし、これは不適切なコードです。さらに、クラスターから色を処理する必要があるため、新しいピクセルをクラスターに再度評価します。どうすればそれを機能させることができますか?この重大な間違いはどこにありますか?

4

1 に答える 1