線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1374
推到 Plurk!
推到 Facebook!

將圖像膨脹的問題

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-02 16:20:30 IP:163.28.xxx.xxx 未訂閱
各位前輩好: 小弟有些問題問問各位前輩"要將二直化好的圖像,再做膨脹"想說要用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;iHeight;i ) { ptr=(Byte*)Bmp->ScanLine[i]; for (int j=0;jWidth; j ) { p1[j][i]=ptr[j*3]; } } for (int i=0;iHeight;i ) { ptr=(Byte*)Bmp->ScanLine[i]; for (int j=0;jWidth; j ) { if (Fx(j,i)>=255) { ptr[j*3]=0; ptr[j*3 1]=0; ptr[j*3 2]=0; } else { ptr[j*3]=255; ptr[j*3 1]=255; ptr[j*3 2]=255; } } } Image2->Picture->Assign(Bmp);
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-02 17:01:12 IP:220.135.xxx.xxx 未訂閱
引言: 各位前輩好: 小弟有些問題問問各位前輩"要將二直化好的圖像,再做膨脹"想說要用5*5的遮罩以中心為基準周圍白點>12時候將其他周圍視為白點;如果周圍白點<12其他周圍視為黑點...我是有參考一位前輩(taishyang)得範例...我有做些修改不過好像效果不大,是否請前輩幫小弟看看是哪裡有問題,紅色部分是小弟改過認為可能有問題的~~~可以為小弟解解惑~~!!! < face="Verdana, Arial, Helvetica"> keikojason你好: 依照你的說法,是白色削蝕和黑色膨脹同時都做嗎?還是有別的意義? 一般膨脹應該是只有填補,如果區塊裡沒有一定數量以上,則不做填補 的動作。但從你的程式來看,如果數量沒有大於12(也就是小於等於12) ,則消去像素,如此會產生一種現象,粗的地方愈粗,細的地方愈細。 若只是要做膨脹,我覺得小於12的像素,應該不用填為白色。保持原來 的樣子就可以。
keikojason
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-02 19:53:10 IP:163.28.xxx.xxx 未訂閱
沒有錯我是白色削蝕和黑色膨脹同時都做,那我要怎樣用因為我修改過後效果不是很好;想要用的膨脹是用5*5大於12填為白色,小於12填為黑色;削蝕是用3*3小於3就填為黑色,大於3填為白色..這是我要用的方式...不知道上式是有什麼錯誤造成效果不是很好....請前輩指教..
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-03 09:28:40 IP:220.135.xxx.xxx 未訂閱
引言: 沒有錯我是白色削蝕和黑色膨脹同時都做,那我要怎樣用因為我修改過後效果不是很好;想要用的膨脹是用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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-03 22:57:55 IP:218.169.xxx.xxx 未訂閱
前輩你說得很有道理,怎麼沒有想到這問題這樣會衝突到,很難判斷是對還是錯。那再請問前輩那我要怎樣改程式,因為我用膨脹是用5*5大於12填為白色,小於12填為黑色但是處理效果不好,是因為判斷式子有問題嗎?那要怎樣改才好呢?我想應該是紅色部分有誤吧!!< >..請前輩指教..小弟會細心學習< >
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-04 14:23:24 IP:220.135.xxx.xxx 未訂閱
引言: 前輩你說得很有道理,怎麼沒有想到這問題這樣會衝突到,很難判斷是對還是錯。那再請問前輩那我要怎樣改程式,因為我用膨脹是用5*5大於12填為白色,小於12填為黑色但是處理效果不好,是因為判斷式子有問題嗎?那要怎樣改才好呢?我想應該是紅色部分有誤吧!!< >..請前輩指教..小弟會細心學習< >
什麼樣子的結果才是正確?"處理效果不好"是怎樣不好?可否再說明一下?
TheMoon
中階會員


發表:17
回覆:95
積分:67
註冊:2002-06-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-05 19:01:18 IP:202.39.xxx.xxx 未訂閱
引言:
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; iHeight; i  )
{
  ptr=(Byte*)Bmp->ScanLine[i];
  for (int j=0; jWidth; j  )
  {
    p1[j][i]=ptr[j*3]; //<-(5)
  }
}    for (int i=0; iHeight; i  )
{
  ptr=(Byte*)Bmp->ScanLine[i];
  for (int j=0; jWidth; j  )
  {        if (Fx(j,i)>=255) //<-(6)(7)
    {
       ptr[j*3]=0;
     ptr[j*3 1]=0;
     ptr[j*3 2]=0;
    }
    else
    {
     ptr[j*3]=255;
     ptr[j*3 1]=255;
     ptr[j*3 2]=255;
    }

  }
}
Image2->Picture->Assign(Bmp);
您好,想先釐清幾個問題:
(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 吧?    以上是小弟的看法,不知是否有誤?
     
        
系統時間:2024-11-23 9:10:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!