图像处理中缺少颜色信息

Color information missing from image processing

我正在学习使用 numpy 来处理图像,但是缺少颜色信息。我想知道为什么会这样。

我的目标是提取两个图像之间的差异。

零步:加载库

import numpy as np
from PIL import Image

第一步:用RGBA信息矢量化图像

img_org = Image.open('lena.png').convert('RGBA')
arr_org = np.array(img_org)
img_mod = Image.open('lena_modified.png').convert('RGBA')
arr_mod = np.array(img_mod)
arr_diff= np.zeros_like(arr_mod)

第二步:通过逻辑规则找出两张图片的不同之处

for i in range(arr_mod.shape[0]) :
    for j in range(arr_mod.shape[1]) :
         if np.all(arr_mod[i, j]) == np.all(arr_org[i, j]):
             arr_diff[i,j] = (0,0,0,0)
         else :
             arr_diff[i, j] = arr_mod[i, j]

第三步:将图像RGBA信息切换回图像

img_diff = Image.fromarray(arr_diff, 'RGBA')
img_diff.save('ans_two.png')

我希望从修改后的莉娜形象中得到彩色的威利。像这样

但是,我不知道它只检测图像的 outline/black 部分。这有什么可能的原因吗?

免责声明:这是 homework 2017 年 Spring 南大开设的一门课程。我正在学习这门课程并自学。所以你不是在为我或其他任何人做作业。谢谢!

修改 RGB 比较应该可以解决此问题:

 if np.array_equal(arr_mod[i, j],arr_org[i, j]):
         arr_diff[i,j] = (0,0,0,0)
     else :
         arr_diff[i, j] = arr_mod[i, j]

问题是因为 np.all 如果所有值都为 True 或它们的 Truthiness 值为 true,则 np.all 将 return 为真,下面的示例将 return 在交互式控制台中为真

np.all([2,3,4,5]) == np.all([1,2,3,4])

这将在交互式控制台中 return 错误:

np.all([2,3,4,5]) == np.all([0,2,3,4])

让我更详细地解释一下我的错误。正如@Abhijith pk 的解释, np.all 不是用于比较数组值(这里是像素值)。用于检查数组中的所有值是否为True。

比如我检查右下角arr_org[511,511]=[ 75 18 18 255] & np.all([ 75 18 18 255])=True表示RGBA元素的none为零

然而,对于黑色轮廓,其 RGBA 将为 [ 0 0 0 255] & np.all([0 0 0 255])=False 表示某些 RGBA 元素为零。

我使用了错误的代码,但巧合的是我得到了大纲。这是因为在原始的 Lena 图像中, most/all 的 RGBA 像素值是非零且 np.all = True ;而在修改后的 Lena 图像中,Welly 的轮廓是黑色的,并且 RGBA 像素值 np.all = False 为零。由于只有黑色轮廓有np.all输出false,我很幸运通过np.all比较得到了轮廓。

同样,使用 np.all 对我来说是错误的。建议使用 np.array_equal。我只是想分析得到黑色轮廓的巧合。