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

影像相減的時間問題?

尚未結案
arnotsay
一般會員


發表:23
回覆:79
積分:20
註冊:2003-02-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-04 21:53:59 IP:218.162.xxx.xxx 未訂閱
我將兩張影像的每一個像素做相減.. 兩張影像都是320X240....相減完成需要1秒鐘的時間.. 但是我學長用vc寫的...相減只要0.1秒.. 有人知道為什麼會差這麼多嗎??? 還是我計算時間的方法有問題? 我的電腦是duron 800...256 m ram
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-04 21:57:41 IP:140.135.xxx.xxx 未訂閱
arnotsay您好:       您可以嘗試使用scanline(一次掃描一列或一行) 代替    Canvas->Pixels(一次一個像素)來解決您的問題 順心 發表人 -
arnotsay
一般會員


發表:23
回覆:79
積分:20
註冊:2003-02-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-04 22:12:23 IP:218.162.xxx.xxx 未訂閱
引言: arnotsay您好: 您可以嘗試使用scanline(一次掃描一列或一行) 代替 Canvas->Pixels(一次一個像素)來解決您的問題 順心 發表人 - >< face="Verdana, Arial, Helvetica"> scanline 不是只能用來掃描像素嗎? 我是看c builder 中的example 的... 不知有沒有相關資料呢? 我的書都沒講scanline 的用法...
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-04 22:25:33 IP:140.135.xxx.xxx 未訂閱
arnotsay您好:       我想您是利用http://delphi.ktop.com.tw/topic.php?TOPIC_ID=26588的方式吧,用Canvas->Pixels也是掃描像素,但卻是一次一點像素 而Sacnline卻是一次一行(列)的像素,處理的時間一定會大大的降低的 您可以利用
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-05 00:02:35 IP:61.221.xxx.xxx 未訂閱
引言: 我將兩張影像的每一個像素做相減.. 兩張影像都是320X240....相減完成需要1秒鐘的時間.. 但是我學長用vc寫的...相減只要0.1秒.. 有人知道為什麼會差這麼多嗎??? 還是我計算時間的方法有問題? 我的電腦是duron 800...256 m ram
arnotsay 你好:
(1)你猜的沒有錯,真的會差這麼多,只要你使用 BCB 的方式來做的話,一定
   要花那麼多時間的(不是時間計算的問題)
(2)如果你的程式很注重 performance 的話,那就要用 Win32 的方式來做了,
   首先,先要了解 BITMAPFILEHEADER, BITMAPINFO, BITMAPINFOHEADER 這幾
   個 struct 的資料結構
(3)等到你了解 Bitmap file 的資料結構以後,你就可以直接使用 access 記
   憶體的方式,對兩個 bitmap 做相減的動作,根據我的經驗,保證可以快很
   多很多
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
arnotsay
一般會員


發表:23
回覆:79
積分:20
註冊:2003-02-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-05 04:22:02 IP:218.162.xxx.xxx 未訂閱
引言: arnotsay您好: 我想您是利用http://delphi.ktop.com.tw/topic.php?TOPIC_ID=26588的方式吧,用Canvas->Pixels也是掃描像素,但卻是一次一點像素 而Sacnline卻是一次一行(列)的像素,處理的時間一定會大大的降低的 您可以利用>< face="Verdana, Arial, Helvetica"> 我用scanline寫了相減的程式..不過結果有問題..你可以幫我看看嗎? 其中image1和image2是載入兩個8bit gray的圖 image3是要將結果show出來.... Graphics::TBitmap *OneBitmap=new Graphics::TBitmap; Graphics::TBitmap *TwoBitmap=new Graphics::TBitmap; Graphics::TBitmap *ThreeBitmap=new Graphics::TBitmap; int Width,Height; Byte *ptr1,*ptr2,*ptr3; OneBitmap= Image1->Picture->Bitmap; OneBitmap->PixelFormat=pf8bit; TwoBitmap= Image2->Picture->Bitmap; TwoBitmap->PixelFormat=pf8bit; ThreeBitmap= Image3->Picture->Bitmap; ThreeBitmap->PixelFormat=pf8bit; ThreeBitmap->Assign(OneBitmap); Width=OneBitmap->Width; Height=OneBitmap->Height; for(int y=0; yScanLine[y]; ptr2=(Byte*) TwoBitmap->ScanLine[y]; ptr3=(Byte*) ThreeBitmap->ScanLine[y]; for(int x=0; x
taishyang
站務副站長


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-05 14:45:31 IP:140.135.xxx.xxx 未訂閱
arnotsay您好:   重點是下面的Code,剩下的就交給您去修改囉 >>>>>
arnotsay
一般會員


發表:23
回覆:79
積分:20
註冊:2003-02-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-06 01:15:39 IP:218.162.xxx.xxx 未訂閱
引言: arnotsay您好: 重點是下面的Code,剩下的就交給您去修改囉 < face="Verdana, Arial, Helvetica"> 你好... 我修改後執行會出現 scan line index out of range...就當了 Graphics::TBitmap *pBitmap=new Graphics::TBitmap; Graphics::TBitmap *pBitmap1=new Graphics::TBitmap; Graphics::TBitmap *pBitmap2=new Graphics::TBitmap; int Width,Height,b1,g1,r1,b2,g2,r2,x,y,show1,show2,show3; Byte *ptr1,*ptr2,*ptr3; pBitmap= Image1->Picture->Bitmap; pBitmap1= Image2->Picture->Bitmap; for ( y = 0; y < pBitmap->Height; y ) { ptr1 = (Byte *)pBitmap->ScanLine[y]; ptr2 = (Byte *)pBitmap1->ScanLine[y]; ptr3 = (Byte *)pBitmap2->ScanLine[y]; for ( x = 0; x < pBitmap->Width; x ) { b1=ptr1[x*3]; g1=ptr1[x*3 1]; r1=ptr1[x*3 2]; b2=ptr2[x*3]; g2=ptr2[x*3 1]; r2=ptr2[x*3 2]; show1=(0.299*r1 0.587*g1 0.114*b1); show2=(0.299*r2 0.587*g2 0.114*b2); show3=abs(show1-show2); ptr3[x*3]=(Byte)show3; ptr3[x*3 1]=(Byte)show3; ptr3[x*3 2]=(Byte)show3; Image3->Canvas->Draw(0,0,pBitmap2); } }
taishyang
站務副站長


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-06 12:55:47 IP:140.135.xxx.xxx 未訂閱
arnotsay您好:    試試將Image3->Canvas->Draw(0,0,pBitmap2);    改成Image3->Picture->Assign(pBitmap1);    並去掉Graphics::TBitmap *pBitmap2=new Graphics::TBitmap;    再做一些修改即可 順心
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-06 14:19:13 IP:61.231.xxx.xxx 未訂閱
引言:
引言: arnotsay您好: 重點是下面的Code,剩下的就交給您去修改囉 < face="Verdana, Arial, Helvetica"> 你好... 我修改後執行會出現 scan line index out of range...就當了
使用 ScanLine 最最需要小心的就是 Bitmap 的 PixelFormat 了,因為它影響 Scanline 的真正的大小! index out of range 表示 scanline 沒有那麼大,而你卻要求那麼大。 建議你,將 scanline 的每一個值先 dump 出來看一下,你可以了解 scanline 的真正內容。當然,你要先準備一張色階或灰階已知的圖給它。最好可以改變一下螢幕的 color bits 數及 Bitmap 的 PixelFormat 看看有何不同,這樣您就可以完全操控 scanline 了。 在 taishyang 的 code 中並沒有指定 PixelFormat 而按其加入了 RGB 轉灰階,表示要處理的是彩色影像。如果您要處理的是256灰階影像,則應該像你自己貼上來的指定 pf8bit,則 scanline 的每一個值就是一個像素的值可以直接加減運算不必轉換。 以前我在處理時,對於灰階(影像處理作業大部分用灰階)影像會先給定一個 256 灰階的調色盤給 Bitmap 物件,再進行處理,會使得顯示 bitmap 圖較為正確喔。提供參考。 沒空更新的網頁... http://coolsite.to/dllee C及指標教學,計算機概論,資訊管理導論... http://home.kimo.com.tw/dllee.tw http://coolsite.to/ushells 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
taishyang
站務副站長


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-03-06 14:47:19 IP:140.135.xxx.xxx 未訂閱
dllee您好:       謝謝您詳盡的補充,讓我又學到了寶貴經驗 順心
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-03-06 15:19:58 IP:61.231.xxx.xxx 未訂閱
引言: dllee您好: 謝謝您詳盡的補充,讓我又學到了寶貴經驗 順心 < face="Verdana, Arial, Helvetica"> 交流交流... 以前我也不會用 scanline (例如在我網頁中的影像處理作業集處理 256x256 像素真的是不快因為用 pixels[][]),後來開始使用時,也發生過一堆問題,但我比較喜歡將 raw data log 出來看看,有時可以得到線上說明或是書上都不會提到的東西喔。 對了,還來不及恭喜您呢!版主! 沒空更新的網頁... http://coolsite.to/dllee C及指標教學,計算機概論,資訊管理導論... http://home.kimo.com.tw/dllee.tw http://coolsite.to/ushells 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
arnotsay
一般會員


發表:23
回覆:79
積分:20
註冊:2003-02-03

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-03-06 17:28:08 IP:61.218.xxx.xxx 未訂閱
引言: arnotsay您好: 試試將Image3->Canvas->Draw(0,0,pBitmap2); 改成Image3->Picture->Assign(pBitmap1); 並去掉Graphics::TBitmap *pBitmap2=new Graphics::TBitmap; 再做一些修改即可 順心 < face="Verdana, Arial, Helvetica"> 你好... 我只改這兩行來做測試....先不管結果對不對... 執行的時間scanline跟pixel 不分上下... 沒有比較快...請問是什麼地方出問題呢?
taishyang
站務副站長


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-03-06 17:41:07 IP:140.135.xxx.xxx 未訂閱
arnotsay您好:      請將Image3->Picture->Assign(pBitmap1);   放在迴圈的最外層試試 順心 發表人 -
arnotsay
一般會員


發表:23
回覆:79
積分:20
註冊:2003-02-03

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-03-06 19:58:19 IP:218.162.xxx.xxx 未訂閱
引言: arnotsay您好: 請將Image3->Picture->Assign(pBitmap1); 放在迴圈的最外層試試 順心 發表人 - >< face="Verdana, Arial, Helvetica"> taishyang....謝謝你提供寶貴的經驗給我... 這個問題...已經解決了...
系統時間:2024-03-29 18:57:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!