所以我设计了编辑照片的几个方案中python使用PIL,其中之一是将图像转换为灰度图像(我避免因使用任何功能PIL).
我已经采用的算法是简单的:对于每个像素(色彩深度为24),我已经计算出的平均R,G和B值,并设置RGB值到该平均.
我的程序生成的灰度图像似乎很准确,但我想知道我是否使用了正确的算法,并且我遇到了一个问题的答案,似乎"正确"的算法是计算的0.299 R + 0.587 G + 0.114 B.
我决定将我的程序与这个算法进行比较.我使用我的程序生成了一个灰度图像,另一个(使用相同的输入)来自一个网站(谷歌的最高结果)'image to grayscale'.
在我的肉眼看来,它们似乎完全相同,如果有任何变化,我看不到它.但是,我决定使用这个网站(谷歌的最佳结果'compare two images online')来比较我的灰度图像.事实证明,在像素的深处,它们有轻微的变化,但没有一个人乍一看是可感知的(差异可以被发现,但通常只有当图像相互叠加或在几毫秒之间切换时) .
我的问题(第一个是主要问题):
我的关键代码(如果需要):
def greyScale(pixelTuple):
return tuple([round(sum(pixelTuple) / 3)] * 3)
Run Code Online (Sandbox Code Playgroud)
'正确'的算法(似乎重量很重):
def greyScale(pixelTuple):
return tuple([round(0.299 * pixelTuple[0] + 0.587 * pixelTuple[1] + 0.114 * pixelTuple[2])] * 3)
Run Code Online (Sandbox Code Playgroud)
当在线比较灰度图像时(突出显示红色是差异,使用10%的模糊):

尽管上面突出显示了像素的变化,但上面的灰度图像看起来几乎完全相同(至少对我而言).
另外,关于我的第一个问题,如果有人感兴趣, …
python algorithm image-comparison image-conversion python-imaging-library
我需要一种算法或函数来将可见光谱范围的每个波长映射到其等效的RGB值.RGB系统和灯的波长之间是否存在任何结构关系?喜欢这个图像: 替代文字http://www1.appstate.edu/~kms/classes/psy3203/Color/spectrum5.gif 抱歉,如果这是无关紧要的: - ]
如何转换图像的RGB直方图以创建显示组合颜色以及正确颜色波长范围的直方图?
示例代码:
pkg load image
f=imread('/tmp/marbles.jpg');
f=uint8(f); %need to convert back to uint8 to show picture
%Split into RGB Channels
f_red = f(:,:,1);
f_green = f(:,:,2);
f_blue = f(:,:,3);
%Get histValues for each channel
[y_f_red, x] = imhist(f_red);
[y_f_green, x] = imhist(f_green);
[y_f_blue, x] = imhist(f_blue);
subplot (2,1,1); imshow(f);
subplot (2,1,2); plot(x, y_f_red, 'r', x, y_f_green, 'g', x, y_f_blue, 'b');
Run Code Online (Sandbox Code Playgroud)
示例图像以及代码生成的单独RGB直方图:
我试图让直方图看起来像下面的图像,但颜色从红色变为蓝色:
另一个图片示例:
PS:我使用的Octave 4.0与MATLAB非常相似.