C++ 将rgb更改为c+中的灰度+;

C++ 将rgb更改为c+中的灰度+;,c++,C++,我正在尝试将rgb图像转换为灰度图像 这是我用来为现有图像生成随机像素的代码。。。我正在使用一个.h文件来生成输出文件。。。 这是image.h文件: 这是一个使用过的样本: #包括 #包括 #包括 #包括 #包括“image.h” 使用名称空间std; int main(){ 图像im=readPPM(“./xmas.ppm”); 大整数=im.w,傲慢=im.h; cout有一个非常简单的修复方法,但我将首先解释发生了什么 对于我尝试添加的灰度:im(j,i)+=0.2126*im(j,i)

我正在尝试将rgb图像转换为灰度图像 这是我用来为现有图像生成随机像素的代码。。。我正在使用一个.h文件来生成输出文件。。。 这是image.h文件: 这是一个使用过的样本:

#包括
#包括
#包括
#包括
#包括“image.h”
使用名称空间std;
int main(){
图像im=readPPM(“./xmas.ppm”);
大整数=im.w,傲慢=im.h;

cout有一个非常简单的修复方法,但我将首先解释发生了什么

对于我尝试添加的灰度:
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&
。至少我们知道我们正在处理一个引用,所以我们应该能够修改该值

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

  • 根据亮度计算灰度值:
    0.2126*im(j,i)。r+0.7152*im(j,i)。g+0.0722*im(j,i)。b
  • +=
    操作符隐式地从该值构造灰度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);
    

    我希望你能看到区别。

    RGB中的灰度图像只是每个像素的RGB分量相等的图像。你是想在那里使用
    +=
    吗?-与
    *=
    相反。我不明白
    rand()的用途
    示例代码中的一部分。似乎将像素重置为某个随机值,与灰度无关。如果要生成随机图像,为什么需要读取文件?灰度仅表示红色、绿色和蓝色相等。您是否尝试过平均像素值,如
    avg=(im(j,i).r+(im(j,i).g+(im(j,i).b)/3;
    并将平均值分配给所有三个颜色分量?@SamiAlaa像素值是如何存储的?例如,它们是介于0-255之间的整数?它们是从0到1的浮点数还是双倍数?
    img(j,i) = Rgb(lum);