二值化图中Connect Component 的面积和周长的计算 |
尚未結案
|
小丫123
初階會員 發表:85 回覆:62 積分:29 註冊:2004-08-31 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
小丫123 您好: 我有用BCB寫了算單純封閉區域面積與周長的程式,您參考一下!
轉成Delphi應該不難,您就自行修改一下吧! 物體邊界可以參考我之前的發表文章:Chain-Code 邊界搜尋與字串(螞蟻) 。
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=49312
關於計算面積的原理就如同我在該文章中描述的:http://delphi.ktop.com.tw/topic.php?TOPIC_ID=56556
至於周長就祇是用簡單的畢氏定理而已。
int next(int n, int len, int skip=1) { n = skip; if ( skip<0 ) n =len; return (n % len); } float area(float *x, float *y, int len) { float dx, dy, area=0.0; int index=0; for (int k=0; kRichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2005/04/01 23:32:54 |
小丫123
初階會員 發表:85 回覆:62 積分:29 註冊:2004-08-31 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
小丫123 您好: 先前看您勇敢的改寫過BCB的程式,想說應該可以很快轉譯過來才對。
不過我正好也利用這機會,複習一下如何在Delphi中傳陣列。中間參考了Delphi所附,在Demos\Threads\thrdDemo中的極佳範例,也算又增長見聞,這應該可說是好心有好報吧!< > 程式改寫如下,如果您完成了這個題目且沒有版權顧慮的情況下,可否請寄一份結果給我,先謝過了!< >
implementation {$R *.dfm} var aryX : array [0..6] of single = (-1, 1, 1, 0,-1, 0,-2); aryY : array [0..6] of single = ( 0, 0, 1, 1, 2, 3, 3); function next(n, len : integer; skip :integer = 1) : integer; begin n := n skip; if ( skip<0 ) then inc(n, len); result := n mod len; end; function area(x, y : array of Single; len :integer) : single; var dx, dy : single; k : integer; begin result := 0; for k:=0 to len-1 do begin dx := x[next(k, len)]-x[k]; dy := y[next(k, len)]-y[k]; result := result x[k]*dy - y[k]*dx; end; result := result / 2; end; function length(x, y :array of Single; len :integer) : single; var dx, dy : single; k : integer; begin result := 0; for k:=0 to len-1 do begin dx := x[next(k, len)]-x[k]; dy := y[next(k, len)]-y[k]; result := result sqrt(dx*dx dy*dy); end; end; procedure TForm1.Button1Click(Sender: TObject); var len, k : integer; areaValue, perimeter :single; dynamicAry : array of Single; begin len := High(aryX) - Low(aryX) 1; //ShowMessage(IntToStr(len)); areaValue := area(aryX, aryY, len); //===== 測試動態設定陣列方式 setLength(dynamicAry, len); for k:=0 to len-1 do dynamicAry[k] := aryX[k]; perimeter := length(dynamicAry, aryY, len); setLength(dynamicAry,0); // 釋放記憶體 //##### //perimeter := length(aryX, aryY,len); // 陣列大小已指定方式 ShowMessage(FloatToStr(areaValue)); ShowMessage(FloatToStr(perimeter)); end;RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2005/04/02 21:30:36 |
小丫123
初階會員 發表:85 回覆:62 積分:29 註冊:2004-08-31 發送簡訊給我 |
谢谢您,richtop,如果我可以完成的话,也是因为有你的帮助,所以给您寄一份是理所当然的。
不过我感觉你给我介绍的方法似乎bu能达到,把每个connect component 的周长算出来。根据你的提示,面积应该就是每个component的黑色象素点,现在我可以分别求出来。但是周长的话我觉得应该这样计算,如果以[x,y]为中心算的话,应该是这个点距[x-1,y][x 1,y][x,y-1][x,y 1]的长为1,他到[x-1,y-1],[x 1,y-1],[x-1,y 1],[x 1,y 1]的长度为sqr(2)。而且只能针对边缘,也就是轮廓的象素点算。还有一个问题,如果这幅图上有三个物体的话,是不是需要先给每个component一个label呢,这样才能确定具体是计算那个component的周长和面积 研二的女生
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
|
小丫123
初階會員 發表:85 回覆:62 積分:29 註冊:2004-08-31 發送簡訊給我 |
以下是我自己的编的,给每个connect component,记上label,比计算connect component个数。可是我没能把每个connect component的象素值表示出来,不知道哪里应该修改一下。我计算出来的结果好像有错误。各位前辈帮我看看
procedure TForm1.Button1Click(Sender: TObject); var i,j,im,ip,jm,jp,Blabel,count:integer; cnt:integer; bmp:Tbitmap; begin bmp:=Tbitmap.Create; bmp.Assign(image1.Picture.Bitmap ); Blabel:=241; cnt:=0; count:=0; // connect component Number bmp.PixelFormat:=pf24bit; for i:=0 to bmp.Height-1 do begin memo1.Lines.Clear ; Blabel:=Blabel+1; for j:=0 to bmp.Width-1 do begin if bmp.Canvas.Pixels [i,j]=clblack then begin count:=count+1; cnt:=0; //connect component pixels number bmp.Canvas.Pixels [i,j]:=Blabel; im:=i-1; //left ip:=i+1; //right jm:=j-1; //button jp:=j+1; //top if im<0 then im:=0 ; if ip>=bmp.Height-1 then ip:=bmp.Height-1 ; if jm<0 then jm:=0 ; if jp>=bmp.Width -1 then jp:=bmp.Width -1; if bmp.Canvas.Pixels [im,jm]=clblack then begin bmp.Canvas.Pixels [im,jm]:=Blabel; cnt:=cnt+1; end; if bmp.Canvas.Pixels[i,jm]=clblack then begin bmp.Canvas.Pixels [i,jm]:=Blabel; cnt:=cnt+1; end; if bmp.Canvas.Pixels[ip,jm]=clblack then begin bmp.Canvas.Pixels [ip,jm]:=Blabel; cnt:=cnt+1; end; if bmp.Canvas.Pixels[im,j]=clblack then begin bmp.Canvas.Pixels [im,j]:=Blabel; cnt:=cnt+1; end; if bmp.Canvas.Pixels[ip,j]=clblack then begin bmp.Canvas.Pixels [ip,j]:=Blabel; cnt:=cnt+1; end; if bmp.Canvas.Pixels[im,jp]=clblack then begin bmp.Canvas.Pixels [im,jp]:=Blabel; cnt:=cnt+1; end; if bmp.Canvas.Pixels[i,jp]=clblack then begin bmp.Canvas.Pixels [i,jp]:=Blabel; cnt:=cnt+1; end; if bmp.Canvas.Pixels[ip,jp]=clblack then begin bmp.Canvas.Pixels [ip,jp]:=Blabel; cnt:=cnt+1; end; end; end; end; memo1.lines.Add(inttostr(cnt)); memo1.Lines.Add('find '+ inttostr(count)+' connect component'); image2.Picture.Bitmap :=bmp; bmp.Free; end;研二的女生 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |