我正在尝试使用其中一种算法将RGB图像转换为灰度:
亮度方法平均最突出和最不突出的颜色: (max(R,G,B)+ min(R,G,B))/ 2。
平均方法简单地平均值:(R + G + B)/ 3.
发光度的公式为0.21 R + 0.71 G + 0.07 B。
但我得到了非常奇怪的结果!我知道还有其他方法可以实现这一目标但是有可能这样做吗?
以下是代码:
for(int i = 0 ; i < eWidth*eHeight;i++){
int R = (pixels[i] >> 16) ; //bitwise shifting
int G = (pixels[i] >> 8) ;
int B = pixels[i] ;
int gray = (R + G + B )/ 3 ;
pixels[i] = (gray << 16) | (gray << 8) | gray ;
}
答案 0 :(得分:2)
你需要去掉那些不属于你所获得组件的部分,特别是如果轮班中有任何符号扩展名。
int R = (q[i] >> 16) & 0xff ; //bitwise shifting
int G = (q[i] >> 8) & 0xff ;
int B = q[i] & 0xff ;
答案 1 :(得分:1)
你所做的一切对我来说都很好..
我曾经在java中以同样的方式做过这件事。 获得RGB的0-255色值的平均值,以获得灰度,它看起来很像你的。
public int getGray(int row, int col) throws Exception
{
checkInImage(row,col);
int[] rgb = this.getRGB(row,col);
return (int) (rgb[0]+rgb[1]+rgb[2])/3;
}
答案 2 :(得分:1)
您当然可以修改Java中的每个像素,但效率非常低。如果您有选项,我会使用ColorMatrix
。有关详细信息,请参阅Android文档:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.html
您可以将矩阵的饱和度设置为0,使其成为灰度。
如果你真的想用Java做,你可以按照你的方式去做,但你需要首先屏蔽每个元素,即将& 0xff
应用到它。
答案 3 :(得分:1)
我知道你不是要求如何对此进行编码,而是为了算法?
根据http://www.dfanning.com/ip_tips/color2gray.html
,没有“正确”的算法他们使用
Y = 0.3*R + 0.59*G + 0.11*B