【问题标题】:Color information missing from image processing图像处理中缺少颜色信息
【发布时间】:2017-11-27 03:10:51
【问题描述】:

我正在学习使用 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')

我希望从修改后的莉娜图像中得到五颜六色的威利。像这样

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

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

【问题讨论】:

  • 您可以使用absdiff 方法来执行此操作。顺便说一句,如果可以的话,您应该始终提供expected 解决方案。 Difference 可以表示很多东西,严格来说是像素值差异或组合差异的差异。
  • 感谢您的评论。我确实犯了一个错误,以获取它们的像素值之间的差异并得到有趣的结果。预期的解决方案是中间的图像,右下角有一个五颜六色的井。但是,我很好奇为什么我只有在拥有 RGBA 像素值时才能得到黑色轮廓。

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


【解决方案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]

问题是因为 np.all 如果所有值都为 True 或它们的 Truthiness 值为 true,则返回 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])

【讨论】:

    【解决方案2】:

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

    例如,我检查右下角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 中为零。由于只有黑色轮廓具有从np.all 输出的false,因此我很幸运能够通过比较np.all 得到轮廓。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 2013-05-28
      • 1970-01-01
      • 2015-06-01
      • 2023-03-22
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多