線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2751
推到 Plurk!
推到 Facebook!

RGB轉HSI調亮度後返回RGB格式印出圖片並顯示出改變後的直方圖

尚未結案
shiroyuki
一般會員


發表:1
回覆:1
積分:0
註冊:2010-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-04-04 22:59:00 IP:114.44.xxx.xxx 訂閱
想請教各位大家,我的這段程式碼是哪裡有問題???
我先是懷疑調亮度的那段有誤
於是曾移掉那段碼純跑RGB轉HSI在從HSI轉RGB
結果還是不行
那段參考的程式碼為 http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=79336 這文章裡的和課本公式
仔細的對看許久實在看不出哪裡錯
請大家指導一下

另外想問一下轉成HSI之後要怎麼利用求出來的H S 和 I 來對影像來做處理
雖然知道H是色調 S是飽和度 I 是亮度 但也不懂該如何使用

直方圖是沒有什麼大問題
但想請問下y軸和x軸的刻度和出現的圖表能與
http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=79336
這文章裡面所顯示出的直方圖那樣嘛???
自己所嘗試弄出來的圖表都是很明顯的1根1根的
而且刻度也會自動改變導致圖表都看不是到(刻度變太大結果值太小導致看不清楚
範例 :


[code cpp]
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Assign(Image1->Picture->Bitmap);
Byte *ptr;
double Hue,Saturation,Intensity,newIntensity;
double pi=3.1415926;
double temp;
int newR,newG,newB,B,G,R;
unsigned int valueR[256],valueG[256],valueB[256],l;
// 先把直方圖清掉
Form1->Series1->Clear();
Form1->Series3->Clear();
Form1->Series5->Clear();
// 把直方圖裡要表現的值初始化
for(l=0 ; l<256 ; l )
{
valueR[l]=0;
valueG[l]=0;
valueB[l]=0;
}

// 這地方是我參考動態捕捉影像裡對亮度的調整而暫時寫的 可以使用
// 亮度的控制由ScrollBar來控制 值為-255~255
/* for (int i=0;iPicture->Bitmap->Height;i )
{
ptr=(Byte *)Bmp->ScanLine[i];
for(int j=0;jPicture->Bitmap->Width;j )
{
B=ptr[3*j];
G=ptr[3*j 1];
R=ptr[3*j 2];
if(R BOffset>=255) newR=255;
else if(R BOffset<=0) newR=0;
else newR=R BOffset;
if(G BOffset>=255) newG=255;
else if(G BOffset<=0) newG=0;
else newG=G BOffset;
if(B BOffset>=255) newB=255;
else if(B BOffset<=0) newB=0;
else newB=B BOffset;
ptr[3*j]=newB;
ptr[3*j 1]=newG;
ptr[3*j 2]=newR;
valueR[newR] =1;
valueG[newG] =1;
valueB[newB] =1;
}
} */


// 這地方是我有問題的RGB轉HSI
Bmp->Assign(Image1->Picture->Bitmap);
Bmp->PixelFormat=pf24bit;
for (int i=0;iPicture->Bitmap->Height;i )
{
ptr=(Byte *)Bmp->ScanLine[i];
for(int j=0;jPicture->Bitmap->Width;j )
{
B=ptr[3*j];
G=ptr[3*j 1];
R=ptr[3*j 2];
Intensity = (R G B)/3;
if((R G B)==0)
Saturation=0;
else
{
Saturation=1-(3*min(min(R,G),B)/(R G B));
}

if((((R-G)*(R-G)) ((R-B)*(G-B)))==0)
Hue=0;
else
{
temp=((R-G) (R-B))/(2*sqrt(((R-G)*(R-G)) ((R-B)*(G-B))));
if(G>=B)
Hue=acos(temp);
else
Hue=(2*pi-acos(temp));
}
}
}

// 調整亮度用
if(Intensity BOffset>=1) newIntensity = 1;
else if(Intensity BOffset<=0) newIntensity = 0;
else newIntensity=Intensity BOffset;

// HSI轉回RGB印出圖片
for (int i=0;iPicture->Bitmap->Height;i )
{
ptr=(Byte *)Bmp->ScanLine[i];
for(int j=0;jPicture->Bitmap->Width;j )
{
if(Hue>=0&&Hue<2*pi/3)
{
B = newIntensity*(1-Saturation);
R = newIntensity*(1 (Saturation*cos(Hue))/cos(pi/3-Hue));
G = 3*newIntensity-(R B);
}
if(Hue>=2*pi/3&&Hue<4*pi/3)
{
R = newIntensity*(1-Saturation);
G = newIntensity*(1 (Saturation*cos(Hue))/cos(pi/3-Hue));
B = 3*newIntensity-(R G);
}
if(Hue>=pi/3*4&&Hue<=pi*2)
{
G = newIntensity*(1-Saturation);
B = newIntensity*(1 (Saturation*cos(Hue))/cos(pi/3-Hue));
R = 3*newIntensity-(G B);
}
ptr[3*j] = B;
ptr[3*j 1] = G;
ptr[3*j 2] = R;
valueR[R] =1;
valueG[G] =1;
valueB[B] =1;
// Bmp->Canvas->Pixels[i][j]=(TColor)RGB(R,G,B);
}
}
for(l=0 ; l<256 ; l )
{
Series1->Add(valueR[l],"");
Series3->Add(valueG[l],"");
Series5->Add(valueB[l],"");
}
Image2->Width = Image1->Picture->Bitmap->Width;
Image2->Height = Image1->Picture->Bitmap->Height;
Image2->Picture->Assign(Bmp);
delete Bmp;

[/code]
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-04-07 10:35:53 IP:140.127.xxx.xxx 訂閱
維基百科裡面找的到轉換公式

RGB轉HSI程式碼不會超過10行

兩個for加上三行RGB轉HSI

何必摳別人的程式

然後在那邊到底是de自己程式的bug還是在de別人程式的bug也不知道...
------
恩...
shiroyuki
一般會員


發表:1
回覆:1
積分:0
註冊:2010-04-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-04-08 00:28:59 IP:114.43.xxx.xxx 訂閱
維基裡面的公式不是沒試過.....只是試出來還是一樣整個全都是黑的
而且我自己也是試了很多遍在這也翻了許多文章
但最後無解才發此文的

算了反正調亮度的也用另一種方式調了
只想問直方圖的y值有辦法設定刻度嗎??
電腦預設跑的刻度有時實在不容易看得清楚

===================引 用 istillloving 文 章===================
維基百科裡面找的到轉換公式

RGB轉HSI程式碼不會超過10行

兩個for加上三行RGB轉HSI

何必摳別人的程式

然後在那邊到底是de自己程式的bug還是在de別人程式的bug也不知道...
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-05-13 12:33:10 IP:140.127.xxx.xxx 訂閱
也許你可以試著把Y值正規化成0~255輸出看看
------
恩...
系統時間:2024-05-06 9:50:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!