我正在学习使用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')
我希望从改良的Lena图像中获得丰富多彩的Welly。像这样
但是,我不知道它只检测图像的轮廓/黑色部分。任何可能的原因?
免责声明:这是2017年春季在南大提供的课程homework。我正在学习这门课程并自学。所以你不是为我或其他任何人做作业。谢谢!
答案 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
。我只想分析获得黑色轮廓的巧合。