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

關於低通

答題得分者是:taishyang
bee0606
一般會員


發表:22
回覆:30
積分:10
註冊:2003-08-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-13 16:01:41 IP:163.25.xxx.xxx 未訂閱
請問先進...偶寫一低通用於影像上..不過在RUN之後...發現只有在影像低左半邊影像有在做低通...而右半邊沒執行LOWPASS...
for (int y=0; yHeight; y  )
  {
     up = y - 1;
     down = y   1;
      if (up < 0) up = image_temp->Height -1 ;
      if (down == image_temp->Height) down =0;
       ptr = (Byte*)image_low->ScanLine[y];
       tptr = (Byte*)image_low->ScanLine[y];
       mptr = (Byte*)image_low->ScanLine[up];
       dptr = (Byte*)image_low->ScanLine[down];
         for (int x=0; xWidth; x  )
          {
           left = x - 1;
           right = x   1;
            if (left < 0) left = image_temp->Width - 1;
            if (right == image_temp->Width) right = 0;
              Lowpass_mask= (int)(uptr[left] uptr[x] uptr[right] 
                                  mptr[left] mptr[x] mptr[right] 
                                  dptr[left] dptr[x] dptr[right]);
              ptr[x] = (Byte) (Lowpass_mask/9);
           }
   }
不知使程式哪有問題....謝謝先進ㄋㄟ...
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-13 16:20:48 IP:140.135.xxx.xxx 未訂閱
bee0606您好:   不嫌棄的話,可以參考小弟的拙作   http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34152 影像處理IV 並請參考版規做適當的修正 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=35105 謝謝您的合作 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
bee0606
一般會員


發表:22
回覆:30
積分:10
註冊:2003-08-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-13 16:35:43 IP:163.25.xxx.xxx 未訂閱
嗯..了解...馬上改進...謝謝先進
JerryKuo
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-13 16:36:23 IP:210.68.xxx.xxx 未訂閱
bee你好: 看得眼花瞭亂,使用很多技巧喔!因此很難找呢... lowpass應該可以不用這麼複雜,寫簡單一點 你可以參考版主taishany曾發表的程式,或是如下,參考看看    可以當作萬用濾波器,只要把filter參數改一下,就可以實現高,中,低,sobel 等等濾波器。
void Lowpass(byte **img_in,byte **img_out,int w,int h)
{
 int filter[3][3];
 int i,j,x,y;
 int sum=0;     //---------give filter value-------------------
 filter[0][0]=1; filter[1][0]=1; filter[2][0]=1;
 filter[0][1]=1; filter[1][1]=1; filter[2][1]=1;
 filter[0][2]=1; filter[1][2]=1; filter[2][2]=1;
 //---------------------------------------------
 for (j=1;j<(h-1);j  )   //不考慮邊緣的像素 處理y軸範圍(1~h-1)
    for (i=1;i<(w-1);i  )//                     x軸範圍(1~w-1)
       {
        sum=0;
 //---------相鄰九點和-------------------------------------
        for(y=0;y<3;y  )
          {
           for(x=0;x<3;x  )
               {
               sum =((int)img_in[(j-1) y][(i-1) x])*filter[x][y];
               }
          }
        img_out[j][i]=(byte)(sum/9);   //相鄰九點值和,再除九
       }
}
bee0606
一般會員


發表:22
回覆:30
積分:10
註冊:2003-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-13 17:44:50 IP:163.25.xxx.xxx 未訂閱
 int filter[3][3];
 int i,j,x,y;
 int sum=0;
 Graphics::TBitmap *img_in, *img_out;
 img_out=new Graphics::TBitmap();
 Image7->Picture->LoadFromFile("Temp.BMP");
 img_in=Image7->Picture->Bitmap;
 img_out->Assign(img_in);
 Width = img_in->Width;
 Height = img_in->Height;
 //---------give filter value-------------------
 filter[0][0]=1; filter[1][0]=1; filter[2][0]=1;
 filter[0][1]=1; filter[1][1]=1; filter[2][1]=1;
 filter[0][2]=1; filter[1][2]=1; filter[2][2]=1;
 //---------------------------------------------
 for (j=1;jCanvas->Pixels[(j-1)+y][(i-1)+x])*filter[x][y];
               }
          }
        img_out->Canvas->Pixels[j][i]=(byte)(sum/9);   //相鄰九點值和,再除九
       }
   Image6->Picture->Assign(img_out);
我這樣改寫...還是只會run左半邊...右半邊沒有反應..沒有mask...
JerryKuo
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-13 18:12:14 IP:210.68.xxx.xxx 未訂閱
bee 抱歉喔~ 1.不知道你有沒有發現?我的陣列是image[y][x]不像bitmap是先[x]再[y] 這是個陷井....呵呵,當初這樣改是有用處的。(記憶體讀取問題) 所以不要被我的程式誤導了,這樣才是正確的 >>>>>>
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-13 19:26:47 IP:140.135.xxx.xxx 未訂閱
bee0606您好:  用JerryKuo大哥的程式碼,我測試過  如JerryKuo所言的第1項,修改後就可以WORK了  不過用完Graphics::TBitmap *img_in, *img_out;  記得要釋放記憶體< > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~
bee0606
一般會員


發表:22
回覆:30
積分:10
註冊:2003-08-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-15 13:20:45 IP:163.25.xxx.xxx 未訂閱
感謝各位先進...相當感謝先進進新的講解...謝謝
jiaching
一般會員


發表:21
回覆:21
積分:8
註冊:2003-07-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-16 11:24:58 IP:211.76.xxx.xxx 未訂閱
請問一下我用了以上的程式碼跑程式時,發現我低通後的結果如下     這是什麼原因呢? 如有違反版歸 請多多原諒~~~~~
braveheart
一般會員


發表:35
回覆:62
積分:24
註冊:2003-05-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-08-17 22:01:01 IP:61.71.xxx.xxx 未訂閱
不好意思..發現我這也有這問題...在改過之後..也會有如同JISHING一樣.. 試了一段時間..還是無解......這是哪有問題..是圖形格式的問題嗎...
JerryKuo
版主


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-08-18 09:55:14 IP:61.230.xxx.xxx 未訂閱
你們好:    我想你們應該都是看bee0606的程式吧,那只是個演算法。 實際的參數要自己斟酌清況而定。 應該是錯在這幾行吧< class="code"> //---------相鄰九點和------------------------------------- for(y=0;y<3;y ) { for(x=0;x<3;x ) { sum =((int)img_in->Canvas->Pixels[(j-1) y][(i-1) x])*filter[x][y]; } } img_out->Canvas->Pixels[j][i]=(byte)(sum/9); 程式的原意是將9個像素相加,如果是灰階值,9點相加數值範圍並不會超過 integer數值範圍,如果是RGB,依照bee0606的寫法,其數值很有可能會超過 32bits,結果一定是不正確。所以要做RGB,就要分別做運算。
byte  clrR;
int   sum = 0;
sum  = (int)GetRValue(img_in->Canvas->Pixels[i][j]*Filter[x][y];
clrR = (byte)sum/9;
 :
// do for clrG
 :
// do for clrB
 :
img_out->Canvas->Pixels[j][i] = (TColor)RGB(clrR,clrG,clrB);
這也是演算法,實際作法請斟酌。
jiaching
一般會員


發表:21
回覆:21
積分:8
註冊:2003-07-05

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-08-18 17:16:03 IP:211.76.xxx.xxx 未訂閱
不好意思喔~~~我改了一下大概如下  可是我低通後的結果都是黑色的說 怪怪的    
     for (j=1;jCanvas->Pixels[i][j]*filter[x][y];
               sum1 =(int)GetRValue(c);
                r=(byte)sum1/9;
                 sum2 =(int)GetGValue(c);
                g=(byte)sum2/9;
                 sum3 =(int)GetBValue(c);
                 b=(byte)sum3/9;
              }
          }
           img_out->Canvas->Pixels[i][j]=(TColor)RGB(r,g,b);
             
       }
   }
   img2->Picture->Assign(img_out);
如有違反版規 請原諒我~~~~
JerryKuo
版主


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-08-18 17:52:39 IP:61.230.xxx.xxx 未訂閱
引言:
 for (j=1;jCanvas->Pixels[i][j]*filter[x][y];
               sum1 =(int)GetRValue(c);  
               r=(byte)sum1/9;
               sum2 =(int)GetGValue(c);
               g=(byte)sum2/9;
               sum3 =(int)GetBValue(c);
               b=(byte)sum3/9;
              }
          }
           r=(byte)sum1/9;
           g=(byte)sum2/9;
           b=(byte)sum3/9;
           img_out->Canvas->Pixels[i][j]=(TColor)RGB(r,g,b);
       }
   }
   img2->Picture->Assign(img_out);
藍色的地方去掉,加上紅色的地方..試試看吧! 發表人 -
JerryKuo
版主


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-08-19 10:02:12 IP:61.230.xxx.xxx 未訂閱
Graphics::TBitmap *img_in  = new Graphics::TBitmap();
Graphics::TBitmap *img_out = new Graphics::TBitmap();    int  i,j,x,y;
byte r,g,b;
int sum1,sum2,sum3;    //img_in讀取圖片資料
img_out->Width  = img_in->Width;
img_out->Height = img_in->Height;    //------------製作3x3濾波器 -------------------
 filter[0][0]=1; filter[1][0]=1; filter[2][0]=1;
 filter[0][1]=1; filter[1][1]=1; filter[2][1]=1;
 filter[0][2]=1; filter[1][2]=1; filter[2][2]=1;
//---------------------------------------------    for (j=1;j<(Height-1);j  )  
{   
    for (i=1;i<(Width-1);i  )                   
    {
      sum1=0;
      sum2=0;
      sum3=0; 
      for(y=0;y<3;y  )
      {
       for(x=0;x<3;x  )
       {
        sum1 =(int)GetRValue(img_in->Canvas->Pixels[i-1 x][j-1 y])*filter[x][y];
        sum2 =(int)GetGValue(img_in->Canvas->Pixels[i-1 x][j-1 y])*filter[x][y];  
        sum3 =(int)GetBValue(img_in->Canvas->Pixels[i-1 x][j-1 y])*filter[x][y];
       }
      }
      r=(byte)(sum1/9);
      g=(byte)(sum2/9);
      b=(byte)(sum3/9);
      img_out->Canvas->Pixels[i][j]=(TColor)RGB(r,g,b);
   }
}    Image->Picture->Assign(img_out);    小弟做了一下整理,值得注意的一點,下面這三行一定要括號,不然真的會一片潻黑
 r=(byte)(sum1/9);
 g=(byte)(sum2/9);
 b=(byte)(sum3/9);
不過用GetRValue會變得很慢,不建議用這個程式, 建議使用scanline比較快,請參照taishyang版主的大作
braveheart
一般會員


發表:35
回覆:62
積分:24
註冊:2003-05-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-08-19 11:32:30 IP:61.71.xxx.xxx 未訂閱
謝謝先進...真是受益良多... 會好好學習的....
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-10-15 13:53:21 IP:61.222.xxx.xxx 未訂閱
taishyang 大大 我用您提供分享的 影像處理程式 去執行.bmp(720*780) 存檔時候 沒辦法全部遮罩到ㄝ 有哪邊需要改嗎 我看程式碼 把最上面的 圖像改成 720*480 還是不行ㄝ ?? 我是新手 多多指教 ^^
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-10-16 08:05:08 IP:210.192.xxx.xxx 未訂閱
taishyang 大大 我用您提供分享的 影像處理程式 去執行.bmp(720*480) 存檔時候 沒辦法全部遮罩到ㄝ 有哪邊需要改嗎 我看程式碼 把最上面的 圖像改成 720*480 還是不行ㄝ ?? 我是新手 多多指教 ^^ 我是新手 多多指教 ^^
系統時間:2024-05-21 5:29:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!