將圖像膨脹的問題 |
答題得分者是:TheMoon
|
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
各位前輩好:
小弟有些問題問問各位前輩"要將二直化好的圖像,再做膨脹"想說要用5*5的遮罩以中心為基準周圍白點>12時候將其他周圍視為白點;如果周圍白點<12其他周圍視為黑點...我是有參考一位前輩(taishyang)得範例...我有做些修改不過好像效果不大,是否請前輩幫小弟看看是哪裡有問題,紅色部分是小弟改過認為可能有問題的~~~可以為小弟解解惑~~!!!
< class="code">
int __fastcall TForm1::Fx(int i,int j)
{
int p[26];
p[1]=p1[i-2][j-2];
p[2]=p1[i-1][j-2];
p[3]=p1[i][j-2];
p[4]=p1[i 1][j-2];
p[5]=p1[i 2][j-2];
p[6]=p1[i-2][j-1];
p[7]=p1[i-1][j-1];
p[8]=p1[i][j-1];
p[9]=p1[i 1][j-1];
p[10]=p1[i 2][j-1];
p[11]=p1[i-2][j];
p[12]=p1[i-1][j];
p[13]=p1[i][j];
p[14]=p1[i 1][j];
p[15]=p1[i 2][j];
p[16]=p1[i-2][j 1];
p[17]=p1[i-1][j 1];
p[18]=p1[i][j 1];
p[19]=p1[i 1][j 1];
p[20]=p1[i 2][j 1];
p[21]=p1[i-2][ 2];
p[22]=p1[i-1][j 2];
p[23]=p1[i][j 2];
p[24]=p1[i 1][j 2];
p[25]=p1[i 2][j 2]; int Fx=0 ;
for(int a=1 ;(a>=1)&&(a<26);a )
{
Fx= Fx p[a];
}
if(Fx>12)
{
for(int a=1 ;(a>=1)&&(a<26);a )
{
p[a]=255;
}
}
else
{
for(int a=1 ;(a>=1)&&(a<26);a )
{
p[a]=0;
}
} return(Fx); }
//--------------------------------------------------------------
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Assign(Image2->Picture->Bitmap );
for (int i=0;i
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: 各位前輩好: 小弟有些問題問問各位前輩"要將二直化好的圖像,再做膨脹"想說要用5*5的遮罩以中心為基準周圍白點>12時候將其他周圍視為白點;如果周圍白點<12其他周圍視為黑點...我是有參考一位前輩(taishyang)得範例...我有做些修改不過好像效果不大,是否請前輩幫小弟看看是哪裡有問題,紅色部分是小弟改過認為可能有問題的~~~可以為小弟解解惑~~!!! >>< face="Verdana, Arial, Helvetica"> keikojason你好: 依照你的說法,是白色削蝕和黑色膨脹同時都做嗎?還是有別的意義? 一般膨脹應該是只有填補,如果區塊裡沒有一定數量以上,則不做填補 的動作。但從你的程式來看,如果數量沒有大於12(也就是小於等於12) ,則消去像素,如此會產生一種現象,粗的地方愈粗,細的地方愈細。 若只是要做膨脹,我覺得小於12的像素,應該不用填為白色。保持原來 的樣子就可以。 |
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: 沒有錯我是白色削蝕和黑色膨脹同時都做,那我要怎樣用因為我修改過後效果不是很好;想要用的膨脹是用5*5大於12填為白色,小於12填為黑色;削蝕是用3*3小於3就填為黑色,大於3填為白色..這是我要用的方式...不知道上式是有什麼錯誤造成效果不是很好....請前輩指教.. >>< face="Verdana, Arial, Helvetica"> keikojason你好, 先澄清一些問題, 1.)膨脹是用5*5大於12填為白色,小於12填為黑色 ->這樣的做法就是削蝕膨脹同時做,那3x3應該就不用做了吧? 2.)單獨做膨脹或削蝕,很容易判斷是對是錯,因為一看就知道,如果膨脹和削蝕 同時做,因為兩種變化都有,很難判斷是對還是錯。請問為什麼要同時做,預期 得到怎樣的結果? 3.)若只是要做膨脹,我覺得小於12的像素,應該不用填為黑色。保持原來 的樣子就可以。 預設程式是正確的,只是想先離清問題是出在演算法,還是在程式。 |
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
TheMoon
中階會員 發表:17 回覆:95 積分:67 註冊:2002-06-05 發送簡訊給我 |
引言:int __fastcall TForm1::Fx(int i, int j) { int p[26]; p[1]=p1[i-2][j-2]; p[2]=p1[i-1][j-2]; p[3]=p1[i][j-2]; p[4]=p1[i 1][j-2]; p[5]=p1[i 2][j-2]; p[6]=p1[i-2][j-1]; p[7]=p1[i-1][j-1]; p[8]=p1[i][j-1]; p[9]=p1[i 1][j-1]; p[10]=p1[i 2][j-1]; p[11]=p1[i-2][j]; p[12]=p1[i-1][j]; p[13]=p1[i][j]; p[14]=p1[i 1][j]; p[15]=p1[i 2][j]; p[16]=p1[i-2][j 1]; p[17]=p1[i-1][j 1]; p[18]=p1[i][j 1]; p[19]=p1[i 1][j 1]; p[20]=p1[i 2][j 1]; p[21]=p1[i-2][ 2]; p[22]=p1[i-1][j 2]; p[23]=p1[i][j 2]; p[24]=p1[i 1][j 2]; p[25]=p1[i 2][j 2]; int Fx=0; for(int a=1; (a>=1)&&(a<26); a ) { Fx=Fx p[a]; //<-問題(3) } if(Fx>12) //<-問題(4) { for(int a=1; (a>=1)&&(a<26); a ) { p[a]=255; } } else { for(int a=1; (a>=1)&&(a<26); a ) { p[a]=0; } } return(Fx); } //底下應該是另一段code吧? //-------------------------------------------------------------- Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Bmp->Assign(Image2->Picture->Bitmap ); for (int i=0; i 您好,想先釐清幾個問題: (1)您讀入Bmp物件裡的影像資料是否已是二值化圖形? (2)您二值化後的影像值為何?(代表黑點的值是多少?代表白點的值是多少?) (3)那一段code應該是在計算白點有幾個吧?如過是的話那code應為 int Fx=0; for(int a=1; a<26; a ) { if(p[a]==255) Fx ; //我假設白點的值是255 } (4)那一段code似乎沒意義,因為改變p[a]中的值並不會對您想要處理的影像造成任何改變。 (5)應該是 p1[i][j]=ptr[j*3]; 吧? (6)應該是 Fx(i,j) 吧? (7)應該是 Fx(i,j)>=12 吧? 以上是小弟的看法,不知是否有誤? >> |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |