我正在尝试将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的蓝色,结果相同。它不起作用
答案 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)
。那在做什么呢?让我们分解一下:
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);
希望您能看到其中的区别。