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

我寫了一個圖片相減的程式,可是結果好像只是變灰階?

尚未結案
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-11 12:00:13 IP:140.124.xxx.xxx 未訂閱
  Graphics::TBitmap *Bmp1 = new Graphics::TBitmap();
    Graphics::TBitmap *Bmp2 = new Graphics::TBitmap();
    Byte *ptr1;
    Byte *ptr2;
    int b1,g1,r1,b2,g2,r2;
    int gray1,gray2,gray3;        Bmp1->Assign(Image1->Picture->Bitmap);
    Bmp2->Assign(Image2->Picture->Bitmap);        for(int i=0;iHeight;i++)
    {
      ptr1=(Byte *)Bmp1->ScanLine[i];
      ptr2=(Byte *)Bmp2->ScanLine[i];          for(int j=0;jWidth;j++)
      {
        b1=ptr1[j*3];
        g1=ptr1[j*3+1];
        r1=ptr1[j*3+2];
        gray1=0.299*r1+0.587*g1+0.114*b1;//得到Image1的灰度值            b2=ptr2[j*3];
        g2=ptr2[j*3+1];
        r2=ptr2[j*3+2];
        gray2=0.299*r2+0.587*g2+0.114*b2;//得到Image2的灰度值            gray3=abs(gray1-gray2); //灰度值相減            //===回代===
        ptr2[j*3]  =(Byte)gray3;
        ptr2[j*3+1]=(Byte)gray3;
        ptr2[j*3+2]=(Byte)gray3;
        //==========
      }
    }
    Image3->Picture->Assign(Bmp2);
我用上面的程式後,圖片好像只是變灰階,是我有寫錯,還是寫的不好? 上面是我用的圖片,要將兩個相減。 想要只留下桿子,還是有其它的法子~~感謝各位哦~~ 發表人 - 黑輪 於 2004/02/11 15:07:17
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-11 13:40:02 IP:140.135.xxx.xxx 未訂閱
黑輪您好: 因為您程式最後給的就是灰階值,所以變灰階是正常的... P.S:能否把您上傳的圖片縮小些,很佔資源說    順心  <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
auslk
初階會員


發表:35
回覆:77
積分:32
註冊:2003-02-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-11 13:48:11 IP:61.219.xxx.xxx 未訂閱
Dear 黑輪兄,    您好!     小弟 程式部份 我建議     不要轉成灰階 ,R G B 直接相減  修改如下:(直接複製就可以囉)     
 
int g1,g2,g3,r1,r2,r3,b1,b2,b3; 
Graphics::TBitmap *Bmp1 = new Graphics::TBitmap();
    Graphics::TBitmap *Bmp2 = new Graphics::TBitmap();
    Byte *ptr1;
    Byte *ptr2;
    int b1,g1,r1,b2,g2,r2,b3,g3,r3;
    int gray1,gray2,gray3;        Bmp1->Assign(Image1->Picture->Bitmap);
    Bmp2->Assign(Image2->Picture->Bitmap);        for(int i=0;iHeight;i  )
    {
      ptr1=(Byte *)Bmp1->ScanLine[i];
      ptr2=(Byte *)Bmp2->ScanLine[i];          for(int j=0;jWidth;j  )
      {
        b1=ptr1[j*3];
        g1=ptr1[j*3 1];
        r1=ptr1[j*3 2];  
        b2=ptr2[j*3];
        g2=ptr2[j*3 1];
        r2=ptr2[j*3 2];            r3=r1-r2;
        g3=g1-g2;
        b3=b1-b2;     
                    //===回代===
        ptr2[j*3]  =(Byte)b3;
        ptr2[j*3 1]=(Byte)g3;
        ptr2[j*3 2]=(Byte)r3;
        //==========
      }
    }
    Image3->Picture->Assign(Bmp2);    
@一般影像處理 不會用到這種手法,比較沒有研究效益 若遇到不詳的影像,你就無法順利處理! @CCD動態攝影也有類似比對方法,但非常耗時,沒效益 故會取影像特徵值來判斷(人臉判斷依照 臉的特徵來處理) @一般業界會根據一張影像的特徵值,來做影像分割 且以自動取閥值最有技術可言 研究,也就以這部份為重點 這一張圖的特徵,有明亮問題且有色彩變化問題 可以建議 1.轉換成HSI空間/取Hue轉Histogram 觀察分布情況 2.看分布落點,在針對落點區域,寫判斷 2-1假設變化量大的地方是你的閥值thresholding 2-2依照某兩個點(自訂)平均是否大於下兩個點(自訂)平均 判斷是否漸增 漸減 或收斂(平緩)來判斷你的影像 以上 ^^ ~ ps:我昨天Meeting 也是被教授k囉一頓 呵呵 因為我把基本的Opening &Closing搞混囉!嗚嗚~ 所以ㄌㄟ 務必把基本功夫打好 !不要像我這位老學生喔! Best Regards, Pauli 02/11/04' 發表人 - auslk 於 2004/02/11 14:11:14
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-11 15:26:30 IP:140.124.xxx.xxx 未訂閱
哇~~連我都嚇一跳~~沒注意圖這麼大~~不好意思~~ 我改過,試了一下,會有很亂的情形 上面的圖,是現在試做的,實際上的情形,其顏色不會這麼多,可能只是黑白格子相間,加上一些單純的顏色,或是其它較好判斷的顏色,背景應該是只是單一種顏色。 哪就是說要根據圖,而有不同的處理方法(因為特徵不同), 哪請問有什麼圖形是影像處理要判斷時,比較好找出來的圖形呢? ps:我沒修過影像處理的課,這學期開學才開始修~~慘!!!
JerryKuo
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-11 16:03:31 IP:61.220.xxx.xxx 未訂閱
黑輪你好: 兩張想減時,先做一次低頻濾波,減出來,才不會很多雜訊。 建議把影像轉成灰階後,再相減,之後可以用很多方法取出 黑白的桿子,方法決定在你。
auslk
初階會員


發表:35
回覆:77
積分:32
註冊:2003-02-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-11 16:29:42 IP:61.219.xxx.xxx 未訂閱
Dear 黑輪,    相減方式,我結論是得不到你要的結果 
#include "math.h" <~~~請加入此行喔!         Graphics::TBitmap *Bmp1 = new 
    Graphics::TBitmap();
    Graphics::TBitmap *Bmp2 = new Graphics::TBitmap();
    Byte *ptr1;
    Byte *ptr2;
    int b1,g1,r1,b2,g2,r2,b3,g3,r3;
            Bmp1->Assign(Image1->Picture->Bitmap);
    Bmp2->Assign(Image2->Picture->Bitmap);        for(int i=0;iHeight;i++)
    {
      ptr1=(Byte *)Bmp1->ScanLine[i];
      ptr2=(Byte *)Bmp2->ScanLine[i];          for(int j=0;jWidth;j++)
      {
        b1=ptr1[j*3];
        g1=ptr1[j*3+1];
        r1=ptr1[j*3+2];            b2=ptr2[j*3];
        g2=ptr2[j*3+1];
        r2=ptr2[j*3+2];           
         r3=abs(r2-r1);
         g3=abs(g2-g1);
         b3=abs(b2-b1);            //===回代===
        ptr2[j*3]  =(Byte)b3;
        ptr2[j*3+1]=(Byte)g3;
        ptr2[j*3+2]=(Byte)r3;
        //==========
      }
    }
    Image3->Picture->Assign(Bmp2);
} 
原因: 你的圖片 有位移狀況(你應該有移動到物品) 處理後的影像 有虛影.. 分割處理: 你的影像有以下特性: 1.轉成灰階Gray 後,Threshold =17 可分割出你要的影像 2.可以計算 灰階 從 0~30之間變化量 求最大與最小的變異交接處 就是你要的影像! 圖一 原始影像A 圖二 原始影像B 圖三 處理過影像C 圖四 處理分割後的影像D 圖五灰階直方圖( Gray Level Histogram )E 發表人 - auslk 於 2004/02/11 17:24:54
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-11 17:07:14 IP:140.124.xxx.xxx 未訂閱
auslk兄: 我試過了~正如你哪樣~顏色不會有亂掉的情形~謝啦~ 
引言: 1.轉換成HSI空間/取Hue轉Histogram 觀察分布情況
關於你的幫助,由於我剛接觸影像處沒多久,也沒有上過課,都是上網或看書(Digital Image Processing // Rafael C.Gonzalez /Richard E.Woods 中文的) 所以對於您說的東西,不情楚,我看的這本書裡有嗎?
auslk
初階會員


發表:35
回覆:77
積分:32
註冊:2003-02-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-12 13:26:27 IP:61.219.xxx.xxx 未訂閱
黑輪兄,    請參考我處理後的結果..         
引言: auslk兄: 我試過了~正如你哪樣~顏色不會有亂掉的情形~謝啦~
引言: 1.轉換成HSI空間/取Hue轉Histogram 觀察分布情況
關於你的幫助,由於我剛接觸影像處沒多久,也沒有上過課,都是上網或看書(Digital Image Processing // Rafael C.Gonzalez /Richard E.Woods 中文的) 所以對於您說的東西,不情楚,我看的這本書裡有嗎?
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-02-12 17:07:59 IP:140.124.xxx.xxx 未訂閱
ok~~我再另開一個主題~ 感謝各位的幫忙~~
系統時間:2024-05-10 5:14:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!