图像处理中遗漏的颜色信息

时间:2017-11-27 03:10:51

标签: image python-3.x numpy python-imaging-library rgba

我正在学习使用numpy来操作图像,但缺少颜色信息。我想知道为什么会发生这种情况。

我的目标是提取两张图片之间的差异。

Toy problem: Extract Welly from the graph.

零步骤:加载库

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')

我希望从改良的Lena图像中获得丰富多彩的Welly。像这样 enter image description here

但是,我不知道它只检测图像的轮廓/黑色部分。任何可能的原因?

enter image description here

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

2 个答案:

答案 0 :(得分:1)

修改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]

问题是因为如果所有值都为True或者其Truthiness值为true,则np.all将返回True,以下示例将在交互式控制台中返回true

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

这将在交互式控制台中返回false:

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

答案 1 :(得分:0)

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

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

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

我使用错误的代码,但我巧妙地得到了大纲。这是因为在原始Lena图像中,大部分/全部RGBA像素值都是非零且np.all = True;在修改后的Lena图像中,Welly的轮廓为黑色,并且在RGBA像素值np.all = False中为零。由于只有黑色轮廓具有来自false的{​​{1}}输出,因此我很幸运能够通过比较np.all获得大纲。

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