全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2569
推到 Plurk!
推到 Facebook!

有關這個bilinear 公式

答題得分者是:istillloving
tsuo7727
一般會員


發表:4
回覆:7
積分:2
註冊:2009-04-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-07-30 15:28:34 IP:140.130.xxx.xxx 訂閱

這篇文章http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=34733

裡面利用bilinear 進行縮放

我看了裡面的程式 我取局部出來~


[code cpp]
nclr1 = GetRValue(Bmp->Canvas->Pixels[ix][iy]);
nclr2 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy]);
nclr3 = GetRValue(Bmp->Canvas->Pixels[ix][iy 1]);
nclr4 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy 1]);
// Bilinear
clrR=(byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2
(1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4);
[/code]


裡面他的clrR 是針對相鄰四點的R值 去算 嗎?
相對的 G ,B 也是這樣?

再計算clrR 等號右邊怎麼會有一個 (byte)

什麼意思??

以前用過一陣子 BCB

但我現在自己想用C語言寫

我在我的程式裡面

照著公式 把點陣圖的點放進去

但在後面算clrR時我把 byte 拿掉

不知道是不是因為這個關係而執行時有錯誤





新手第一次發表問題...

有地方不對 請原諒~"~....
------
繼續轉動 那最初的夢
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-07-30 17:16:08 IP:163.28.xxx.xxx 訂閱
(byte)是強制轉換
double 的運算結果 轉換成 byte.
------
FPGA驗證, FPGA開發平台, http://smims.com
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-04 13:32:44 IP:140.127.xxx.xxx 訂閱
一般我們表示顏色強度是0~255

所以強制轉成byte的用意是這樣

===================引 用 tsuo7727 文 章===================

這篇文章http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=34733

裡面利用bilinear 進行縮放

我看了裡面的程式 我取局部出來~


[code cpp]
nclr1 = GetRValue(Bmp->Canvas->Pixels[ix][iy]);
nclr2 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy]);
nclr3 = GetRValue(Bmp->Canvas->Pixels[ix][iy 1]);
nclr4 = GetRValue(Bmp->Canvas->Pixels[ix 1][iy 1]);
// Bilinear
clrR=(byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2
(1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4);
[/code]


裡面他的clrR 是針對相鄰四點的R值 去算 嗎?
相對的 G ,B 也是這樣?

再計算clrR 等號右邊怎麼會有一個 (byte)

什麼意思??

以前用過一陣子 BCB

但我現在自己想用C語言寫

我在我的程式裡面

照著公式 把點陣圖的點放進去

但在後面算clrR時我把 byte 拿掉

不知道是不是因為這個關係而執行時有錯誤





新手第一次發表問題...

有地方不對 請原諒~"~....
------
恩...
tsuo7727
一般會員


發表:4
回覆:7
積分:2
註冊:2009-04-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-04 16:08:04 IP:140.130.xxx.xxx 訂閱
3Q ^^

那請問 我用單色點陣圖 (黑白的)

下去作縮放

出來的圖

只有在最下面一排 小小的一整列..

怎麼會這樣?


處理單色點陣圖 還需要另外做什麼動作嗎

因為用同樣一個公式

同樣的黑白檔 他的執行檔可以縮放 我的卻怪怪的
------
繼續轉動 那最初的夢
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-08-04 22:37:48 IP:218.169.xxx.xxx 訂閱
PO個程式碼吧
------
恩...
tsuo7727
一般會員


發表:4
回覆:7
積分:2
註冊:2009-04-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-08-05 11:49:30 IP:140.130.xxx.xxx 訂閱


變成這樣的圖= =

bilinear 程式碼在這


[code cpp]
dX = (double)xsize/(double)newW;
dY = (double)ysize/(double)newH;

for(j = 0 ; j< newH ; j ){
for(i =0 ; i < newW ; i )
{
x = dX*(double)i;
y = dY*(double)j;

ix = (int)x;
iy = (int)y;

fx = x - (double)ix;
fy = y - (double)iy;

nclr1= tar1 [3*(iy*xsize ix) 2];
nclr2= tar1 [3*(iy*xsize ix 1) 2];
nclr3= tar1 [3*(iy 1*xsize ix) 2];
nclr4= tar1 [3*(iy 1*xsize ix 1) 2];
clrR= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2
(1.0-fx)* (fy)*(double)nclr3 (fx)*(fy)*(double)nclr4);

nclr1= tar1 [3*(iy*xsize ix) 1];
nclr2= tar1 [3*(iy*xsize ix 1) 1];
nclr3= tar1 [3*(iy 1*xsize ix) 1];
nclr4= tar1 [3*(iy 1*xsize ix 1) 1];
clrG= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2
(1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4);

nclr1= tar1 [3*(iy*xsize ix) 0];
nclr2= tar1 [3*(iy*xsize ix 1) 0];
nclr3= tar1 [3*(iy 1*xsize ix) 0];
nclr4= tar1 [3*(iy 1*xsize ix 1) 0];

clrB= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2
(1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4);


*(tar 3 * (newW * j i) 2) = clrR;
*(tar 3 * (newW * j i) 1) = clrG;
*(tar 3 * (newW * j i) 0) = clrB;




}

}
[/code]



還有個地方有問題

我如果用512 512 的圖下去

放大到1024 就會程式出錯

到1000 程式沒出錯 但會像上面那個圖 都會有一些斜線

到縮小 256 256

128 128 都正常

但是如果縮小像 200 200 其他這種數字

也一樣會跑出斜線

是程式哪邊出了什麼問題嗎??
------
繼續轉動 那最初的夢
編輯記錄
tsuo7727 重新編輯於 2009-08-05 11:49:54, 註解 無‧
tsuo7727 重新編輯於 2009-08-05 11:56:26, 註解 無‧
tsuo7727 重新編輯於 2009-08-05 14:36:59, 註解 無‧
tsuo7727 重新編輯於 2009-08-05 14:41:52, 註解 無‧
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-08-05 16:54:01 IP:140.127.xxx.xxx 訂閱
您好:

我沒有試你的公式
但是我猜


[code cpp]
nclr1= tar1 [3*(iy*xsize ix) 2];
nclr2= tar1 [3*(iy*xsize ix 1) 2];
nclr3= tar1 [3*(iy 1*xsize ix) 2];
nclr4= tar1 [3*(iy 1*xsize ix 1) 2];

[/code]

你必須要了解這種寫法


[code cpp]

buff1[i][j]=buff2[i w*j]

buff1[i 1][j]=buff2[i 1 w*j]

buff1[i][j 1]=buff2[i w*(j 1)]

[/code]

這是一維陣列和二維的用法

跟你的程式有些微的不同 看的出在哪嘛






===================引 用 tsuo7727 文 章===================


變成這樣的圖= =

bilinear 程式碼在這


[code cpp]
dX = (double)xsize/(double)newW;
dY = (double)ysize/(double)newH;

for(j = 0 ; j< newH ; j ){
for(i =0 ; i < newW ; i )
{
x = dX*(double)i;
y = dY*(double)j;

ix = (int)x;
iy = (int)y;

fx = x - (double)ix;
fy = y - (double)iy;

nclr1= tar1 [3*(iy*xsize ix) 2];
nclr2= tar1 [3*(iy*xsize ix 1) 2];
nclr3= tar1 [3*(iy 1*xsize ix) 2];
nclr4= tar1 [3*(iy 1*xsize ix 1) 2];
clrR= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2
(1.0-fx)* (fy)*(double)nclr3 (fx)*(fy)*(double)nclr4);

nclr1= tar1 [3*(iy*xsize ix) 1];
nclr2= tar1 [3*(iy*xsize ix 1) 1];
nclr3= tar1 [3*(iy 1*xsize ix) 1];
nclr4= tar1 [3*(iy 1*xsize ix 1) 1];
clrG= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2
(1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4);

nclr1= tar1 [3*(iy*xsize ix) 0];
nclr2= tar1 [3*(iy*xsize ix 1) 0];
nclr3= tar1 [3*(iy 1*xsize ix) 0];
nclr4= tar1 [3*(iy 1*xsize ix 1) 0];

clrB= (byte)((1.0-fx)*(1.0-fy)*(double)nclr1 (fx)*(1.0-fy)*(double)nclr2
(1.0-fx)* (fy)*(double)nclr3 (fx)* (fy)*(double)nclr4);


*(tar 3 * (newW * j i) 2) = clrR;
*(tar 3 * (newW * j i) 1) = clrG;
*(tar 3 * (newW * j i) 0) = clrB;




}

}
[/code]



還有個地方有問題

我如果用512 512 的圖下去

放大到1024 就會程式出錯

到1000 程式沒出錯 但會像上面那個圖 都會有一些斜線

到縮小 256 256

128 128 都正常

但是如果縮小像 200 200 其他這種數字

也一樣會跑出斜線

是程式哪邊出了什麼問題嗎??
------
恩...
編輯記錄
istillloving 重新編輯於 2009-08-05 16:55:47, 註解 無‧
tsuo7727
一般會員


發表:4
回覆:7
積分:2
註冊:2009-04-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-08-06 12:15:12 IP:140.130.xxx.xxx 訂閱

===================引 用 istillloving 文 章===================
您好:

我沒有試你的公式
但是我猜


[code cpp]
nclr1= tar1 [3*(iy*xsize ix) 2];
nclr2= tar1 [3*(iy*xsize ix 1) 2];
nclr3= tar1 [3*(iy 1*xsize ix) 2];
nclr4= tar1 [3*(iy 1*xsize ix 1) 2];

[/code]

你必須要了解這種寫法


[code cpp]

buff1[i][j]=buff2[i w*j]

buff1[i 1][j]=buff2[i 1 w*j]

buff1[i][j 1]=buff2[i w*(j 1)]

[/code]

這是一維陣列和二維的用法

跟你的程式有些微的不同 看的出在哪嘛


---------------------------------------------------------

我剛把我的單色點陣圖 把她轉成24位元之後 就正常了

只是縮放時的尺寸不能像我參考的程式 可以任意輸入而不會有斜線的效果

有點不太懂.. BUFF2 裡的東西

是否可麻煩稍微說明一下..


感激...



------
繼續轉動 那最初的夢
編輯記錄
tsuo7727 重新編輯於 2009-08-06 12:44:53, 註解 無‧
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-08-06 22:52:10 IP:218.169.xxx.xxx 訂閱
tar1 [3*(iy 1*xsize ix) 0];


裡面
iy 1*xsize ix

(iy 1)*xsize ix

數學運算 先乘除後加減

假設影像大小是 3*3

那照你的設定來看的話
int xsize = 3;
int ysize = 3;


一維陣列就是 new 出一條連續的記憶體( 講連續比較好理解 在實體記憶體可能是很多分段串起來的)

那二維陣列用矩陣來描述他是比較清楚的( 在實體也是串起來的 )

那這兩個只是用法有點不一樣而已

假設 array1是二維 array2是一維 那我們要把3*3的
影像存到這兩種陣列內

最基本的大小就是要3*3=9

宣告是這樣宣告的

double array1[xsize][ysize];

double *
array2;
array2 = new double[xsize*ysize];


宣告完之後就是把影像存入陣列



[code cpp]
for(j=0;j{
for(i=0;i {
array1[ i ][ j ]=
Image[ i ][ j ];
array2[i xsize*j]=
Image[ i ][ j ];
}
}
[/code]


這個for迴圈只有 3*3 的大小而已 用筆和紙給他run一次看看

你就能夠體會

i xsize*(1 j)
i xsize*1 j

這兩個不一樣在哪了


參考
------
恩...
編輯記錄
istillloving 重新編輯於 2009-08-06 22:54:06, 註解 無‧
istillloving 重新編輯於 2009-08-06 22:54:43, 註解 無‧
istillloving 重新編輯於 2009-08-06 22:55:22, 註解 無‧
istillloving 重新編輯於 2009-08-06 22:57:45, 註解 無‧
istillloving 重新編輯於 2009-08-06 22:58:34, 註解 無‧
tsuo7727
一般會員


發表:4
回覆:7
積分:2
註冊:2009-04-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-08-10 19:40:16 IP:140.130.xxx.xxx 訂閱
謝謝你的意見

我把那些小部份改掉之後

縮小大致上都沒什麼問題了

圖的斜線也都消失了

但是放大超過兩倍 就會發生執行錯誤...

有點搞不懂它一旦超過兩倍就錯誤的狀況
------
繼續轉動 那最初的夢
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-08-11 10:19:53 IP:220.129.xxx.xxx 訂閱
您好:

關於這種問題 大部分應該是你寫爆了記憶體 或者是 讀取不該讀取的記憶體位置

建議在做影像處理的時候

不管是在 "取質" 或者是在 "填入質" 加上一段判斷試 避免讀取或者是寫入 不正確的記憶體位置


===================引 用 tsuo7727 文 章===================
謝謝你的意見

我把那些小部份改掉之後

縮小大致上都沒什麼問題了

圖的斜線也都消失了

但是放大超過兩倍 就會發生執行錯誤...

有點搞不懂它一旦超過兩倍就錯誤的狀況
------
恩...
tsuo7727
一般會員


發表:4
回覆:7
積分:2
註冊:2009-04-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-08-11 11:10:08 IP:140.130.xxx.xxx 訂閱
恩 我剛找到問題 修改過後 

ok了 非常感激你 ^^"

-----

最近又用了一下自己的程式


發現放大的與縮小的 一小部分問題,其他還是可以正常縮放


不知道為什麼 放大或縮小成"某些範圍"

他寫出的圖檔會變成這樣

不知道從這邊可不可以看出 問題是在哪邊?

------
繼續轉動 那最初的夢
編輯記錄
tsuo7727 重新編輯於 2009-09-08 18:50:12, 註解 無‧
tsuo7727 重新編輯於 2009-11-29 18:07:38, 註解 無‧
tsuo7727 重新編輯於 2009-11-29 18:10:47, 註解 無‧
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-10-25 12:40:52 IP:140.127.xxx.xxx 訂閱
看不到附件呢
------
恩...
系統時間:2017-10-22 20:08:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!