全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3178
推到 Plurk!
推到 Facebook!

二值化图中Connect Component 的面积和周长的计算

尚未結案
小丫123
初階會員


發表:85
回覆:62
積分:29
註冊:2004-08-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-01 16:28:16 IP:218.65.xxx.xxx 未訂閱
如果有一幅图像里有两个苹果,三个香蕉,它们没有叠加在一起。我想提取这个5个不同的图像,计算它们的面积和周长。应该怎么写吗? 研二的女生
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-01 23:23:37 IP:211.76.xxx.xxx 未訂閱
小丫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; k    RichTop 敬上    =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####    發表人 - richtop 於 2005/04/01  23:32:54
        
小丫123
初階會員


發表:85
回覆:62
積分:29
註冊:2004-08-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-02 11:14:27 IP:218.65.xxx.xxx 未訂閱
谢谢richtop详细的给我解答难题。不过我对BCB不是很熟悉,不知道能不能麻烦你用delphi的程式给我讲解一下吗? 研二的女生
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-02 21:27:36 IP:211.76.xxx.xxx 未訂閱
小丫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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-02 22:45:20 IP:218.65.xxx.xxx 未訂閱
谢谢您,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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-02 23:15:08 IP:211.76.xxx.xxx 未訂閱
小丫123 您好:    您說的都沒錯!    不過不知道是不是您漏打了?根號2應該是sqrt(2)。 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
小丫123
初階會員


發表:85
回覆:62
積分:29
註冊:2004-08-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-03 12:14:57 IP:218.65.xxx.xxx 未訂閱
以下是我自己的编的,给每个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; 
研二的女生
系統時間:2024-05-04 11:26:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!