2016-05-17 60 views
0

我有一张脸的jpg图片,我需要逐个像素地访问图片(知道每个像素的值是什么),并使用某种DFS来更改背景颜色。Python - 从numpy数组中丢失真像素的图像

image = Image.open("pic.jpg") 
image = np.array(image) 

首先,为什么数组的形状(473,354,3)?这对我没有意义。

当我做

plt.imshow(image.reshape(473, -1)) 
plt.show() 

我得到的图片,看起来像以下,其中只包含红色,蓝色和黄色(以及三者的混合物?)

这意味着,数组中的值不是我可以可靠地用来做出我的边缘检测决定的值。

为什么,我该怎么办?

enter image description here

我想要的像素值,以反映原始图像的真实色彩,而不是像上面这样。

实际图片中的背景是有点白,我希望它们和所有其他像素值保持这种方式,所以我可以实现我的算法。

回答

1

3是因为每种颜色(蓝色,绿色红色)在数组中都有自己的入口。

对于边缘检测,您可能最好将图像合拢到B & W. OpenCV具有cv2.cvtColor(image,cv2.COLOR_BGR2GRAY),可以实现这一功能。

+0

所以(473,354,3)意味着:高度是473,宽度是354,并且数组中的每个值都是一个3元组? – Jobs

+0

@准确的工作。此外,显示的颜色不是真实图片中的颜色,但是它是一个显示特定颜色以获得较高值的颜色映射。因此,如果您输入尺寸为(h,w,(RGB))的图片,可能只会考虑红色值。当(红色)值较高时,它将显示红色,而低值(红色)则显示为蓝色。您可能应该转换为黑白色,并且不要直接采用颜色(或切换到黑白色图)。 – syntonym

+0

非常感谢!这就说得通了。所以现在我已经成功完成了任务 - 将我的照片背景改为白色。图片的大小从60 kb下降到20 kb。你们知道为什么吗?这是正常的/预期的吗? @syntonym和charles。 – Jobs