我正在尝试制作一个小脚本来切换图像的rgb值。我的代码可以改变图像,但与排列列表相比,图像列表无序。我一直无法弄清楚为什么索引3和4处的图像按顺序切换。
from skimage import io
import numpy as np
import itertools
def create_permutations_auto(image):
im_col = np.split(image, 3, axis = -1)
color_keys = ["red", "green", "blue"]
colors = dict(zip(color_keys, im_col))
cp = list(itertools.permutations(color_keys))
im_list = []
for perm in cp:
color_data = [colors.get(k) for k in perm]
image = np.squeeze(np.stack(color_data, axis = -1))
im_list.append(image)
return cp, im_list
orig = io.imread(filename)
text, image_perms = create_permutations_auto(orig)
for i in range(len(image_perms)):
print text[i]
io.imshow(image_perms[i])
io.imsave(filepath + "{}_{}_{}.png".format(text[i][0], text[i][1], text[i][2]), image_perms[i])
io.show()
我希望这段代码输出原始图像,绿色值代替红色,蓝色值代替绿色,红色值代替蓝色代替创建的第四个图像。但是,我得到的是蓝色→红色,红色→绿色,绿色→蓝色。创建的第五个图像看起来应该是第四个。
第三张图片(应为绿色,蓝色,红色):
第四张图片(应为蓝色,红色,绿色):
为了查看它是否与字典的顺序有关,我尝试手动进行排列。使用以下内容:
def create_permutations(image):
red, green, blue = np.split(image, 3, axis = -1)
perms = []
perms.append(np.squeeze(np.stack((red, blue, green), axis = -1)))
perms.append(np.squeeze(np.stack((green, red, blue), axis = -1)))
perms.append(np.squeeze(np.stack((green, blue, red), axis = -1)))
perms.append(np.squeeze(np.stack((blue, green, red), axis = -1)))
perms.append(np.squeeze(np.stack((blue, red, green), axis = -1)))
return perms
此代码似乎也切换了两个相同排列的位置,尽管它是索引2和4处的图像。对于这个简单的例子,我可以切换它们但似乎我在这里缺少一些基本的东西。我在运行Windows 10的机器上使用Python(x,y)分发与Python 2.7.10和numpy 1.12.1。
答案 0 :(得分:0)
频谱置换的影响与空间置换的影响不同。将原始图像拆分为其色带时,称为red
,green
和blue
,然后将其重新排列为blue
,red
和green
,结果图像中从左到右的颜色顺序为绿 - 蓝 - 红(光谱置换),而不是蓝 - 红 - 绿(空间排列)。
下图旨在示意性地解释这种反直觉的结果。为了清楚起见,我们分别表示具有索引0,1和2的红色,绿色和蓝色色度通道。从图中可以清楚地看出,图像最左边区域的像素强度是通过从[255, 0, 0]
到[0, 255, 0]
的变换来转换的。实际上,在置换图像的最左边区域,像素的强度是{0}为频道0(红色分量),0
为频道1(绿色分量),255
为频道2(蓝色分量)。这就是为什么图像最左边区域的颜色从红色变为绿色的原因。类似的论点适用于中心和最右边的区域。
<强>加成强>
您可以像这样简化您的功能:
0