【发布时间】:2019-09-16 09:33:28
【问题描述】:
我使用 Floyd-Steinberg 抖动,以便在使用 scipy 中的 KMeans 处理图像后分散量化误差。给定的数据是 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]。但是,这是不正确的代码!此外,我必须处理簇外的颜色,因此我再次将新像素评估为簇。我怎样才能让它工作?这个重大错误在哪里?
【问题讨论】:
-
什么是
image?你是怎么处理的?你对这个过程有一个根本性的误解。您应该只有一个图像:您修改输入灰度值图像,将每个像素设置为 0 或 1,并将与原始值的差异传播到仍要处理的下一个像素。这意味着您的算法应该只从Floyd读取,而不是从image或pic读取。而Floyd应该是原始图像pic的副本。 -
感谢您的回答。我设法改进了代码,并希望将其发布为 aswer。但是,由于某些情况,我只能在星期一坐下来。尽管在阅读您的提示之前我已经纠正了错误,但我认为您的评论非常有用。我希望我在三天前读到那些基本的误解,当时我开始与代码进行斗争......
标签: python-3.x image-processing k-means quantization dithering