python-3.x - 使用 KMeans 进行 Floyd 抖动
问题描述
在使用 KMeans 之后,我正在尝试在 Python 中实现 Floyd-Steinberg 抖动。我意识到,在抖动之后,我收到了不包含在缩小调色板中的颜色,所以我再次使用 KMeans 修改图像。但是,在尝试使用这张图片时,我完全看不到抖动。我被卡住了,我累了——请帮帮我。我的想法几乎消失了。
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
k = 16
im = Image.open('Image.png').convert('RGB') #Image converted to RGB
pic = np.array(im, dtype = np.float)/255 #Enables imshow()
im.close()
def kmeans(pic): #Prepares algorithmic data
v, c, s = pic.shape
repic = np.resize(pic, (c*v, 3))
kme = KMeans(n_clusters = k).fit(repic)
cl = kme.cluster_centers_
return kme, cl, repic, v, c
kme, cl, repic, v, c = kmeans(pic)
pred = kme.predict(repic)
def picture(v, c, cl, pred): #Creates a picture with reduced colors
image = np.ones((v, c, 3))
ind = 0
for i in range(v):
for j in range(c):
image[i][j] = cl[pred[ind]]
ind+=1
return image
image = picture(v, c, cl, pred)
def dither(pic, image): #Floyd-Steinberg dithering
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]
Floyd[i][j + 1] = quan * (np.float(7 / 16)) + pic[i][j + 1]
Floyd[i + 1][j - 1] = quan * (np.float(5 / 16)) + pic[i + 1][j - 1]
Floyd[i + 1][j] = quan * (np.float(3 / 16)) + pic[i + 1][j]
Floyd[i + 1][j + 1] = quan * (np.float(1 / 16)) + pic[i + 1][j + 1]
return Floyd
fld = dither(pic, image)
a1, a2, reim, a3, a4 = kmeans(fld)
lab = kme.predict(reim)
Floyd = picture(v, c, cl, lab)
plt.imshow(Floyd)
plt.show()
解决方案
推荐阅读
- typescript - ts 生成一个带有错误的 js(预期在 'case' 之前有一个 'break' 语句
- ruby-on-rails - devise-async 不使用 sidekiq 执行入队作业
- python-3.x - 使用 Python 按字母顺序对 MS Word 段落进行排序
- java - JPA 实体类中@ManyToOne 的可选属性的目的是什么?
- unreal-engine4 - 为什么在发布中未启用 InsertChildAt
- svn - TortoiseSVN - 恢复搁置文件的内容
- python - 如何仅对分组的列进行分组和添加
- javascript - LocomotiveScroll 在我检查元素之前无法工作
- reactjs - 使用反应钩子访问循环中的 id
- javascript - 单击此按钮时如何运行此 node.js