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

兩差異影像相減後該如果再放到image上

尚未結案
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-07 11:49:05 IP:218.175.xxx.xxx 未訂閱
我搜尋一些板上的文章看到有位大大有發表兩差異影像的問題 它是用以下的code而我是想要把它改成差異度很小的pixel就保留差異度大的pixel就將它的灰階值設成0可是我不曉得再計算完差異後該怎麼再將它放回image上顯示~希望各位大大教教我~ Graphics::TBitmap* BMP1 =new Graphics::TBitmap();  Graphics::TBitmap* BMP2 =new Graphics::TBitmap();  BMP1->PixelFormat=pf8bit;  BMP2->PixelFormat=pf8bit;  Byte *ptr1, *ptr2 = NULL;  int temp=0;  BMP1->Assign(Image1->Picture->Bitmap);  BMP2->Assign(Image2->Picture->Bitmap);  for (int y=0; yHeight; y ) { ptr1=(Byte*)BMP1->ScanLine[y]; ptr2=(Byte*)BMP2->ScanLine[y]; for (int x=0; xWidth; x ) { int d=abs((int)ptr1[x]-(int)ptr2[x]); //int temp1=d*d; //temp=temp temp1; } } //Label1->Caption=temp;
m58610
初階會員


發表:22
回覆:83
積分:36
註冊:2003-09-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-07 23:37:05 IP:203.70.xxx.xxx 未訂閱
只要加一個判斷式就可以了ㄚ int d=abs((int)ptr1[x]-(int)ptr2[x]); if(d>T) d=0;
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-08 11:30:30 IP:218.175.xxx.xxx 未訂閱
m58610你好~ 這樣判斷完~然後我該怎麼將它放到image上顯示呢 因為它是先轉成int再去計算的~那我該如何再把它變成影像放到image上呢 這個地方我搞不懂希望大大你的幫我
m58610
初階會員


發表:22
回覆:83
積分:36
註冊:2003-09-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-08 11:47:38 IP:211.74.xxx.xxx 未訂閱
上面你po的程式碼你都懂了嗎?? 如果懂了應該不難    將處理後的d放入Image1 只要在後面加上 ptr1[x]=d;    放入Image2 ptr2[x]=d;    放入新的Image3
Graphics::TBitmap* BMP1 =new Graphics::TBitmap();
Graphics::TBitmap* BMP2 =new Graphics::TBitmap();
BMP1->PixelFormat=pf8bit;
BMP2->PixelFormat=pf8bit;
Byte *ptr1, *ptr2 = NULL;
int temp=0;
BMP1->Assign(Image1->Picture->Bitmap);
BMP2->Assign(Image2->Picture->Bitmap);
 
Graphics::TBitmap* BMP3 =new Graphics::TBitmap();
BMP3->PixelFormat=pf8bit;
Byte *ptr3;
BMP3->Assign(Image3->Picture->Bitmap);    for (int y=0; yHeight; y  )
{
ptr1=(Byte*)BMP1->ScanLine[y];
ptr2=(Byte*)BMP2->ScanLine[y];
ptr3=(Byte*)BMP3->ScanLine[y];
for (int x=0; xWidth; x  )
{
int d=abs((int)ptr1[x]-(int)ptr2[x]);    if(d>50) d=0;
ptr3[x]=d;    }
} 
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-08 19:57:57 IP:218.175.xxx.xxx 未訂閱
m58610你好~ 謝謝你ㄛ~我大概懂意思了吧~ 但是我這樣做了以後image3並沒有顯示出做完差異影像後的圖ㄟ 都沒變化~就停在那邊~為什麼呢
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-08 20:43:59 IP:218.175.xxx.xxx 未訂閱
m58610你好~ 我自己改一改後能放到image3上顯示了可是發現怎麼差異比較好像只做了一部分呢只做了紅色圈選起來的部分~可是我找不到那裡有錯誤希望你能幫忙~以下是我改過的code以及執行的畫面  Graphics::TBitmap* BMP1;  Graphics::TBitmap* BMP2;  Graphics::TBitmap* BMP3;  Byte *ptr1, *ptr2,*ptr3 = NULL;  BMP1=Image1->Picture->Bitmap;  BMP2=Image2->Picture->Bitmap;  BMP3=Image3->Picture->Bitmap;  for (int y=0; yHeight; y++) { ptr1=(Byte*)BMP1->ScanLine[y]; ptr2=(Byte*)BMP2->ScanLine[y]; ptr3=(Byte*)BMP3->ScanLine[y]; for (int x=0; xWidth; x++) { int d=abs((int)ptr1[x]-(int)ptr2[x]); if(d>50) { ptr3[x]=0; } else { ptr3[x]=ptr2[x]; } } } BMP3->Assign(BMP3);
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-09 22:17:30 IP:220.133.xxx.xxx 未訂閱
我現在將code改成這樣可是還是都只做了前面三分之一的處裡~後面都沒做不知為什麼~請各位大大幫我看一下還有那裡有問題嗎 Graphics::TBitmap* BMP1;  Graphics::TBitmap* BMP2;  Graphics::TBitmap* BMP3;  Byte *ptr1, *ptr2,*ptr3 = NULL;  BMP1=Image1->Picture->Bitmap;  BMP2=Image2->Picture->Bitmap;  BMP3=Image3->Picture->Bitmap;  for (int y=0; yHeight; y ) { ptr1=(Byte*)BMP1->ScanLine[y]; ptr2=(Byte*)BMP2->ScanLine[y]; ptr3=(Byte*)BMP3->ScanLine[y]; for (int x=0; xWidth; x ) { int d=abs((int)ptr1[x]-(int)ptr2[x]); if(d>50) { ptr3[x 2]=0; ptr3[x 1]=0; ptr3[x]=0; } else { ptr3[x 2]=ptr2[x]; ptr3[x 1]=ptr2[x]; ptr3[x]=ptr2[x]; } } } BMP3->Assign(BMP3);
m58610
初階會員


發表:22
回覆:83
積分:36
註冊:2003-09-07

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-10 03:29:12 IP:61.230.xxx.xxx 未訂閱
你的灰階圖是24bit還是8bit?? BMP2->PixelFormat=pf8bit; 這個意思是把圖片設定成8bit 我一般都用24bit BMP2->PixelFormat=pf24bit; 這時用scanline的x座標會變三倍 詳細情形請爬一下文 你可以看我回文的紀錄 我有一個回文有一個示意圖    關於程式你改成下面試看看  
Graphics::TBitmap* BMP1;
Graphics::TBitmap* BMP2;
Graphics::TBitmap* BMP3;
Byte *ptr1, *ptr2,*ptr3 = NULL;
BMP1=Image1->Picture->Bitmap;
BMP2=Image2->Picture->Bitmap;
BMP3=Image3->Picture->Bitmap;
for (int y=0; yHeight; y  )
{
ptr1=(Byte*)BMP1->ScanLine[y];
ptr2=(Byte*)BMP2->ScanLine[y];
ptr3=(Byte*)BMP3->ScanLine[y];
for (int x=0; xWidth; x  )
{

int d=abs((int)ptr1[x*3]-(int)ptr2[x*3]);
if(d>50)
{
ptr3[x*3 2]=0;
ptr3[x*3 1]=0;
ptr3[x*3]=0;
}
else
{
ptr3[x*3 2]=ptr2[x*3];
ptr3[x*3 1]=ptr2[x*3];
ptr3[x*3]=ptr2[x*3];    }
}
}
BMP3->Assign(BMP3); 
發表人 - m58610 於 2005/02/10 03:34:35
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-02-10 11:21:23 IP:218.175.xxx.xxx 未訂閱
嗯嗯~這樣真的就好了~好的~我會再去看看其它的文章~可是我想再請問一下ㄛ 就是我現在想改成沒灰階化的圖~直接用24bit的圖來相減~所以我把code改成這樣但是發現怎麼整個圖都糊掉了呢~想請你幫我看看 Graphics::TBitmap* BMP1;  Graphics::TBitmap* BMP2;  Graphics::TBitmap* BMP3;  Byte *ptr1, *ptr2,*ptr3 = NULL;  BMP1=Image1->Picture->Bitmap;  BMP2=Image2->Picture->Bitmap;  BMP3=Image3->Picture->Bitmap;  for (int y=0;yHeight;y ) { ptr1=(Byte*)BMP1->ScanLine[y]; ptr2=(Byte*)BMP2->ScanLine[y]; ptr3=(Byte*)BMP3->ScanLine[y]; for (int x=0;xWidth;x ) { int dr=abs((int)ptr1[3*x]-(int)ptr2[3*x]); int dg=abs((int)ptr1[3*x 1]-(int)ptr2[3*x 1]); int db=abs((int)ptr1[3*x 2]-(int)ptr2[3*x 2]); int d=dr dg db; if(d>256) { ptr3[3*x]=0; ptr3[3*x 1]=0; ptr3[3*x 2]=0; } else { ptr3[3*x]=ptr2[3*x]; ptr3[3*x 1]=ptr2[3*x 1]; ptr3[3*x 2]=ptr2[3*x 2]; } } } BMP3->Assign(BMP3);
m58610
初階會員


發表:22
回覆:83
積分:36
註冊:2003-09-07

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-02-10 14:22:19 IP:203.70.xxx.xxx 未訂閱
用dr dg db不知道適不適當 如果這樣效果不好 你可以用灰階化後的數字來判斷要不要合併 但還是留下彩色的rgb值放到image3上 ps1.糊掉的意思比較不能了解,看你能不能放上圖給大家參考看看 ps2.提醒一下ptr[x*3]是B,ptr[x*3 1]是G,ptr[x*3 2]是R 發表人 - m58610 於 2005/02/10 14:25:28
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-02-10 16:17:03 IP:218.175.xxx.xxx 未訂閱
執行完後變成這樣~而且感覺好像顏色都不見了
m58610
初階會員


發表:22
回覆:83
積分:36
註冊:2003-09-07

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-02-10 19:43:17 IP:203.70.xxx.xxx 未訂閱
感覺是不是Image3變成8bit的圖 加看看下面這一行 BMP3->PixelFormat=pf24bit; 看你的程式應該沒問題 用一樣的程式跑24bit的灰階圖正常嗎??
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-02-10 23:34:55 IP:218.175.xxx.xxx 未訂閱
m58610你好~ 嗯~~~加了這一行就好了~想再請問你一下ㄛ~ 你覺得差異度的門檻值大概要設多少會比較好呢~ 還有你之前說dr dg db這樣好像不太好~做完效果好像真的有點不太好~ 可是不太懂你所說要如何改的意思~能請你再清楚一點告訴我要如何改呢
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-02-10 23:36:33 IP:218.175.xxx.xxx 未訂閱
用dr dg db這樣做起來有些差異的地方還是沒被設成0
m58610
初階會員


發表:22
回覆:83
積分:36
註冊:2003-09-07

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-02-11 00:40:14 IP:203.70.xxx.xxx 未訂閱
關於d方面的最佳門檻可能要用try出一個最佳值 要看背景的明暗變化會不會太大來決定 關於我說用灰階後的值來表示  
 
int gray1=ptr1[x*3 2]*0.299 ptr1[x*3 1]*0.587 ptr1[x*3]*0.114;
int gray2=ptr2[x*3 2]*0.299 ptr2[x*3 1]*0.587 ptr2[x*3]*0.114;
int d=abs(gray1-gray2);
if(d>50)
{
ptr3[x*3 2]=0;
ptr3[x*3 1]=0;
ptr3[x*3]=0;
}
else
{
ptr3[x*3 2]=ptr2[x*3 2];
ptr3[x*3 1]=ptr2[x*3 1];
ptr3[x*3]=ptr2[x*3];    
系統時間:2024-05-17 11:35:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!