使用GD库制作图像灰度

时间:2008-11-10 00:46:47

标签: php image gd

我的任务是创建一个小应用程序,您可以上传图片,该应用程序将把它变成ASCII艺术。我相信这些已经存在,但我想证明我可以自己做。

这将涉及拍摄图像,使其成为灰度,然后根据图片的暗度和角色的充分程度将每个像素与角色匹配。

所以我的问题是,使用GD库(或者我想其他一些必要的手段)如何使图像变成黑白图像?

6 个答案:

答案 0 :(得分:23)

正如nickfcomment所指出的那样,简单公式(pixel.r + pixel.g + pixel.b) / 3不正确。使用GD包含的函数imagefilter()(不需要使用PHP循环迭代图像中的所有像素):

$im = imagecreatefrompng('dave.png');
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagepng($im, 'dave.png');

答案 1 :(得分:7)

要使它纯黑色和白色(如你所写)使用此

imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -1000);

答案 2 :(得分:5)

来自nickf的答案虽然很常见但却是错误的。 (对不起,尼克。)对于初学者来说,这些是NTSC RGB的亮度数字,而不是sRGB,这是计算机图像使用的。正确的数字是0.21,0.72,0.07。其次,必须将加权应用于未经伽马校正的RGB值,然后重新应用伽马校正。 sRGB的Gamma约为2.2。确切地说,它是一个复合函数,其近似指数为1 / 2.2。这是在C ++中。 (我不会说php。抱歉,你需要翻译。)

// sRGB luminance(Y) values
const double rY = 0.212655;
const double gY = 0.715158;
const double bY = 0.072187;

// Inverse of sRGB "gamma" function. (approx 2.2)
double inv_gam_sRGB(int ic) {
    double c = ic/255.0;
    if ( c <= 0.04045 )
        return c/12.92;
    else 
        return pow(((c+0.055)/(1.055)),2.4);
}

// sRGB "gamma" function (approx 2.2)
int gam_sRGB(double v) {
    if(v<=0.0031308)
        v *= 12.92;
    else 
        v = 1.055*pow(v,1.0/2.4)-0.055;
    return int(v*255+.5);
}

// GRAY VALUE
int gray(int r, int g, int b) {
    return gam_sRGB(
            rY*inv_gam_sRGB(r) +
            gY*inv_gam_sRGB(g) +
            bY*inv_gam_sRGB(b)
    );
}

答案 3 :(得分:2)

将RGB转换为灰度的常用公式为:

Gray scale intensity = 0.30R + 0.59G + 0.11B

答案 4 :(得分:1)

你不必把它转换成灰度......如果你只计算一个像素与某种颜色(在你的情况下是一系列灰点)的接近程度,结果就会一样无论如何,在比较你的灰度图像,然后选择合适的角色时,你已经完成了。

答案 5 :(得分:0)

通常在RGB颜色空间中,每个颜色分量(RG和B)的值为128将为中灰色。您也可以将任何低于或高于128的值设置为获得不同的灰度强度(阴影)。

-AD