各位前輩好~小弟我參考了某位大大開放出來的作品及程式碼之後,便依照邊緣偵測程式這個部分照寫了一個程式,作為我ccd擷取出來的圖(24bit),做邊緣偵測!可是,問題卻出來了~我Load其他的圖檔,都可以做邊緣偵測...唯獨,我這個由ccd擷取出來的灰階圖卻不行...邊緣偵測出來的是亂碼!可是,我若是把這一張圖先轉成jpg再轉回bmp來用...竟然可以做邊緣偵測了...很奇怪的是,原本86.3KB的bmp圖檔經過兩次轉換後卻變成129KB了...
這是我由CCD擷取下來的圖(一樣的圖,經過兩次的轉換後卻又可以):
這是邊緣偵測失敗後的情形,也就是我的問題所在:
以下,是我邊緣偵測的code我在想,會不會是bit的原因:
#include
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b)) TForm1 *Form1;
int p1[640][480];
int p2[640][480];
int p3[640][480];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (OpenPictureDialog1->Execute())
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (Image1->Picture->Bitmap->Empty==true)
ShowMessage("請載入圖檔!!");
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Byte *ptr;
Bmp->Assign(Image1->Picture->Bitmap );
for (int i=0;iHeight;i )
{
ptr=(Byte*)Bmp->ScanLine[i];
for (int j=0;jWidth; j )
{
p1[j][i]=ptr[j*3];
}
}
for (int i=0;iHeight;i )
{
ptr=(Byte*)Bmp->ScanLine[i];
for (int j=0;jWidth; j ) {
ptr[j*3]=Gx(j,i) Gy(j,i);
ptr[j*3 1]=Gx(j,i) Gy(j,i);
ptr[j*3 2]=Gx(j,i) Gy(j,i);
}
} Image2->Picture->Assign(Bmp);
delete Bmp;
}
//--------------------------------------------------------------------------- //-----------------------------------------------------------------------------
int __fastcall TForm1::Gx(int i,int j)
{
int GX;
int p[10];
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] p[9])-(p[1] p[2] p[3]))/4;
if (GX<0)
GX=(-1)*GX;
return (GX);
}
//---------------------------------------------------------------------------
int __fastcall TForm1::Gy(int i,int j)
{
int GY;
int p[10];
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];
GY=((p[1] p[4] p[7])-(p[3] p[6] p[9]))/4;
if (GY<0)
GY=(-1)*GY;
return (GY);
} void __fastcall TForm1::Button3Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
以上,煩請各位前輩不吝指導剛踏入影像處理世界的我~真的很感謝!!