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

高手們,請問如何將圖形二值化(黑白化)再取得影像的黑白點數呢?

答題得分者是:領航天使
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-15 01:32:20 IP:211.74.xxx.xxx 未訂閱
高手們,請問: 如何將圖形二值化(黑白化)再取得影像的黑白點數呢? 謝謝! Dong-Han Mo.AtEin_ATTS
------
ATEIN
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-15 08:08:28 IP:192.168.xxx.xxx 未訂閱
引言: 高手們,請問: 如何將圖形二值化(黑白化)再取得影像的黑白點數呢? 謝謝! Dong-Han Mo.AtEin_ATTS
先參考站長的這一篇 縮小平滑化 的運算方法, http://delphi.ktop.com.tw/topic.php?TOPIC_ID=23589 先參考RGB處理的部份,看完有問題再問! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-15 23:59:01 IP:211.74.xxx.xxx 未訂閱
站長: 雖然不是我要的答案,但是感謝您的支援,謝謝。 Dong-Han Mo.AtEin_ATTS
------
ATEIN
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-16 00:03:17 IP:211.74.xxx.xxx 未訂閱
站長: 您指的這檔案下載來之後,不能解開,訊息為檔案已損壞了 謝謝。 Dong-Han Mo.AtEin_ATTS
------
ATEIN
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-16 19:28:21 IP:192.168.xxx.xxx 未訂閱
引言: 站長: 您指的這檔案下載來之後,不能解開,訊息為檔案已損壞了 謝謝。 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-17 20:13:40 IP:61.30.xxx.xxx 未訂閱
您好,站長: 現可若可取得黑白點數,但如何將彩色圖重繪或顯示成黑白,換言之-也就是連彩色也變成只有二值化而言,而且每按一次鍵可加強其二值化效果呢? 謝謝! Dong-Han Mo.AtEin_ATTS
------
ATEIN
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-18 08:20:53 IP:192.168.xxx.xxx 未訂閱
引言: 您好,站長: 現可若可取得黑白點數,但如何將彩色圖重繪或顯示成黑白,換言之-也就是連彩色也變成只有二值化而言,而且每按一次鍵可加強其二值化效果呢? 謝謝! 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-12-18 09:48:16 IP:61.218.xxx.xxx 未訂閱
引言: 高手們,請問: 如何將圖形二值化(黑白化)再取得影像的黑白點數呢? 謝謝! 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-12-19 11:06:01 IP:61.30.xxx.xxx 未訂閱
謝謝各位高手(站長、CMF),已能順利二值化。 但取得二值色點數不順利,過程中有問題。 如果要讓白變成透明,又沒有方法? 謝謝各位! Dong-Han Mo.AtEin_ATTS
------
ATEIN
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-12-20 09:23:34 IP:61.218.xxx.xxx 未訂閱
引言: 謝謝各位高手(站長、CMF),已能順利二值化。 但取得二值色點數不順利,過程中有問題。 如果要讓白變成透明,又沒有方法? 謝謝各位! Dong-Han Mo.AtEin_ATTS
//白變成透明 Image1.Transparent:=TRUE; Image1.Picture.Bitmap.TransParentColor:=$ffff; 發表人 - cmf 於 2002/12/20 09:24:42
------
︿︿
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-12-22 02:16:00 IP:211.74.xxx.xxx 未訂閱
請問站長或其它高手: 二值化的黑白點數,我取不成功 您是否有更好的方法? 謝謝! Dong-Han Mo.AtEin_ATTS
------
ATEIN
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-12-22 10:04:42 IP:192.168.xxx.xxx 未訂閱
引言: 請問站長或其它高手: 二值化的黑白點數,我取不成功 您是否有更好的方法? 謝謝! Dong-Han Mo.AtEin_ATTS
可否再詳細描述您所發生的問題, 或是將您的程式列出, 是算不準還是有其它問題...? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#13 引用回覆 回覆 發表時間:2002-12-23 13:14:08 IP:61.218.xxx.xxx 未訂閱
引言: 請問站長或其它高手: 二值化的黑白點數,我取不成功 您是否有更好的方法? 謝謝! 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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2002-12-23 21:51:54 IP:211.74.xxx.xxx 未訂閱
cmf:您好, 這程式片段,應該是c builder 直接轉譯的吧? 在delphi 並不能實現。 因為c builder 對型態轉換限制較為大。 並不能直接在delphi 直接執行。謝謝! Dong-Han Mo.AtEin_ATTS
------
ATEIN
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#15 引用回覆 回覆 發表時間:2002-12-24 08:08:56 IP:192.168.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2002-12-24 08:56:46 IP:211.74.xxx.xxx 未訂閱
感謝,站長: 雖然早已完成二值化截取了,但仍感謝您的解答! 經驗證,其站長修改完成的程式,取得的二值化數據 與敝人所取得的數值一樣,代表數值正確無誤,衷心感謝。 本題中,感謝站長高手支援,您真是熱心,另感謝cmf支援。 謝謝各位。 Dong-Han Mo.AtEin_ATTS
------
ATEIN
系統時間:2024-11-23 6:02:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!