高手們,請問如何將圖形二值化(黑白化)再取得影像的黑白點數呢? |
答題得分者是:領航天使
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: 站長: 您指的這檔案下載來之後,不能解開,訊息為檔案已損壞了 謝謝。 Dong-Han Mo.AtEin_ATTS我又試了一下 , 可以下載也可以正確解壓啊? 我是想說canvas.pixels[x,y] 取得的是RGB的點 c:=canvas.pixels[x,y] r:=c shr 16; g:=(c shr 8) mod 256; b:=c mod 256; 分別算出RGB的值後 將r g b得到的數值超過386者為白色,小於則為黑色 這是您要的嗎? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: 您好,站長: 現可若可取得黑白點數,但如何將彩色圖重繪或顯示成黑白,換言之-也就是連彩色也變成只有二值化而言,而且每按一次鍵可加強其二值化效果呢? 謝謝! Dong-Han Mo.AtEin_ATTS舉一要能反三喔! 寫一個程式給您參考,先看看有問題再問! unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, jpeg, ExtCtrls, ComCtrls, StdCtrls; type TForm1 = class(TForm) Button1: TButton; TrackBar1: TTrackBar; Image1: TImage; Image2: TImage; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var i,j,c,l,r,g,b:integer; begin l:=((255 255 255) *TrackBar1.Position) div 100; for i:=0 to image1.Width do for j:=0 to image1.Height do begin c:=image1.canvas.pixels[i,j]; r:=c shr 16; g:=(c shr 8) mod 256; b:=c mod 256; if r g b>=l then image2.canvas.pixels[i,j]:=$ffffff else image2.canvas.pixels[i,j]:=0; end; end; end.~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
引言: 高手們,請問: 如何將圖形二值化(黑白化)再取得影像的黑白點數呢? 謝謝! Dong-Han Mo.AtEin_ATTS// 1. 取得 二值化 門檻值 // 2. 大於 二值化 門檻值 為 白 小於 二值化 門檻值 為 黑 // 3 這樣就能 取得影像的黑白點數 // 取得 二值化 門檻值 procedure GetTHR(var THR:BYTE); var maxValue,minValue:BYTE; c:TColor; m,r,g,b:BYTE; i,j:integer; begin maxValue:=0; minValue:=255; for i:=0 to image1.Width do for j:=0 to image1.Height do begin c:=image1.canvas.pixels[i,j]; r:=GetRValue(c); g:=GetGValue(c); b:=GetBValue(c); m:=(r g b)/3; if m> maxValue then maxValue:=m; if m< minValue then minValue:=m; end; THR:=(maxValue minValue) shr 1 ; end; // 彩色->黑白 procedure DrawBW(var THR:BYTE); var c:Tcolor; m,r,g,b:BYTE; begin for i:=0 to image1.Width do for j:=0 to image1.Height do begin c:=image1.canvas.pixels[i,j]; r:=GetRValue(c); g:=GetGValue(c); b:=GetBValue(c); m:=(r g b)/3; if m>thr the image1.canvas.pixels[i,j]:=$FFFF else image1.canvas.pixels[i,j]:=0; end; end; 發表人 - cmf 於 2002/12/18 09:56:46
------
︿︿ |
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
引言: 請問站長或其它高手: 二值化的黑白點數,我取不成功 您是否有更好的方法? 謝謝! Dong-Han Mo.AtEin_ATTS//GET 黑白 點數 procedure GetBW(var THR:BYTE); var c:Tcolor; m,r,g,b:BYTE; B,W:integer; begin B:=0; W:=0; for i:=0 to image1.Width do for j:=0 to image1.Height do begin c:=image1.canvas.pixels[i,j]; r:=GetRValue(c); g:=GetGValue(c); b:=GetBValue(c); m:=(r g b)/3; if m>thr the INC(W) else INC(B); end; ShowMessage('黑點數=' inttostr(B) ' 白點數=' inttostr(W)); end;
------
︿︿ |
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: cmf:您好, 這程式片段,應該是c builder 直接轉譯的吧? 在delphi 並不能實現。 因為c builder 對型態轉換限制較為大。 並不能直接在delphi 直接執行。謝謝! Dong-Han Mo.AtEin_ATTS稍為改一改就可以在Delphi上執行了啊! 您再試看看! unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; BitBtn1: TBitBtn; procedure BitBtn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure GetBW(THR:integer); var c:Tcolor; m,r,g,b:BYTE; Bb,Ww,i,j:integer; begin Bb:=0; Ww:=0; for i:=0 to form1.image1.Width do for j:=0 to form1.image1.Height do begin c:=form1.image1.canvas.pixels[i,j]; r:=GetRValue(c); g:=GetGValue(c); b:=GetBValue(c); m:=(r g b) div 3; if m>thr then INC(Ww) else INC(Bb); end; ShowMessage('¶ÂÂI¼Æ=' inttostr(Bb) ' ¥ÕÂI¼Æ=' inttostr(Ww)); end; procedure TForm1.BitBtn1Click(Sender: TObject); begin GetBW(128); end; end.~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |