關於低通 |
答題得分者是:taishyang
|
bee0606
一般會員 發表:22 回覆:30 積分:10 註冊:2003-08-12 發送簡訊給我 |
請問先進...偶寫一低通用於影像上..不過在RUN之後...發現只有在影像低左半邊影像有在做低通...而右半邊沒執行LOWPASS...
for (int y=0; y不知使程式哪有問題....謝謝先進ㄋㄟ... |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
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 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
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 發送簡訊給我 |
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;j我這樣改寫...還是只會run左半邊...右半邊沒有反應..沒有mask... |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
bee0606
一般會員 發表:22 回覆:30 積分:10 註冊:2003-08-12 發送簡訊給我 |
|
jiaching
一般會員 發表:21 回覆:21 積分:8 註冊:2003-07-05 發送簡訊給我 |
|
braveheart
一般會員 發表:35 回覆:62 積分:24 註冊:2003-05-21 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
你們好: 我想你們應該都是看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 發送簡訊給我 |
不好意思喔~~~我改了一下大概如下 可是我低通後的結果都是黑色的說 怪怪的
for (j=1;j如有違反版規 請原諒我~~~~ |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言:藍色的地方去掉,加上紅色的地方..試試看吧! 發表人 -for (j=1;j |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
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 發送簡訊給我 |
|
1666362
初階會員 發表:66 回覆:124 積分:43 註冊:2004-07-07 發送簡訊給我 |
|
1666362
初階會員 發表:66 回覆:124 積分:43 註冊:2004-07-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |