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

想問個關於內插法的問題...

尚未結案
adeniss
一般會員


發表:3
回覆:4
積分:1
註冊:2005-04-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-08 21:13:35 IP:210.66.xxx.xxx 未訂閱
各位前輩好... 我是個剛接觸BCB的新手... 最近在寫關於影像放大的程式時遇到一些問題... 參考了JerryKuo版主所寫的內插法放大... http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34732 不過感覺上執行的速度偏慢... 於是我便從計算式稍微動了點手腳... 這是JerryKuo版主所提供的內插法公式...     clr(x,y) = (1-fx)*(1-fy)*clr1 +   (行1)                   fx *(1-fy)*clr2 +   (行2)                (1-fx)*   fy *clr3 +   (行3)                   fx *   fy *clr4     (行4) 我只將行2和行3 或 行1和行4 進行運算... 速度快了整整一倍... 不知道這樣的想法有沒有問題... 另外我在尋找運算速度變快的方法時... 發現還可以使用SCANLINE... arisaka_matsuri前輩和dean前輩參考JerryKuo版主的程式並加入SCANLINE... http://delphi.ktop.com.tw/topic.php?topic_id=49298 不過我發現只能將圖形縮放成50*50的圖形... 於是我稍加修改嘗試將程式改成和原本JerryKuo版主所寫的程式一樣可以自行決定縮放SIZE... void __fastcall TForm1::Button12Click(TObject *Sender) {   Graphics::TBitmap *Bmp = new Graphics::TBitmap();   Bmp->Assign(Image2->Picture->Bitmap);   Graphics::TBitmap *NBmp = new Graphics::TBitmap();   NBmp->PixelFormat=pf24bit;      int            w,h,newW,newH;   double         dX,dY,x,y;   int            i,j;   int            ix,iy;                    // integer value of (x,y)   double         fx,fy;                    // float value of (x,y)   unsigned char  clr,                  clrR,clrG,clrB,                  nclr1,nclr2,nclr3,nclr4;  // color of neighbor 4 pixel   double         a;    w = Bmp->Width;   h = Bmp->Height;   a = StrToFloat(Edit1->Text);      newW  =  (int)((double)w*a);   newH  =  (int)((double)h*a); ....後面都沒更動...所以不再重複POST... 可是在影像處理時卻會有這樣的警告視窗... 不知道可能是哪裡有了問題... 希望有人可以為我解惑... 謝謝!! 發表人 - adeniss 於 2005/09/08 21:17:12 發表人 - adeniss 於 2005/09/08 21:52:50 發表人 - adeniss 於 2005/09/08 21:54:43
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-10 01:17:38 IP:61.230.xxx.xxx 未訂閱
adeniss 您好:    我試過的結果是 OK 的,不知道您在執行時的 Edit1->Text 輸入值為何?如果有問題的話,應該就出在這裡。      7 天天敲鍵盤 v 時時按滑鼠 8
adeniss
一般會員


發表:3
回覆:4
積分:1
註冊:2005-04-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-10 14:10:50 IP:210.66.xxx.xxx 未訂閱
引言: adeniss 您好: 我試過的結果是 OK 的,不知道您在執行時的 Edit1->Text 輸入值為何?如果有問題的話,應該就出在這裡。 7 天天敲鍵盤 v 時時按滑鼠 8
RedSnow版主 您好: 其實我本來的設定是直接將放大倍率設為2倍... 也就是說... 我的Edit1->Text輸入值是2.0... 我比較想知道的是為什麼會有這個警告視窗... 然後我再試試看該怎麼處理... 謝謝... 發表人 - adeniss 於 2005/09/10 16:08:01
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-10 19:19:20 IP:59.115.xxx.xxx 未訂閱
adeniss 您好:    很抱歉,我做前一篇回覆時,僅有測試縮小的部分,因此沒有發生您描述的狀況,我剛才測試了一下放大的部份,也發生了相同的錯誤,我追蹤了一下程式碼之後,發現是計算結果會超過存取範圍所致,假設我們測試的圖檔尺寸是 800x600,使用放大倍數的值為 2.0 時,那麼 newW 會是 1600newH 會是 1200pRef 二維陣列的主索引範圍則是 600 (0~599),當外層迴圈 j 跑到 1198 (newH - 2) 時,iy 與 y 的值均為 599,因此後續敘述中的 pRef[iy 1] (pRef[600]) 索引超過範圍,所以會導致錯誤的發生,您參考一下吧。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/09/10 19:22:58
adeniss
一般會員


發表:3
回覆:4
積分:1
註冊:2005-04-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-10 21:40:23 IP:210.66.xxx.xxx 未訂閱
引言: adeniss 您好: 很抱歉,我做前一篇回覆時,僅有測試縮小的部分,因此沒有發生您描述的狀況,我剛才測試了一下放大的部份,也發生了相同的錯誤,我追蹤了一下程式碼之後,發現是計算結果會超過存取範圍所致,假設我們測試的圖檔尺寸是 800x600,使用放大倍數的值為 2.0 時,那麼 newW 會是 1600newH 會是 1200pRef 二維陣列的主索引範圍則是 600 (0~599),當外層迴圈 j 跑到 1198 (newH - 2) 時,iy 與 y 的值均為 599,因此後續敘述中的 pRef[iy 1] (pRef[600]) 索引超過範圍,所以會導致錯誤的發生,您參考一下吧。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/09/10 19:22:58
RedSnow版主 您好: 您的答案我之前就有考慮過了... 於是做了幾個試驗... 我分別在程式執行時... 改變倍率為0.5,0.6,0.7倍... 發現到0.7倍時就無法再進行運作... 另外則是... 我試著將 Byte **pRef = new Byte *[Bmp->Height]; for(int k = 0; k < Bmp->Height; k ) pRef[k] = (Byte *)Bmp->ScanLine[k]; 改為 Byte **pRef = new Byte *[newH newW]; for(int k = 0; k < newH newW; k ) pRef[k] = (Byte *)Bmp->ScanLine[k]; 或用極大的數字代入... 卻都會發生scan line index out of range... 因為是第一次碰SCANLINE還不太懂... 不好意思... 麻煩您多指導... 謝謝!!
JerryKuo
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-15 13:56:52 IP:220.135.xxx.xxx 未訂閱
引言: 各位前輩好... 我是個剛接觸BCB的新手... 最近在寫關於影像放大的程式時遇到一些問題... 參考了JerryKuo版主所寫的內插法放大... http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34732 不過感覺上執行的速度偏慢... 於是我便從計算式稍微動了點手腳... 這是JerryKuo版主所提供的內插法公式... clr(x,y) = (1-fx)*(1-fy)*clr1 (行1) fx *(1-fy)*clr2 (行2) (1-fx)* fy *clr3 (行3) fx * fy *clr4 (行4) 我只將行2和行3 或 行1和行4 進行運算... 速度快了整整一倍... 不知道這樣的想法有沒有問題... 四點內插變成兩點內插的結果,準確度降低,速度變快一倍。 至於這樣會不會有問題,要看你的需求,如果只是要加快速度,就 不要用內插,直接取最鄰近一點做就好,也比較好用scanline, 即然要用內插,卻只用兩點內插,犧牲準確度,降低複雜度。這樣 要好不好的準確度,我是覺得己經失去內插法的使用價值。 另外我在尋找運算速度變快的方法時... 發現還可以使用SCANLINE... arisaka_matsuri前輩和dean前輩參考JerryKuo版主的程式並加入SCANLINE... http://delphi.ktop.com.tw/topic.php?topic_id=49298 不過我發現只能將圖形縮放成50*50的圖形... 於是我稍加修改嘗試將程式改成和原本JerryKuo版主所寫的程式一樣可以自行決定縮放SIZE... [code] void __fastcall TForm1::Button12Click(TObject *Sender) { Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Bmp->Assign(Image2->Picture->Bitmap); Graphics::TBitmap *NBmp = new Graphics::TBitmap(); NBmp->PixelFormat=pf24bit; int w,h,newW,newH; double dX,dY,x,y; int i,j; int ix,iy; // integer value of (x,y) double fx,fy; // float value of (x,y) unsigned char clr, clrR,clrG,clrB, nclr1,nclr2,nclr3,nclr4; // color of neighbor 4 pixel double a; w = Bmp->Width; h = Bmp->Height; a = StrToFloat(Edit1->Text); newW = (int)((double)w*a); newH = (int)((double)h*a); [\code] ....後面都沒更動...所以不再重複POST... 可是在影像處理時卻會有這樣的警告視窗...
adeniss你好: 若內插法要用scanline,,提供一些我小小的建議, 1.)處理前,要注意pixelformat的問題,因為並不是每張圖 都是24bit,建議不要一個byte一個byte讀取,直接把整個 像素值拿來做處理,例如:24bits,就直接讀取24bit做處理。 16bits,就讀取16bits,不要分RGB來讀取。這樣能節省可觀 的程式複雜度。 2.)一般內插法是用相隣四點近似未知點,要處理每一列像素, 則先讀取相鄰兩列,也就是用scanline讀取前後兩列,以近似 未知列,不知道你有沒有這樣做?
系統時間:2024-05-04 9:23:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!