列表元素的顺序似乎正在改变

时间:2017-05-06 01:56:37

标签: python-2.7 numpy rgb scikit-image

我正在尝试制作一个小脚本来切换图像的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()

我希望这段代码输出原始图像,绿色值代替红色,蓝色值代替绿色,红色值代替蓝色代替创建的第四个图像。但是,我得到的是蓝色→红色,红色→绿色,绿色→蓝色。创建的第五个图像看起来应该是第四个。

第三张图片(应为绿色,蓝色,红色)

Third Image (should be green, blue, red)

第四张图片(应为蓝色,红色,绿色)

Fourth Image(should be blue, red, green)

为了查看它是否与字典的顺序有关,我尝试手动进行排列。使用以下内容:

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。

1 个答案:

答案 0 :(得分:0)

频谱置换的影响与空间置换的影响不同。将原始图像拆分为其色带时,称为redgreenblue,然后将其重新排列为blueredgreen,结果图像中从左到右的颜色顺序为绿 - 蓝 - 红(光谱置换),而不是蓝 - 红 - 绿(空间排列)。

下图旨在示意性地解释这种反直觉的结果。为了清楚起见,我们分别表示具有索引0,1和2的红色,绿色和蓝色色度通道。从图中可以清楚地看出,图像最左边区域的像素强度是通过从[255, 0, 0][0, 255, 0]的变换来转换的。实际上,在置换图像的最左边区域,像素的强度是{0}为频道0(红色分量),0为频道1(绿色分量),255为频道2(蓝色分量)。这就是为什么图像最左边区域的颜色从红色变为绿色的原因。类似的论点适用于中心和最右边的区域。

blue-red-green

<强>加成

您可以像这样简化您的功能:

0
相关问题