在使用来自 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[i + 1][j] = quan * (np.float(5 / 16)) + pic[i + 1][j]
。但是,这是不正确的代码!此外,我必须处理簇外的颜色,因此我再次将新像素评估为簇。我怎样才能让它工作?这个关键的错误在哪里?