【发布时间】:2020-09-04 18:03:21
【问题描述】:
所以我有一个预定义的调色板,我想用它为图片着色。 我正在研究如何做到这一点,到目前为止发现了这一点。
import scipy.spatial as sp
import matplotlib.pyplot as plt
import cv2
import numpy
avg = image.open("sourcefile.png")
#Color palette I would ike to use
main_colors = [(100, 100, 100),
(204, 0, 0),
(0, 174, 0),
(102, 51, 153),
(255, 102, 0),
(0, 0, 155)]
h, w, bpp = numpy.shape(avg)
# Change colors of each pixel
for py in range(0, h) :
for px in range(0, w):
input_color = avg[py][px][0], avg[py][px][1], avg[py][px][2]
tree = sp.KDTree(main_colors)
distance, result = tree.query(input_color)
nearest_color = main_colors[result]
avg[py][px][0] = nearest_color[0]
avg[py][px][1] = nearest_color[1]
avg[py][px][2] = nearest_color[2]
# show image
plt.figure()
plt.axis("off")
plt.imshow(avg)
我相信,我真的很接近解决方案,但是,我似乎做不到。有人可以帮我调试吗? 我一直收到这个,我不知道如何解决这个问题
File "/Average Pictures.py", line 22, in <module>
input_color = avg[py][px][0], avg[py][px][1], avg[py][px][2]
TypeError: 'Image' object is not subscriptable
看了@Quang Hong 的评论后,我也修改了代码:
import scipy.spatial as sp
import matplotlib.pyplot as plt
import cv2
import numpy
...
...
...
# Blending loaded Images
avg = Image.open(imlist[0])
for i in range(1, N):
img = Image.open(imlist[i])
avg = Image.blend(avg, img, 1.0 / float(i + 1))
avg1 = Image.new("RGB", avg.size)
avg1 = asarray(avg1)
main_colors =numpy.array([(100, 100, 100),
(204, 0, 0),
(0, 174, 0),
(102, 51, 153),
(255, 102, 0),
(0, 0, 155),
])
main_colors = numpy.array(main_colors)
dist_mat = sp.distance_matrix(avg1.reshape(-1,3), main_colors)
color_idx = dist_mat.argmax(axis=1)
nearest_colors = main_colors[color_idx].reshape(avg1.shape)
fig, axes = plt.subplots(1, 2)
axes[0].imshow(avg) # original image
axes[1].imshow(nearest_colors) # nearest_color
plt.show()
但是现在的问题是,它没有输出正确的图像。
有人可以帮忙吗? 对不起,我是一个绝对的菜鸟。
【问题讨论】:
-
你不需要执行 image.load 吗? stackoverflow.com/questions/1109422/…
-
尝试将
avg = image.open("sourcefile.png")替换为avg = cv2.imread("sourcefile.png",mode='RGB')。如果没有工作请在这里print(type(avg))能够提供更好的帮助。
标签: python python-3.x numpy scipy