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

影像處裡問題

尚未結案
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-03 00:12:35 IP:163.28.xxx.xxx 未訂閱
想請問各位高手一個問題, 我的程式裡面有4個button button1~button3是執行開image1~image3且有進行處裡動作3個圖 現在我想要用button4去呼叫原本還沒進行處裡的image1~image3的原始影像圖來進行比較的動作....可是我開出來的是已經經過處裡後的image1~image3的圖> < 希望各位高手能替我解開這一個迷惑....成是要怎麼協才能去開原始圖檔來進行比較?
RedSnow
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-03 00:47:15 IP:61.230.xxx.xxx 未訂閱
akino0910 妳好:    沒看到妳的程式碼,無法得知問題出在那裡?如果妳的程式碼不長的話,請將它貼上來,張貼程式碼時請注意程式碼的縮排整理,並參考下列連結頁面內的說明來張貼妳的程式碼,以便於瀏覽: 【公告】程式碼張貼規則與方法 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57538 【公告】重申版規與作業問題說明 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=58991 如果妳的程式碼很長,那麼就將檔案打包上傳到 "會員求助程式檔案上傳區" 好了: 會員求助程式檔案上傳區 7 天天敲鍵盤 v 時時按滑鼠 8
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-04 00:01:05 IP:163.28.xxx.xxx 未訂閱
我的Button1~Button3的程式是ㄧ樣的,如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
{
Image1->AutoSize=true;
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
Byte *ptr1,*down_ptr1;
int sum,Width,Height;
Graphics::TBitmap *TheBitmap, *TempBitmap,*TempBitmap_A;
TheBitmap=Image1->Picture->Bitmap;
TheBitmap->PixelFormat=pf8bit;
TempBitmap=new Graphics::TBitmap();
TempBitmap_A=new Graphics::TBitmap();
TempBitmap->Assign(TheBitmap);
TempBitmap_A->Assign(TheBitmap);
for (int y=0;yHeight-1;y  )
 {
  ptr1=(Byte*)TempBitmap->ScanLine[y];
  down_ptr1=(Byte*)TempBitmap->ScanLine[y 1];
 for (int x=0;xWidth-1;x  )
 { int Delta_X  ,Delta_Y;     Delta_X= ptr1[x]-ptr1[x 1];     Delta_Y= ptr1[x]- down_ptr1[x];     sum=abs(Delta_X) abs(Delta_Y);      ptr1[x]=sum;
  }
 }
TheBitmap->Assign(TempBitmap);
delete TempBitmap;
}
Button2跟3相同.... 開出來的image1~image3都是處裡過後的圖 可是我想要呼叫原本未處裡過的imagey在button4做相加的動作 怎麼呼叫回原始圖來在button 4下執行? 這是我的問題
RedSnow
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-04 00:25:22 IP:61.217.xxx.xxx 未訂閱
akino0910 妳好:    妳現在是按下 Button4 未能達到預期的結果,那麼妳應該要將按下 Button4 之後處理過程的程式碼貼上來啊,否則別人怎麼知道妳的程式問題出在那裡?      7 天天敲鍵盤 v 時時按滑鼠 8
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-04 15:42:57 IP:163.28.xxx.xxx 未訂閱
現在我的button4是做處裡過後的圖的相加@@ 可是我想要做處理前的資料相加 ㄟ.... 我也不知道我這樣說各位高手懂不懂... 我現在要做的是三張圖片同ㄧ個景象有三個不ㄧ樣的景深位置...我button1~button3是做變異數的處理...接著想要在button4顯現出依張新的圖片,而這張圖片能夠讓每一個地方的景深都是清晰的....(當然中間還有些過程要處理..目前我還在寫 > <) 對不起...我最近才開始碰BCB,如果我問的問題不清楚請大家多多見諒 < class="code"> Graphics::TBitmap *bmp1 = new Graphics::TBitmap(); Graphics::TBitmap *bmp2 = new Graphics::TBitmap(); Graphics::TBitmap *bmp3 = new Graphics::TBitmap(); Graphics::TBitmap *bmp4 = new Graphics::TBitmap(); Byte *ptr1=NULL,*ptr2=NULL,*ptr3=NULL,*ptr4=NULL; bmp1->Assign(Image1->Picture->Bitmap); bmp2->Assign(Image2->Picture->Bitmap); bmp3->Assign(Image3->Picture->Bitmap); bmp1->PixelFormat=pf24bit; bmp2->PixelFormat=pf24bit; bmp3->PixelFormat=pf24bit; bmp4->PixelFormat=pf24bit; bmp4->Width = bmp1->Width; bmp4->Height = bmp1->Height; for(int i=0;iHeight;i ){ ptr1 = (Byte *)bmp1->ScanLine[i]; ptr2 = (Byte *)bmp2->ScanLine[i]; ptr3 = (Byte *)bmp3->ScanLine[i]; ptr4 = (Byte *)bmp4->ScanLine[i]; for(int j=0;jWidth*3;j ) { int r1,g1,b1,r2,g2,b2,r3,g3,b3,r4,g4,b4; r1=(int)ptr1[j]; r2=(int)ptr2[j]; r3=(int)ptr3[j]; if(r1>r2&&r1>r3) {r4=1*50;} if(r2>r1&&r2>r3) {r4=2*50;} if(r3>r2&&r3>r1) {r4=3*50;} ptr4[j]=(Byte)r4 ; } } Image4->AutoSize=true; Image4->Picture->Assign(bmp4); }
RedSnow
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-04 17:43:36 IP:59.115.xxx.xxx 未訂閱
akino0910 妳好:    我仍然不是很確定妳的問題,目前我的理解是妳的前三個按鈕會各別載入三張圖,這三張圖各有些許差異,載入後會做一些處理,而這些處理步驟是完全相同的,第四個按鈕則是希望載入前三張圖的原圖,但是目前直接取用 Image1, Image2, Image3 的 Bitmap 卻是已經處理過的內容,妳希望能載入Image1~Image3 的原圖來做處理,然後將結果放到 Image4 上面。 如果我上述的理解是正確的,那麼妳可以先設三個全域性的 AnsiString 變數,例如:AnsiString File1, File2, File3;,在前三個按鈕的 OnClick 事件中,將 OpenPictureDialog 所取得的 FileName 值分別設給對應的那三個 AnsiString 變數,例如:File1 = OpenPictureDialog1->FileName;(File2, File3 比照辦理),然後在第四個按鈕的 OnClick 事件中,將 bmp1->Assign(Image1->Picture->Bitmap); 的敘述改成 bmp1->LoadFromFile(File1); (bmp2, bmp3 比照辦理),這樣子就可以達到載入原圖的目的了。 如果我仍然沒能抓到妳的問題重點,那麼請妳試看看能不能用圖解的方式來做個輔助說明? 7 天天敲鍵盤 v 時時按滑鼠 8
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-06 22:19:51 IP:163.28.xxx.xxx 未訂閱
謝謝版主的回覆...就是你說的那樣^^... 我可以再麻煩請你看一下我的button1及button4嗎? 我被8bit跟24bit的關係搞迷糊了 我有幾個小問題 第一個: 如果button1那邊我改成24bit是要加RGB的pixel值的宣告但是Width不用*3是嗎??(我看大家的討論好像都是這樣寫程式的) 可是我開灰階的圖他為何還是可以跑彩色的處裡結果出來? 第二個: 我button4那邊...如果照原程式去跑,我原本開8bit的三個圖要相加處裡過程到image4如果我設定所有image都是8bit,Width也沒有*3這樣去跑出來的結果為何是彩色的?反而我現在的方式寫跑出來才是黑白的? 我看了很久版上的文章...發現大家去處裡彩色圖都是用RGB的pixel值去跑圖..可是我這樣用卻都行不通> <...請神通廣大的版主或其他觀念很好的各位高手能幫我解答這一個問題? 感恩^^
RedSnow
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-06 23:33:16 IP:61.230.xxx.xxx 未訂閱
akino0910 妳好:
引言:第一個: 如果button1那邊我改成24bit是要加RGB的pixel值的宣告但是Width不用*3是嗎??(我看大家的討論好像都是這樣寫程式的) 可是我開灰階的圖他為何還是可以跑彩色的處裡結果出來?
如果妳在 Scanline 那邊設定接收資料類型為單 byte 的話,妳還是要將後續迴圈裡的寬度乘以 3,這樣子才能處理到每個點的三個顏色值,但如果妳在 Scanline 那邊設定接收的是 3 個 byte 的結構資料 (RGBTRIPLE),那麼後續迴圈裡的寬度值就無需乘以 3 了,要瞭解上述的概念可以參考一下這幾篇: 如何把Image控制項中點陣圖的所有的黑色換成紅色? http://delphi.ktop.com.tw/topic.php?topic_id=75505 請問用pixel[i][j]的值取rgb http://delphi.ktop.com.tw/topic.php?topic_id=76767 圖檔轉換的問題 http://delphi.ktop.com.tw/topic.php?topic_id=76982 另外妳所提到的 "灰階" 圖其實也是 "彩色圖",只不過是將每個圖素的三原色都設為相同值而已,因此看起來像是 "由黑與白之間的中間色所組成" 而已,妳大概是對 "灰階圖" 有所誤區吧。
引言:第二個: 我button4那邊...如果照原程式去跑,我原本開8bit的三個圖要相加處裡過程到image4如果我設定所有image都是8bit,Width也沒有*3這樣去跑出來的結果為何是彩色的?反而我現在的方式寫跑出來才是黑白的?
8bit 的圖本來就是彩色的啊,我並不清楚妳實際的運作狀況與使用的圖檔內容,也不知道妳到底要處理出來的效果或是結果是怎樣的?如果該要用 8bit 處理的就用 8bit、該用 24bit 的就用 24bit,如果妳是要將三張 8bit 的圖加以處理,然後存成一張 24bit 的圖,那就混合處理便是,例如:
    Graphics::TBitmap *bmp1 = new Graphics::TBitmap();
    Graphics::TBitmap *bmp2 = new Graphics::TBitmap();
    Graphics::TBitmap *bmp3 = new Graphics::TBitmap();
    Graphics::TBitmap *bmp4 = new Graphics::TBitmap();
    Byte *ptr1 = NULL, *ptr2 = NULL, *ptr3 = NULL;
    TRGBTriple *ptr4;        bmp1->LoadFromFile(File1);
    bmp2->LoadFromFile(File2);
    bmp3->LoadFromFile(File3);
    bmp1->PixelFormat = pf8bit;
    bmp2->PixelFormat = pf8bit;
    bmp3->PixelFormat = pf8bit;
    bmp4->PixelFormat = pf24bit;
    bmp4->Width  = bmp1->Width;
    bmp4->Height = bmp1->Height;        int r1,g1,b1,r2,g2,b2,r3,g3,b3,r4,g4,b4;
    for (int i=0; iHeight; i  ) {
        ptr1 = (Byte *)bmp1->ScanLine[i];
        ptr2 = (Byte *)bmp2->ScanLine[i];
        ptr3 = (Byte *)bmp3->ScanLine[i];
        ptr4 = (TRGBTriple *)bmp4->ScanLine[i];
        for (int j=0; jWidth; j  ) {
            r1 = (Byte)ptr1[j];
            r2 = (Byte)ptr2[j];
            r3 = (Byte)ptr3[j];
            if(r1>r2 && r1>r3) {
                r4 = 1*50;
            }
            if(r2>r1 && r2>r3) {
                   r4 = 2*50;
            }
            if(r3>r2 && r3>r1){
                r4 = 3*50;
            }
            ptr4[j].rgbtRed   = (Byte)r4;
            ptr4[j].rgbtGreen = (Byte)r4;
            ptr4[j].rgbtBlue  = (Byte)r4;
        }
    }
    Image4->AutoSize = true;
    Image4->Picture->Assign(bmp4);
請注意!上述的程式碼是修改妳的程式,來作 8bit 與 24bit 圖的混合設定與處理的範例,因為我並不知道妳真正要處理的結果是什麼?因此上述程式碼對處理結果不具示範作用 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/10/06 23:35:53
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-10-10 23:03:05 IP:220.138.xxx.xxx 未訂閱
多謝版主的鼎力相助^^ 我學到很多.... 往後有問題還請您多多指教
系統時間:2024-04-28 1:11:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!