[英]changing rgb to grayscale in c++
我正在嘗試將 rgb 圖像轉換為灰度圖像這是我用來為現有圖像生成隨機像素的代碼……我也在使用 .h 文件來生成輸出文件……這是圖像.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,結果相同。 這是行不通的
有一個非常簡單的修復方法,但我將首先解釋發生了什么。
對於我嘗試添加的灰度:
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);
我希望你能看出區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.