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

ScanLine掃瞄影像做sobel邊緣化

答題得分者是:senso
超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-10-01 16:46:46 IP:163.17.xxx.xxx 訂閱
我用ScanLine掃瞄動態影像
畫面都很LAG
而且現在還出錯
錯誤的圖檔

我該怎麼修改呢?

[code cpp]
void __fastcall TForm1::Timer4Timer(TObject *Sender)
{


Byte *ptr;//用來指像素行的指標
int r,g,b;//rgb三原色
int grey;//用來存灰階化後的值
float count[256]={0}; //各色階計數

Graphics::TBitmap *Bmps = new Graphics::TBitmap(); //定義一個圖象句柄//
Bmps->Assign(Form1->Image1->Picture->Bitmap); // 將Image1 的Bitmap轉存到TBitmap Bmp

for(int d = 0; d < Bmps->Height; d)
{
ptr = (Byte *) Bmps->ScanLine[d]; //該行像素位址給ptr
for(int c = 0; c < Bmps->Width; c)
{
b=ptr[c*3]; //該點第一個位子是藍色
g=ptr[c*3 1]; //該點第二個位子是綠色
r=ptr[c*3 2]; //該點第三個位子是紅色

grey=0.299*r 0.587*g 0.114*b; //計算灰階後的值
ptr[c*3]=(Byte)grey; //存回灰階後的值
ptr[c*3 1]=(Byte)grey;
ptr[c*3 2]=(Byte)grey;


count[grey]; //灰階化後的各色階的計數
}
}
/**********************************Sobel測邊方法***********************************/
int i,j;
int **Sx;
int **Sy;
int TempImg[320][240];
Byte *ptr1;
Byte *ptr2;
Byte *ptr3;
Image4->Width = Bmps->Width;
Image4->Height= Bmps->Height;

for(i=1;i < Bmps->Width-1 ;i )
{

for(j=1;j < Bmps->Height-1 ;j )
{
ptr1 = (Byte *) Bmps->ScanLine[i-1];
ptr2 = (Byte *) Bmps->ScanLine[i];
ptr3 = (Byte *) Bmps->ScanLine[i 1];
/******計算X方向及Y方向的灰階變化量*******/
/*
Sx = Bmps->Canvas->Pixels[i-1][j 1] Bmps->Canvas->Pixels[i][j 1]*2 Bmps->Canvas->Pixels[i 1][j 1] - Bmps->Canvas->Pixels[i-1][j-1] - Bmps->Canvas->Pixels[i][j-1]*2 - Bmps->Canvas->Pixels[i 1][j-1];
Sy = Bmps->Canvas->Pixels[i 1][j-1] Bmps->Canvas->Pixels[i 1][j]*2 Bmps->Canvas->Pixels[i 1][j 1] - Bmps->Canvas->Pixels[i-1][j-1] - Bmps->Canvas->Pixels[i-1][j]*2 - Bmps->Canvas->Pixels[i-1][j 1];
*/
Sx[j][i]=-1*ptr1[(j-1)*3]-2*ptr1[j*3]-1*ptr1[(j 1)*3] ptr3[(j-1)*3] 2*ptr3[j*3] ptr3[(j 1)*3];
Sy[j][i]=-1*ptr1[(j-1)*3] ptr1[(j 1)*3]-2*ptr2[(j-1)*3] 2*ptr2[(j 1)*3]-1*ptr3[(j-1)*3] ptr3[(j 1)*3];
/*************在計算合成的量****************/

TempImg[j][i] = abs(sqrt(sqrt(sqrt(pow(Sx[j][i],2) pow(Sy[j][i],2)))));

if(TempImg[j][i]<40) /*門檻值設置*/
Image4->Canvas->Pixels[j][i] = (TColor)RGB(255,255,255); /*將影像設為白點*/

else
Image4->Canvas->Pixels[j][i] = (TColor)RGB(0,0,0); /*將影像設為黑點*/
}
}
Repaint();


}

[/code]

附加檔案:4ac46c7686d7e_RS232.rar
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-10-05 18:53:16 IP:122.116.xxx.xxx 訂閱
不知你是否有搜尋過站上的文章?
站上已經有很多Sobel的範例程式,您可以先參考看看^^
crowneva
一般會員


發表:4
回覆:10
積分:2
註冊:2009-07-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-10-19 19:38:25 IP:114.47.xxx.xxx 訂閱
我寫過靜態的
會有幫助嗎?
------
eva
編輯記錄
crowneva 重新編輯於 2009-10-19 19:40:07, 註解 無‧
超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-10-20 10:00:57 IP:163.17.xxx.xxx 訂閱
靜態的我也寫過
動態的就怕會有LAG情形
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-10-21 16:30:12 IP:61.219.xxx.xxx 訂閱
sobel我沒有研究
不過程式碼中
那個EAcessViolation大概是因為Sx和Sy沒有宣告大小
ptr1,ptr2,ptr3的scanline改在第1層for,不要放在第2層,速度應該就正常了
超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-10-22 15:46:58 IP:163.17.xxx.xxx 訂閱
你說的沒錯...
因為這部分我已經解決很久了
系統時間:2024-04-26 9:28:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!