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

同樣的兩張圖,一張可做邊緣偵測,另一張卻不行?!

尚未結案
JK2050
一般會員


發表:5
回覆:5
積分:2
註冊:2005-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-12-07 21:13:53 IP:218.166.xxx.xxx 未訂閱
各位前輩好~小弟我參考了某位大大開放出來的作品及程式碼之後,便依照邊緣偵測程式這個部分照寫了一個程式,作為我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();
}
//---------------------------------------------------------------------------
 
以上,煩請各位前輩不吝指導剛踏入影像處理世界的我~真的很感謝!!
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-12-08 00:32:20 IP:218.168.xxx.xxx 未訂閱
您好: 要指定
Bmp->PixelFormat = pf24bit;
順心
JK2050
一般會員


發表:5
回覆:5
積分:2
註冊:2005-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-12-08 15:46:18 IP:218.166.xxx.xxx 未訂閱
taishyang 大大你好...我想請問一下,為何經過兩次轉換之後卻又可以了呢?我知道,jpg是破壞性壓縮~還有若是沒有指定的話,那原本是設定為8bit嗎?小弟才學粗淺~望大大不吝提攜後進!!感謝!!!!
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-12-08 16:14:16 IP:210.68.xxx.xxx 未訂閱
引言: 我想請問一下,為何經過兩次轉換之後卻又可以了呢? 您可以去check一下此時的pixelformat為何? 我知道,jpg是破壞性壓縮~還有若是沒有指定的話,那原本是設定為8bit嗎? 同上,您可以去check一下此時的pixelformat為何?
順心
JK2050
一般會員


發表:5
回覆:5
積分:2
註冊:2005-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-12-08 23:19:10 IP:218.166.xxx.xxx 未訂閱
taishyang 大大~真是謝謝你的指點!!經過jpg破壞性壓縮之後,裡面的資訊已經被打從新編排~故再轉回bmp時,已經不是原本的訊號了!真是太感謝了!!一語醒夢中人!
系統時間:2024-05-07 14:37:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!