RGB 2 hsi 存入矩陣之問\題 |
尚未結案
|
raiseofevil
一般會員 發表:13 回覆:1 積分:2 註冊:2006-12-09 發送簡訊給我 |
[code]
procedure TForm1.RGB2HSIClick(Sender: TObject); var i,j,pw,ph: integer; pt: Pbyte; BM, mmp: TBitmap; JP: TJpegImage; r,g,b: double ; hh,ss,ii,temp,pi: double ; begin pi:=3.1416; if OD.Execute=true then begin //**** Load Jpeg file **** JP:=TJPEGImage.Create; JP.LoadFromFile( OD.FileName ); //**** Copy TJpegimage to TBitmap **** BM:=TBitmap.Create; BM.Assign( JP ); pw:=BM.Width; ph:=BM.Height; //**** TBitmap copy to Map array **** setlength( Map, ph ); for j:=0 to bm.Height-1 do begin setlength( Map[j], pw ); end; for i:=0 to ph-1 do begin pt:=BM.ScanLine[i]; move( pt^, Map[i,0 ], pw*3 ); end; //**** Image process RGB to HSI **** for i:=0 to ph-1 do begin for j:=0 to pw-1 do begin b:= map[i,j].B; //byte資料型態,存入double 的型態 g:= map[i,j].G ; r:= map[i,j].R ; //--先計算H S I ------------- ii:=(b g r)/ 3 ; //算出i 值 //****** if((r g b)=0) then ss:=0 else ss:=1-(3*(min(min(r,g),b))/ (r g b)); //計算Saturation //************ if((((r-g)*(r-g)) ((r-b)*(g-b)))=0) then //依據公式,此判斷式=0表示分子為0 hh:=0 else temp:=((r-g) (r-b))/(2*sqrt(((r-g)*(r-g)) ((r-b)*(g-b)))); if(g>=b) then hh:=cos(temp) //計算Hue,徑度量 //hh=acos(temp)*180/pi; //計算Hue,度度量 else hh:=2*pi-cos(temp); //計算Hue,徑度量 //hh=(2*pi-acos(temp))*180/pi; //計算Hue,度度量 //請問我將H S I 的值算出後,為了將他們顯示出來,故將h,s,i分別代入矩陣中,為什麼不能代入勒? map[i,j].G :=hh; // map[i,j].G :=ss; map[i,j].R :=ii; end; end; //*********************** //**** Copy Map array to TBitmap to show the image ***** mmp:=TBitmap.Create; mmp.PixelFormat:=pf24bit; mmp.Width:=BM.Width; mmp.Height:=BM.Height; for j:=0 to mmp.Height-1 do begin pt:=mmp.ScanLine[j]; move( Map[j,0], pt^, mmp.Width*3 ); end; image1.Picture.Bitmap.Assign(mmp); mmp.Free; BM.Free; JP.Free; end; end; [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |