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

Sobel問題請教

答題得分者是:taishyang
ddaken
一般會員


發表:39
回覆:33
積分:19
註冊:2005-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-23 12:05:54 IP:61.229.xxx.xxx 未訂閱
請問各位大大~~ 我搜尋了sobel關鍵字 有了一下的文章等 http://delphi.ktop.com.tw/topic.php?topic_id=58467 http://delphi.ktop.com.tw/topic.php?topic_id=74102 http://delphi.ktop.com.tw/topic.php?topic_id=64540 http://delphi.ktop.com.tw/topic.php?topic_id=76652 發現了一些以前所討論的主要問題 譬如邊緣的問題考慮與否,value是否超過255. 另外姑且不討論sobel的gx+gy到底怎麼算// 且gx正確應該是 [-1 0 1;-2 0 2; -1 0 1] gy應該是[-1 -2 -1;0 0 0; 1 2 1] 我有看到有人說是 sqrt(abs(gx)+abs(gy))或(abs(gx)+abs(gy))/2 到底是哪一個?不過我看影像處理的書應該是sqrt(abs(gx)+abs(gy))才對吧?還是? 所以我的程式我是選擇使用sqrt(abs(gx)+abs(gy)) 可是我把上續的問題都考慮了//所寫出來的圖好像怪怪的~ 可否請各位大大有空幫我檢查一下~看我的邏輯哪裡錯了@
//===============================================
//Sobel
//===============================================
Graphics::TBitmap *sobelBmp = new Graphics::TBitmap();
sobelBmp->Assign(Image2->Picture->Bitmap);             //Image2是灰階圖
sobelBmp->PixelFormat=pf24bit;
Image3->Picture->Bitmap=sobelBmp;                      //Image3是顯示sobel後的圖
TRGBTriple *ptr3;
//===============================================
//動態分配二維記憶體
//===============================================
int **p1;                                              //自己產生一個二維記憶體p1,並把Image2的Y值放入矩陣p1裡 
int width=Image3->Picture->Bitmap->Width;
int height=Image3->Picture->Bitmap->Height;
p1=new int *[width];
for(int i=0;iScanLine[i];
  p1[i] =new int[height];
  for(int j=0;jHeight-1; i++)                //考慮邊緣問題~我直接忽略邊緣~所以i,j都是從1開始
{                                                      //且範圍只到Height-1,Width-1
 TRGBTriple *ptr4 = (TRGBTriple *)sobelBmp->ScanLine[i];
 for (int j=1; jWidth-1; j++)
 {
  int p[10]={0};
  int GX,GY;
  p[1]=p1[i-1][j-1];
  p[2]=p1[i][j-1];
  p[3]=p1[i+1][j-1];
  p[4]=p1[i-1][j];
  p[5]=p1[i][j];
  p[6]=p1[i+1][j];
  p[7]=p1[i-1][j+1];
  p[8]=p1[i][j+1];
  p[9]=p1[i+1][j+1];
  GX=p[7]+p[8]*2+p[9]-(p[1]+p[2]*2+p[3]);              //x方向的遮罩
  GY=(p[3]+p[6]*2+p[9])-(p[1]+p[4]*2+p[7]);            //y方向的遮罩
  int ss=sqrt(pow(GX,2)+pow(GY,2));                    //我已事先include <math.h>
  if (ss>255) ss=255;                                  //避免ss的值超過255
  int Blue=ss;
  int Green=ss;
  int Red=ss;
  Image3->Picture->Bitmap->Canvas->Pixels[j][i]=(TColor) RGB(Red,Green, Blue);
 }
}
↘ 發表人 - ddaken 於 2005/08/23 12:08:17 發表人 - ddaken 於 2005/08/23 12:09:46
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-23 13:03:33 IP:210.68.xxx.xxx 未訂閱
引言: 可是我把上續的問題都考慮了//所寫出來的圖好像怪怪的~ 可否請各位大大有空幫我檢查一下~看我的邏輯哪裡錯了@
哪裡怪呢? 能否描述一下?
ddaken
一般會員


發表:39
回覆:33
積分:19
註冊:2005-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-23 14:26:40 IP:61.229.xxx.xxx 未訂閱
因為我把同一張圖帶入matlab來做sobel 可是出來得結果卻不是很相同~ 這是參數的問題嗎?還是?? 因為我感覺用bcb寫出來的圖就是很怪 雖然可以從圖上感覺真的有把邊抓出來~ 可是似乎就是不對@也許是不相信自己吧! 所以很懷疑自己寫地程式~
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-23 15:43:54 IP:210.68.xxx.xxx 未訂閱
您用Matlab跑出來的圖應該是有加入二值化與細線化的結果
sodesga
一般會員


發表:1
回覆:3
積分:0
註冊:2004-09-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-23 17:09:12 IP:202.39.xxx.xxx 未訂閱
你的結果很正常啊!若要使你的程式結果像你舉的matlab例子,ss的值必須再做過thresholding才行。當然臨界值越大邊緣也會越少。
系統時間:2024-05-04 17:39:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!