在Matlab和Python中读取图像RGB像素值时绿色值不同
我想从图片中获取RGB的像素值。我在Matlab和Python中都做过这个,但得到的值不一样,尤其是绿色的值。
如果你对此有任何建议,我会很感激。谢谢!
这是我在Python中的代码:
from PIL import Image
import numpy as np
im = Image.open("lena.jpg")
imPixelVal = np.ones(np.size(im))
imSize = np.size(im)
for i in range (0,imSize[0]):
for j in range (0,imSize[1]):
ij = i , j
p = im.getpixel(ij)
imPixelVal[i,j] = (0.2989 * p[0]) + (0.5870 * p[1]) + (0.1140 * p[2])
print p[0]
print p[1]
print p[2]
还有这是我在Matlab中的代码:
Im=imread('lena.jpg');
Img = (ones(size(Im,1),size(Im,2)));
for i=1:size(Im,1)
for j=1:size(Im,2)
Img(i,j)=0.2989*Im(i,j,1)+0.5870*Im(i,j,2)+0.1140*Im(i,j,3);
end
end
Im(1,1,1)
Im(1,1,2)
Im(1,1,3)
1 个回答
3
看起来在Python中读取图像的方式和在Matlab中不太一样。
如果你把你的Python代码改成:
ij = j , i
而不是:
ij = i , j
那么你就能得到和Matlab一样的结果。
如果你想让Matlab的结果和Python一样,你需要把那里的 i
和 j
交换一下:
Img(j,i)=0.2989*Im(j,i,1)+0.5870*Im(j,i,2)+0.1140*Im(j,i,3);
下面是我通过简单调试发现这个问题的过程:
- 首先,我从 这里 下载了图像,并保存为
.jpg
格式。 然后,我把Matlab的循环改成:
for i=1:2 for j=1:2
这样我只会得到前4个像素。
通过打印
i
、j
和Im
的内容,我得到了:i = 1, j = 1 225, 137, 125 i = 1, j = 2 227, 139, 127 i = 2, j = 1 224, 136, 124 i = 2, j = 2 226, 138, 126
接着,我在Python中做了同样的事情:
for i in range (0,2): for j in range (0,2):
这给了我:
(0, 0) 225 137 125 (0, 1) 224 136 124 (1, 0) 227 139 127 (1, 1) 226 138 126
这让我看出Matlab和Python之间的顺序是不同的。
- 因此,把Python中的
i
和j
从ij = i, j
改成ij = j, i
就能得到和Matlab一样的结果。