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

要如何找座標

答題得分者是:justdo
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-14 12:22:50 IP:163.28.xxx.xxx 未訂閱
現在有一張處理過的圖,留下大小不一的二值區域,要怎樣在這些區域中找出最大塊區域並且在那大區塊中取出最大與最小的座標值..請各位前輩位小弟指點要怎樣處理~~謝謝..^^
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-14 21:48:29 IP:221.169.xxx.xxx 未訂閱
可使用相連通(connect component)處理(一般的影像處理書籍應該都有),找出最大區塊後,再重新掃一次影像,以標定出最大和最小的座標值    可參考此篇文章 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57520 發表人 - justdo 於 2004/10/14 22:39:56
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-15 11:06:07 IP:163.28.xxx.xxx 未訂閱
引言: 可使用相連通(connect component)處理(一般的影像處理書籍應該都有),找出最大區塊後,再重新掃一次影像,以標定出最大和最小的座標值 可參考此篇文章 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57520 發表人 - justdo 於 2004/10/14 22:39:56
那再請問justdo我區塊有取出來了,不過小弟愚笨< >(初學者)試了好多次,那要如何取出最大的區塊請前輩指教,要如何去撰寫,有範例可以參考嗎?..小弟細心聆聽..謝謝< >
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-16 10:12:25 IP:221.169.xxx.xxx 未訂閱
大概的處理方式如下: 每次在找一個區塊的時候就要給予不同的編號 而呼叫完一次「找尋區塊」的動作後,會傳回區塊的大小 比較一下這個數值,將最大的區塊的編號和大小記下來
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-17 12:43:52 IP:218.169.xxx.xxx 未訂閱
引言: 大概的處理方式如下: 每次在找一個區塊的時候就要給予不同的編號 而呼叫完一次「找尋區塊」的動作後,會傳回區塊的大小 比較一下這個數值,將最大的區塊的編號和大小記下來
小弟還是不是很懂呢...可不可以請前輩在說明清楚一點或許有什麼例子小弟可以修改練習,更了解其中的用法及語法運用..小弟愚笨(初學者)留..THX.
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-17 20:01:47 IP:221.169.xxx.xxx 未訂閱
為了需要知道每個區塊擁有哪些點,你需要另外一個陣列 記錄不同的區塊--藉由區塊有他自己的識別編號,如: img2[][]為 00001000 00011002 00011022 33000000 記錄了三個區塊,其中編號1的區塊共有5個點、編號2的區塊有3個點、編號3的區塊有2兩個點,就姑且稱呼他為區塊影像好了 因此定義工作流程如下: 1.輸入原始影像,獲得區塊影像,以及每個區塊的大小 2.取得最大影像的編號,重新搜尋區塊影像,以獲得區塊四個邊界的座標 為了達成第1項工作,需要宣告幾項全域變數 int id=1; //下一個可用的區塊編號 char img2[height][width]={0}; 現在需要修改Connect函式,新增幾個功能上去 Connect(BMP, x, y) { 計數值加1 抹除這個點 img2[y][x]=id 檢查8個方位 } 主函式: main() { //第一步驟 由上而下 由左而右 { 呼叫Connect函式,傳回編號為id的區塊的數量:counts if (counts > maxcounts) { maxcounts=counts; maxid=id } id ; } //第二步驟 由上而下 由左而右 { 檢查區塊標號為maxid的pixel的座標 }
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-18 15:59:15 IP:163.28.xxx.xxx 未訂閱
引言: 主函式: main() { //第一步驟 由上而下 由左而右 { 呼叫Connect函式,傳回編號為id的區塊的數量:counts if (counts > maxcounts) { maxcounts=counts; maxid=id } id ; } //第二步驟 由上而下 由左而右 { 檢查區塊標號為maxid的pixel的座標 }
這個部分還不是很懂,那要怎樣去找出最大(maxcounts),還有我怎麼用id值都是區塊數,並不是區塊數裡的數量~~小弟愚笨問,問題太蠢...是希望多學一點
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-18 20:15:41 IP:221.169.xxx.xxx 未訂閱
這邊要找出最大的區塊的部份,我用了比較偷懶的方式,但概念相當簡單 舉例來說,現在有五個數字:1,4,6,2,8 每當我讀入一個數的時候,就判斷是否大於目前的最大值 若是,則令最大值(maxvalue)為現在讀進來的數 maxvalue=0; 依序讀入五個數字 step1: 1> maxvalue 所以設定 maxvalue=1 step2: 4> maxvalue 所以設定 maxvalue=4 step3: 6> maxvalue 所以設定 maxvalue=6 step4: 2< maxvalue 不作更動 step5: 8> maxvalue 所以設定 maxvalue=8    我寫的程式概念相同,但除了記錄最大的數值之外,還需要額外記錄該id的值 因此
從上而下
{
  從左而右
  {
    counts=Connect(xxxxx....);
    if (counts > maxcounts) //假若現在這個區塊的大小大於已知的最大區塊
    {
      maxcounts=counts; //更新已知最大區塊的大小
      maxid=id; //將擁有最大區塊的id記下來
    }
  }
}
發表人 - justdo 於 2004/10/18 20:17:18 發表人 - justdo 於 2004/10/18 20:18:38
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-20 15:49:09 IP:163.28.xxx.xxx 未訂閱
引言: step1: 1> maxvalue 所以設定 maxvalue=1 step2: 4> maxvalue 所以設定 maxvalue=4 step3: 6> maxvalue 所以設定 maxvalue=6 step4: 2< maxvalue 不作更動 step5: 8> maxvalue 所以設定 maxvalue=8
int id=0,counts=0;
char img2[320][240]={0};
   BMP->Assign(Image1->Picture->Bitmap );
   for(int y = 0; y < BMP->Height; y  )
   {
      ptr = (Byte *) BMP->ScanLine[y];
      for(int x = 0; x < BMP->Width; x  )
    {            if(ptr[x * 3] == 255)
        {
           counts=Connect(BMP, x, y);              if (counts > maxcounts)
            {
             maxcounts=counts;
             maxid=id;
             }
            Area  ;
            id  ;
        }         }
   }
[
問如果我要找出每區塊內的數目,並且取出每一個去塊做比較大小要怎樣撰寫呢?嘗試好多次,不知道要加在哪裡,是不是我以前沒有學過有關程式語言,有些與我想的邏輯觀念不同,有些觀念相反,好奇怪喔!!快亂囉...前輩請指教為我解惑...謝謝
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-20 23:12:39 IP:221.169.xxx.xxx 未訂閱
你先把你的想法寫出來好了,不然這樣一點交集也沒有 也要知道:程式語言是很笨的,你要一步一步告訴他該怎麼作... 另外,每一次呼叫Connect,傳回的counts值便是該次id的區塊大小 你可以用陣列記錄下來,例如int c[255]; 當呼叫完counts=Connect(...)之後 緊接著c[id]=counts;,便可以把區塊的值記錄下來 接下來看你要怎樣比較都行
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-22 14:07:42 IP:163.28.xxx.xxx 未訂閱
這是依照你說的方式做比較..不過我是用指標方式,就是沒有辦法抓去他所回傳的counts值,回傳值都是"1"沒有辦法回傳該搜尋區塊的數量,因而無法比較,是我用錯嗎?還是有其他原因..請前輩指教...謝謝 < class="code"> int *com(int); //---------------------------------------- int *com(int k) { int y,maxcounts=0; if(k > maxcounts) { maxcounts=k; y = maxcounts; } return (&y); } //---------------------------------------- int __fastcall TForm1::Connect(Graphics::TBitmap * BMP, int x, int y) { int counts=0; int *k; total ; counts ; k=com(counts); Edit5->Text=IntToStr(&k); . . 檢查8個方位
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-10-23 11:26:04 IP:221.169.xxx.xxx 未訂閱
不知道你的com函式用途為何? 況且你傳回的指標所指的那個y 在com函式結束的時候,y的空間會歸還給系統,所以return指標指的那個位置已經無效了,根本是錯誤的用法    從前面的討論到現在,我覺得這個程式實在不適合現在程度的你來完成,或許你應該先從小的c程式開始練習起,待有一些基礎之後才來研究影像處理    我把完整的source code都放上來,已經測試是可以運作的了,先解決你現在要作的事,有空你在慢慢研究程式的邏輯,整個邏輯在前面的文章已經提過了,翻出來對照看看會比較容易瞭解    另外,那個原本的Connect函式還有兩個問題存在,一個是傳回的計數值是錯誤的,因為他沒有將八個方位個別傳回的pixel數累加起來;另一個是他搜尋的方位還少了一個,次數卻有九次,我都已經更正了,比照看一下就知道了    我就幫到這兒了,以後不在回覆這個話題    完整的程式碼如下:
.h檔
class TForm1 : public TForm
{
__published:        // IDE-managed Components
        TButton *Button1;
        TImage *Image1;
        void __fastcall Button1Click(TObject *Sender);
private:        // User declarations
        unsigned int **map;
public:                // User declarations
        __fastcall TForm1(TComponent* Owner);
        __fastcall Connect(Graphics::TBitmap* BMP, int x, int y);
};    .cpp檔
TForm1 *Form1;
int id=1;    int min(int a, int b)
{
   return (ab) ? a : b;
}    void __fastcall TForm1::Button1Click(TObject *Sender)
{
   unsigned int counts=0;
   unsigned int maxcounts=0;
   unsigned int maxid=0;       Graphics::TBitmap *BMP = new Graphics::TBitmap();
   BMP->Assign(Image1->Picture->Bitmap );
   Byte *ptr=NULL;
   BMP->PixelFormat = pf8bit;
   int width=BMP->Width;
   int height=BMP->Height;       map=new unsigned int*[height];
   for (int i=0; iScanLine[y];
      for(int x = 0; x < width; x  )
      {
         if(ptr[x] == 255)
         {
            counts= Connect(BMP, x, y);
            if (counts > maxcounts)
            {
                maxcounts=counts;
                maxid=id;
            }
            id  ;
         }
      }
   }
   delete BMP;       ShowMessage(AnsiString("最大區塊為:")   maxid   ", 大小="   maxcounts);       int maxx=0, maxy=0, minx=width-1, miny=height-1;
   for (int y=0; y
    keikojason
    
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-10-24 23:50:16 IP:218.169.xxx.xxx 未訂閱
小弟先謝謝justdo不厭其煩的告知小弟< >,抽出怎麼多寶貴時間,回答一些愚笨的問題,來為小弟解惑,真是不好意思,心想說沒有問題怎麼會學會呢?小弟就硬這頭皮上來問問題..想說問這一些笨問題回有人回答嗎?...之後讓我有點窩心< >,在上面的人都不吝嗇有問必答...< >以下是我還有些問題請為小弟解惑..謝謝~~< > 1.int id=1; 為什麼id設為1,一般初始不是設為0嗎? 2.在int min(int a, int b)與max(int a, int b)宣告,是不是讓Button再一次執行中,對最大ˋ最小座標值不會被覆蓋過去是嗎? 3.unsigned int宣告與單純的int宣告插在哪呢?還有unsigned int **map; *map算指標哪兩個**指什麼意思呢? 4.下段程式是對什麼而做運算,是對一個所開新的Map找的區域找尋最大與最小座標嗎?是不是與問題2有相對關係....還是這段有另外的意思;那在counts= Connect(BMP, x, y);中的map[y][x]=id;是怎樣的重要角色,再判斷八個方向是[x][y],而map[y][x]這樣不會影響嗎?為什麼... 5.在執行第一次時,最大區塊有多少是正確,但是如果Button連按多次就不一樣,他會以該圖共有多少的白色點的3倍累加,例如圖中全部只有一個連續區域白色點25,按第一次"1"正確;按第二次"76=1 25*3"按第三次"151(76 75)".....這是為什麼呢?
map=new unsigned int*[height]; <==怎麼解釋
   for (int i=0; i
發表人 - keikojason 於 2004/10/25 00:18:29
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-10-25 07:52:35 IP:221.169.xxx.xxx 未訂閱
事實上,我是有點不太想回答了,因為許多問題在書上或HELP都有,對於整個程式的作法我也解釋過一遍了,但似乎您沒有自己認真的看一遍、找一遍、想一遍... 老話一句,你應該還是從簡單的程式練習起,至少也要看完一本c/c 的書吧... 1.沒錯,但是0在這邊是用來標記為「沒有區塊存在的地方」 2.不太懂你的問題 3.請查閱c/c 的書籍 4.是的,map和BMP使用不同的記憶體區域,所以相互間沒有影響 5.那是因為id是全域變數,所以會不斷的累加下去,在TForm1::Button1Click函式的第一行新增id=1;即可
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-11-05 17:01:09 IP:163.28.xxx.xxx 未訂閱
不好意思又要打擾你囉justdo因為你有教我怎麼找座標是又找到囉不過在圖形是方的長方形的,都可以正確的抓出不過在不規則就無法抓有錯誤,我有試這去改改不過還是有問題,請前輩指點圖中是我用的,左邊正常有邊有誤
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-11-08 22:11:34 IP:221.169.xxx.xxx 未訂閱
我測試是正常的... 會選到左下角那個區塊呀... 你用F7或F8追蹤進去看他的程式是怎麼跑的
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-04-20 18:13:57 IP:221.169.xxx.xxx 未訂閱
在追別人的應用程式的時候,意外發現一個小bug 請把
memset(map[i], 0, width);
改成
memset(map[i], 0, width*sizeof(unsigned int));
系統時間:2024-05-01 23:34:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!