图像处理中缺少颜色信息
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
。我只是想分析得到黑色轮廓的巧合。
我正在学习使用 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
。我只是想分析得到黑色轮廓的巧合。