在C ++中将RGB更改为灰度

时间:2018-10-22 19:35:26

标签: c++

我正在尝试将RGB图像转换为灰度图像 这是我用来为现有图像生成随机像素的代码...我也在使用.h文件来生成输出文件... 这是image.h文件:https://www65.zippyshare.com/v/yWLb2IjG/file.html 这是一个使用过的示例:https://www65.zippyshare.com/v/Cx5U4cua/file.html

#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<iomanip>
#include"image.h"

using namespace std;

int main(){
    Image im=readPPM("./xmas.ppm");

    int largeur=im.w, hauteur=im.h;
    cout<<"Ouverture d'une image de largeur "<<largeur<<" et de hauteur "<<hauteur<<endl;
    srand(time(NULL));

    for(int j=0;j<largeur;j++){
        for (int i=0;i<hauteur;i++){
            im(j,i).r +=(rand()%100)/300.0; 
            im(j,i).g +=(rand()%100)/300.0; 
            im(j,i).b +=(rand()%100)/300.0; 
        }
    }

    savePPM(im,"./out.ppm");
    return 0;
}

对于灰度,我尝试添加: im(j,i)+ = 0.2126 * im(j,i).r + 0.7152 * im(j,i).g + 0.0722 * im(j,i).b;

但不起作用 我也尝试过每种颜色分别为33%和0.3的红色,0.57的绿色和0.11的蓝色,结果相同。它不起作用

1 个答案:

答案 0 :(得分:3)

有一个非常简单的修复程序,但是我将首先解释发生了什么。

  

对于灰度,我尝试添加:im(j,i) +=0.2126*im(j,i).r+0.7152*im(j,i).g+0.0722*im(j,i).b;

让我们看看为什么这种“无效” ...

因此,Image::operator(int,int)返回一个Rgb&。至少我们知道我们正在处理 reference ,所以我们应该能够修改该值。

现在,您正在调用不存在的Rgb::operator+=(float)。但这不会因为Rgb& operator += (const Rgb &rgb)而导致编译器错误,并且有 隐式构造函数Rgb(float)。那在做什么呢?让我们分解一下:

  1. 您基于亮度计算灰度值:0.2126*im(j,i).r+0.7152*im(j,i).g+0.0722*im(j,i).b
  2. +=运算符从中隐式构造灰度Rgb值,然后添加到现有图像值中。

上面的描述在代码中看起来像这样:

float lum = 0.2126f * im(j,i).r + 0.7152f * im(j,i).g + 0.0722f * im(j,i).b;
img(j,i) += Rgb(lum);

通过添加,您将获取现有的颜色值并将每个通道偏移相同的数量。这样就产生了一种新的颜色,该颜色要明亮得多。

相反,您想将值更改为刚计算出的新值:

img(j,i) = Rgb(lum);

希望您能看到其中的区别。