簡體   English   中英

在 C++ 中將 rgb 更改為灰度

[英]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) 那這是在做什么? 讓我們分解一下:

  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);

我希望你能看出區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM