請問如果已經二質化完找出影像,如何剔除不要的不規則型 |
尚未結案
|
bala0514
一般會員 發表:42 回覆:37 積分:15 註冊:2004-07-26 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
1666362
初階會員 發表:66 回覆:124 積分:43 註冊:2004-07-07 發送簡訊給我 |
|
KENI_LIN
中階會員 發表:86 回覆:267 積分:90 註冊:2004-05-31 發送簡訊給我 |
講簡單一點,就是只做你要的區域做處理就好了;先找出左上和右下座標,即可抓出一個矩形面積;至於怎麼尋找要的面積區域顯示,可以參考以下這個討論區:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=62637
以上方法的前提要先知道你要的座標點位置,如果不知道怎麼找X,Y座標,以下這一個討論區有講到:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57368 剛剛有想你的問題是不是要"自動"剔除不要的不規則型,如果是會有一點麻煩,因為這個問題將會是屬於"辨識"程式,就要先看看你的原始圖長什麼樣子嘍! 寒窗苦讀十年書;只待今朝狀元時!~~
︵ / / ︵
( ∩ ∩ )
○ ︶ ○
------
Keni Lin |
bala0514
一般會員 發表:42 回覆:37 積分:15 註冊:2004-07-26 發送簡訊給我 |
各位高手好,我有大約瞭解你們的意思,taishyang所說的面積方法,我有嘗試過,但是僅對一個白色區塊作面積運算,可以得知其白色區塊所有像素,亦即表示區塊面積。但是要如何計算所有的面積區塊,這就有點難倒我了。若上圖全部白色區塊面積能夠算出,就能夠剔除不要的白色區塊面積,保留所需要的區塊大小,這樣問題應該就可以解決了。那要如何利用程式表示呢?以下我有引用1666362 會員所撰寫的求質心與面積方法,可以找尋到一個白色區塊,但要如何對多區塊作運算呢?
Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Byte *ptr; int r,g,b; int i,j,XX,YY; int sum=0,X=0,Y=0; Bmp->Assign(Image2->Picture->Bitmap); Bmp->PixelFormat=pf24bit; for (int i=0;i謝謝各位 ***程式語言真是一門高深的學問***
------
***程式語言真是一門高深的學問*** |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
您好:
我指的是利用類似下面連結的方式求出每一塊的面積
http://delphi.ktop.com.tw/topic.php?topic_id=54609 順心
|
bala0514
一般會員 發表:42 回覆:37 積分:15 註冊:2004-07-26 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
bala0514
一般會員 發表:42 回覆:37 積分:15 註冊:2004-07-26 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
bala0514
一般會員 發表:42 回覆:37 積分:15 註冊:2004-07-26 發送簡訊給我 |
|
sew
一般會員 發表:2 回覆:54 積分:21 註冊:2003-08-25 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
下面的連結中的程式碼參考看看
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=50190
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
引言: taishyang,我不是很懂,不知是否可以說明白點呢。接觸影像處理,還不是很懂,希望多多指教。可否大約說明呢?每次遞回,不是從影像的最左上端開始掃瞄,一直掃,遇到白色的就累積,而這樣子就計算全部白色區域的面積,而不知可否一塊一塊計算,分別將每一塊的值,用Edit顯示出來,而在過濾不要的或較小面積的白色區塊。謝謝!感激不盡 ***程式語言真是一門高深的學問***可以使用regional growing的方法將不同的區塊上不同的色,然後再用sew版友提的方法就可以得到你要的結果了。 |
bala0514
一般會員 發表:42 回覆:37 積分:15 註冊:2004-07-26 發送簡訊給我 |
|
bala0514
一般會員 發表:42 回覆:37 積分:15 註冊:2004-07-26 發送簡訊給我 |
不好意思,我又有問題了,若我在影像上如圖一,找到各白色區塊的面積了。分別是,27、59、68、115、47、234、56、959像素,而我想說,去除掉低於959的像素,而在另一張影像顯現出僅有959像素的白色區塊。或者由原圖中,低於959像素的區塊利用紅色填滿,以示區隔,謝謝。程式碼如下(參考taishyang大大)。< >< >
int count=0; int Connect(Graphics::TBitmap * BMP, int x, int y) { count ; BMP->Canvas->Pixels[x][y] = clBlack; // 判斷 (x 1,y) if(BMP->Canvas->Pixels[x 1][y] == clWhite) { Connect(BMP, x 1, y); } // 判斷(x 1, y - 1) if(BMP->Canvas->Pixels[x 1][y - 1] == clWhite) { Connect(BMP, x 1, y - 1); } // 判斷 (x 1,y 1) if(BMP->Canvas->Pixels[x][y - 1] == clWhite) { Connect(BMP, x , y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x-1][y - 1] == clWhite) { Connect(BMP, x-1, y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x-1][y] == clWhite) { Connect(BMP, x-1, y); } // 判斷 (x-1,y) if(BMP->Canvas->Pixels[x - 1][y 1] == clWhite) { Connect(BMP, x - 1, y 1); } // 判斷 (x-1,y-1) if(BMP->Canvas->Pixels[x][y 1] == clWhite) { Connect(BMP, x, y 1); } // 判斷 (x 1,y) if(BMP->Canvas->Pixels[x 1][y 1] == clWhite) { Connect(BMP, x 1, y 1); } // 判斷 (x-1,y 1) if(BMP->Canvas->Pixels[x 1][y] == clWhite) { Connect(BMP, x 1, y); } return (count); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int c = 0; Graphics::TBitmap *BMP = new Graphics::TBitmap(); Byte *ptr=NULL; BMP->LoadFromFile("1.bmp"); 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) { int cx= Connect(BMP, x, y); Memo1->Lines->Add(cx); 顯示每次計算的結果(物件所佔的像素數) count=0; //歸0用 if (cx>=0 && cx<=1000) c =1; //計算物件各數 (可用像素數cx來限制是否累計) //break; } } } ShowMessage(c); delete BMP; }謝謝 ***程式語言真是一門高深的學問***
------
***程式語言真是一門高深的學問*** |
bala0514
一般會員 發表:42 回覆:37 積分:15 註冊:2004-07-26 發送簡訊給我 |
不好意思,我又有問題了,若我在影像上如圖一,找到各白色區塊的面積了。分別是,27、59、68、115、47、234、56、959像素,而我想說,去除掉低於959的像素,而在另一張影像顯現出僅有959像素的白色區塊。或者由原圖中,低於959像素的區塊利用紅色填滿,以示區隔,謝謝。程式碼如下(參考taishyang大大)。< >< >
int count=0; int Connect(Graphics::TBitmap * BMP, int x, int y) { count ; BMP->Canvas->Pixels[x][y] = clBlack; // 判斷 (x 1,y) if(BMP->Canvas->Pixels[x 1][y] == clWhite) { Connect(BMP, x 1, y); } // 判斷(x 1, y - 1) if(BMP->Canvas->Pixels[x 1][y - 1] == clWhite) { Connect(BMP, x 1, y - 1); } // 判斷 (x 1,y 1) if(BMP->Canvas->Pixels[x][y - 1] == clWhite) { Connect(BMP, x , y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x-1][y - 1] == clWhite) { Connect(BMP, x-1, y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x-1][y] == clWhite) { Connect(BMP, x-1, y); } // 判斷 (x-1,y) if(BMP->Canvas->Pixels[x - 1][y 1] == clWhite) { Connect(BMP, x - 1, y 1); } // 判斷 (x-1,y-1) if(BMP->Canvas->Pixels[x][y 1] == clWhite) { Connect(BMP, x, y 1); } // 判斷 (x 1,y) if(BMP->Canvas->Pixels[x 1][y 1] == clWhite) { Connect(BMP, x 1, y 1); } // 判斷 (x-1,y 1) if(BMP->Canvas->Pixels[x 1][y] == clWhite) { Connect(BMP, x 1, y); } return (count); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int c = 0; Graphics::TBitmap *BMP = new Graphics::TBitmap(); Byte *ptr=NULL; BMP->LoadFromFile("1.bmp"); 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) { int cx= Connect(BMP, x, y); Memo1->Lines->Add(cx); 顯示每次計算的結果(物件所佔的像素數) count=0; //歸0用 if (cx>=0 && cx<=1000) c =1; //計算物件各數 (可用像素數cx來限制是否累計) //break; } } } ShowMessage(c); delete BMP; }謝謝 ***程式語言真是一門高深的學問***
------
***程式語言真是一門高深的學問*** |
bala0514
一般會員 發表:42 回覆:37 積分:15 註冊:2004-07-26 發送簡訊給我 |
不好意思,我又有問題了,若我在影像上如圖一,找到各白色區塊的面積了。分別是,27、59、68、115、47、234、56、959像素,而我想說,去除掉低於959的像素,而在另一張影像顯現出僅有959像素的白色區塊。或者由原圖中,低於959像素的區塊利用紅色填滿,以示區隔,謝謝。程式碼如下(參考taishyang大大),要如何加入判斷呢?是在if (cx>=0 && cx<=1000中加入嗎?要加入些???。謝謝< >< > 圖一
int count=0; int Connect(Graphics::TBitmap * BMP, int x, int y) { count++; BMP->Canvas->Pixels[x][y] = clBlack; // 判斷 (x+1,y) if(BMP->Canvas->Pixels[x + 1][y] == clWhite) { Connect(BMP, x + 1, y); } // 判斷(x + 1, y - 1) if(BMP->Canvas->Pixels[x + 1][y - 1] == clWhite) { Connect(BMP, x + 1, y - 1); } // 判斷 (x+1,y+1) if(BMP->Canvas->Pixels[x][y - 1] == clWhite) { Connect(BMP, x , y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x-1][y - 1] == clWhite) { Connect(BMP, x-1, y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x-1][y] == clWhite) { Connect(BMP, x-1, y); } // 判斷 (x-1,y) if(BMP->Canvas->Pixels[x - 1][y+1] == clWhite) { Connect(BMP, x - 1, y+1); } // 判斷 (x-1,y-1) if(BMP->Canvas->Pixels[x][y + 1] == clWhite) { Connect(BMP, x, y + 1); } // 判斷 (x+1,y) if(BMP->Canvas->Pixels[x + 1][y+1] == clWhite) { Connect(BMP, x + 1, y+1); } // 判斷 (x-1,y+1) if(BMP->Canvas->Pixels[x + 1][y] == clWhite) { Connect(BMP, x + 1, y); } return (count); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int c = 0; Graphics::TBitmap *BMP = new Graphics::TBitmap(); Byte *ptr=NULL; BMP->LoadFromFile("1.bmp"); 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) { int cx= Connect(BMP, x, y); Memo1->Lines->Add(cx); 顯示每次計算的結果(物件所佔的像素數) count=0; //歸0用 if (cx>=0 && cx<=1000) c+=1; //計算物件各數 (可用像素數cx來限制是否累計) //break; } } } ShowMessage(c); delete BMP; }謝謝 ***程式語言真是一門高深的學問*** 發表人 -
------
***程式語言真是一門高深的學問*** |
1666362
初階會員 發表:66 回覆:124 積分:43 註冊:2004-07-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |