RGB轉HSI調亮度後返回RGB格式印出圖片並顯示出改變後的直方圖 |
尚未結案
|
shiroyuki
一般會員 發表:1 回覆:1 積分:0 註冊:2010-04-04 發送簡訊給我 |
想請教各位大家,我的這段程式碼是哪裡有問題???
我先是懷疑調亮度的那段有誤 於是曾移掉那段碼純跑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;i { ptr=(Byte *)Bmp->ScanLine[i]; for(int j=0;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;i { ptr=(Byte *)Bmp->ScanLine[i]; for(int j=0;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;i { ptr=(Byte *)Bmp->ScanLine[i]; for(int j=0;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 發送簡訊給我 |
|
shiroyuki
一般會員 發表:1 回覆:1 積分:0 註冊:2010-04-04 發送簡訊給我 |
維基裡面的公式不是沒試過.....只是試出來還是一樣整個全都是黑的
而且我自己也是試了很多遍在這也翻了許多文章 但最後無解才發此文的 算了反正調亮度的也用另一種方式調了 只想問直方圖的y值有辦法設定刻度嗎?? 電腦預設跑的刻度有時實在不容易看得清楚 ===================引 用 istillloving 文 章=================== 維基百科裡面找的到轉換公式 RGB轉HSI程式碼不會超過10行 兩個for加上三行RGB轉HSI 何必摳別人的程式 然後在那邊到底是de自己程式的bug還是在de別人程式的bug也不知道... |
istillloving
高階會員 發表:33 回覆:182 積分:183 註冊:2008-10-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |