Professional Documents
Culture Documents
การประมวลผลภาพดิจิตอลด้วยโปรแกรม Visual C++ EP0 บทนำและโค้ด
การประมวลผลภาพดิจิตอลด้วยโปรแกรม Visual C++ EP0 บทนำและโค้ด
Mr.NattapholJasungnuen andPoolsakKoseeyaporn,Ph.D
DepartmentofTeacherTraininginElectricalEngineering
Pixel
Pixel
Pixel
Pixel
ppi (Pixel Per Inch) Pixel
Pixel
300 X 300 ppi ppi
Pixel
(Output Devices) Dot-matrix Laser
Raster Devices Pixel
(Bitmap)
(Bitmap) (Resolution Dependent)
Pixel
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
Pixel
Bitmap
.BMP , .PCX , .TIF, .GIF, .JPG, .MSP, .PCD
CBitmap Resource MFC Applications
1. MS Visual C++ MFC Applications Wizard 1-1
1-1 Project
2. Application Type Single Document Document /View
Architecture Support. 1-2
3. Advance Features Tap Support ActiveX Control
4. User Interface Features Tap Docking Toolbar Finish
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
1- 4 Advance Interface
Features
-ActiveX controls
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
Class Wizard
2
Resource Bitmap
5
....
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
Directory Bitmap
IDB_BITMAP1
Bitmap
1-7 BITMAP
CBitmap
Object CBitmap
CBitmap
1. CBitmap::CreateCompatibleBitmap
[ (Device Context) ]
2. CBitmap::LoadBitmap
Bitmap Resource CBitmap
3. CBitmap::GetBitmap
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
BitBlt CDC
- x,y
(Pixel) 1 1 Pixel
- nWidth,nHeight Image
- pSrcDC
- xSrc,ySrc x,y x ,y 0
- dwRop SRCCOPY Copy
1 Resource
Resource Project
Object CBitmap
Device Context (CDC) BitBlt
Bitmap 1-8
1-8 Bitmap
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
1-1
private m_pImage m_Size CChildView
ChildView.h 1-9
//ChildView.h
classCChildView:publicCWnd
{
private:
CBitmapm_pImage;
CSizem_Size;
...
}
1-9 CChildView
1-2
CChildView(Void) Constructer
CChildView(Void)
ChildView.cpp 1-10
//ChildView.cpp
CChildView::CChildView()
{
m_pImage.LoadBitmap(IDB_BITMAP1);
}
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
1- 3
OnPaint(void) CChildView
1-11
//ChildView.cpp
voidCChildView::OnPaint()
{
CPaintDCdc(this);//devicecontextforpainting
CDCmemDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&m_pImage);
dc.TextOut(20,10,"Theoriginalimage");
dc.BitBlt(20,30,m_Size.cx,m_Size.cy,&memDC,0,0,SRCCOPY);
//DonotcallCWnd::OnPaint()forpaintingmessages
}
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
2-1
private CChildView 2-1 **f
*f Dynamic Variable
N Pixel , sImage
, Home
//ChildView.h
#defineN500
classCChildView:publicCWnd
{
...........
private:
CBitmapm_pImage;
int**f;
CSizesImage;
CPointHome;
2-1 CChildView
2-2
Dynamic Variable **f
500 N
sImage Home 2-2
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
//ChildView.cpp
CChildView::CChildView()
{
f=newint*[N+1];
for(inti=0;i<=N;i++)
f[i]=newint[N+1];
Home=CPoint(10,30);
sImage=CSize(200,100);
m_pImage.LoadBitmap(IDB_BITMAP1);
}
CPaintDCdc(this);//devicecontextforpainting
CDCmemDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&m_pImage);
dc.TextOut(10,10,"Theoriginalimage");
1
dc.BitBlt(Home.x,Home.y,400,320,&memDC,0,0,SRCCOPY);
CWinApp*app=AfxGetApp();
if(app)
app>m_pMainWnd>SetWindowPos(NULL,50,50,700,
700,SWP_SHOWWINDOW);
}
2-3 OnPaint(void)
10
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
2-4
Window Message WM_LBUTTONDOWN CChildView
Tap Class Wizard Properties Message WM_LBUTTONDOWN >
OnLButtonDown 2-4
2-4
OnLButtonDown
//ChildView.cpp
voidCChildView::OnLButtonDown(UINTnFlags,CPointpoint)
{
CClientDCdc(this);
intr,g,b,bw;
dc.TextOut(440,Home.y20,"Extractfromtheoriginalimage");
dc.TextOut(440,180,"Grayscalebysettingr=g=b");
dc.TextOut(10,380,"Redscalebysettingg=b=0");
dc.TextOut(220,380,"Greenscalebysettingr=b=0");
dc.TextOut(430,380,"Bluescalebysettingr=g=0");
for(intj=0;j<=sImage.cy;j++)
for(inti=0;i<=sImage.cx;i++)
{
f[i][j]=dc.GetPixel(Home.x+i+80,Home.y+j+100);
2
dc.SetPixel(440+i,Home.y+j,f[i][j]);
r=f[i][j]>>16;
dc.SetPixel(10+i,400+j,r);
4
g=r<<8;
5
dc.SetPixel(220+i,400+j,g);
b=g<<8;
dc.SetPixel(430+i,400+j,b);
6
bw=r+g+b;
3
dc.SetPixel(440+i,200+j,bw);
}
dc.TextOut(10,510,"");
for(intj=0;j<=sImage.cy;j++)
for(inti=0;i<=sImage.cx;i++)
{
f[i][j]=dc.GetPixel(Home.x+i+50,Home.y+j+100);
r=f[i][j]>>16;
dc.SetPixel(10+i,530+j,RGB(r,0,0));
}
dc.TextOut(220,510,"");
for(intj=0;j<=sImage.cy;j++)
for(inti=0;i<=sImage.cx;i++)
{
f[i][j]=dc.GetPixel(Home.x+i+50,Home.y+j+100);
g=(f[i][j]>>8);
dc.SetPixel(220+i,530+j,RGB(0,g,0));
}
dc.TextOut(430,510,"");
for(intj=0;j<=sImage.cy;j++)
for(inti=0;i<=sImage.cx;i++)
{
f[i][j]=dc.GetPixel(Home.x+i+50,Home.y+j+100);
b=(f[i][j]);
dc.SetPixel(430+i,530+j,RGB(0,0,b));
}
CWnd::OnLButtonDown(nFlags,point);
11
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
dc.SetPixel(440+i,Home.y+j,f[i][j]);
dc.SetPixel(440+i,200+j,bw);
dc.BitBlt(Home.x,Home.y,400,320,&memDC,0,0,SRCCOPY);
12
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
ColorImage
//ChildView.h:interfaceoftheCChildViewclass
#pragmaonce
//CChildViewwindow
#defineN500
classCChildView:publicCWnd
{
//Construction
public:
CChildView();
private:
CBitmapm_pImage;
int**f;
CSizesImage;
CPointHome;
public:
//Overrides
protected:
virtualBOOLPreCreateWindow(CREATESTRUCT&cs);
//Implementation
public:
virtual~CChildView();
//Generatedmessagemapfunctions
protected:
afx_msgvoidOnPaint();
DECLARE_MESSAGE_MAP()
public:
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);
};
//ChildView.cpp:implementationoftheCChildViewclass
#include"stdafx.h"
#include"ImageColor.h"
#include"ChildView.h"
#include".\childview.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//CChildView
CChildView::CChildView()
{
f=newint*[N+1];
for(inti=0;i<=N;i++)
f[i]=newint[N+1];
Home=CPoint(10,30);
sImage=CSize(200,100);
m_pImage.LoadBitmap(IDB_BITMAP1);
}
13
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
CChildView::~CChildView()
{
for(inti=0;i<=N;i++)
deletef[i];
deletef;
}
BEGIN_MESSAGE_MAP(CChildView,CWnd)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
//CChildViewmessagehandlers
BOOLCChildView::PreCreateWindow(CREATESTRUCT&cs)
{
if(!CWnd::PreCreateWindow(cs))
returnFALSE;
cs.dwExStyle|=WS_EX_CLIENTEDGE;
cs.style&=~WS_BORDER;
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL,IDC_ARROW),reinterpret_cast<HBRUSH>(COLOR_WINDOW+1),NULL);
returnTRUE;
}
voidCChildView::OnPaint()
{
CPaintDCdc(this);//devicecontextforpainting
CDCmemDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&m_pImage);
dc.TextOut(10,10,"Theoriginalimage");
dc.BitBlt(Home.x,Home.y,400,320,&memDC,0,0,SRCCOPY);
CWinApp*app=AfxGetApp();
if(app)
app>m_pMainWnd>SetWindowPos(NULL,50,50,700,700,SWP_SHOWWINDOW);
//DonotcallCWnd::OnPaint()forpaintingmessages
}
voidCChildView::OnLButtonDown(UINTnFlags,CPointpoint)
{
CClientDCdc(this);
intr,g,b,bw;
dc.TextOut(440,Home.y20,"Extractfromtheoriginalimage");
dc.TextOut(440,180,"Grayscalebysettingr=g=b");
dc.TextOut(10,380,"Redscalebysettingg=b=0");
dc.TextOut(220,380,"Greenscalebysettingr=b=0");
dc.TextOut(430,380,"Bluescalebysettingr=g=0");
14
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
for(intj=0;j<=sImage.cy;j++)
for(inti=0;i<=sImage.cx;i++)
f[i][j]=dc.GetPixel(Home.x+i+80,Home.y+j+100);
dc.SetPixel(440+i,Home.y+j,f[i][j]);
r=f[i][j]>>16;
dc.SetPixel(10+i,400+j,r);
g=r<<8;
dc.SetPixel(220+i,400+j,g);
b=g<<8;
dc.SetPixel(430+i,400+j,b);
bw=r+g+b;
dc.SetPixel(440+i,200+j,bw);
dc.TextOut(10,510,"");
for(intj=0;j<=sImage.cy;j++)
for(inti=0;i<=sImage.cx;i++)
f[i][j]=dc.GetPixel(Home.x+i+50,Home.y+j+100);
r=f[i][j]>>16;
dc.SetPixel(10+i,530+j,RGB(r,0,0));
dc.TextOut(220,510,"");
for(intj=0;j<=sImage.cy;j++)
for(inti=0;i<=sImage.cx;i++)
f[i][j]=dc.GetPixel(Home.x+i+50,Home.y+j+100);
g=(f[i][j]>>8);
dc.SetPixel(220+i,530+j,RGB(0,g,0));
dc.TextOut(430,510,"");
for(intj=0;j<=sImage.cy;j++)
for(inti=0;i<=sImage.cx;i++)
f[i][j]=dc.GetPixel(Home.x+i+50,Home.y+j+100);
b=(f[i][j]);
dc.SetPixel(430+i,530+j,RGB(0,0,b));
CWnd::OnLButtonDown(nFlags,point);
15
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
3 (Edge Detection)
(Edge Detection)
()
Visual C++
EdgeDetect 2
Add Resource 3-1
16
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
1
private ChildView Preprocessor N
200 threshold
3-2
//CChildView.h
#defineN200
classCChildView:publicCWnd
{
private:
CBitmapbmp;
CPointHome;
CSizesImage;
doublethreshold;
int**f;
.
}
f=newint*[N+1];
for(inti=0;i<=N;i++)
f[i]=newint[N+1];
Home=CPoint(10,50);
sImage=CSize(200,100);
threshold=0;
bmp.LoadBitmap(IDB_BITMAP1);
}
17
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
3
OnPaint(void) CChildView
memDC Object CDC (Device Context)
CreateCompatibleDC
SelectObject BitBlt
BITMAP Resource
3-4
3-4 OnPaint()
voidCChildView::OnPaint()
{
CPaintDCdc(this);//devicecontextforpainting
CDCmemDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&bmp);
dc.BitBlt(Home.x,Home.y,400,300,&memDC,0,0,SRCCOPY);
for(intj=0;j<=sImage.cy;j++)
for(inti=0;i<=sImage.cx;i++)
f[i][j]=dc.GetPixel(Home.x+i+50,Home.y+j+100);
1
threshold+=(double)f[i][j];
threshold/=(double)(N*N);
CWinApp*app=AfxGetApp();
if(app)
app>m_pMainWnd>SetWindowPos(NULL,50,50,
700,500,SWP_SHOWWINDOW);
}
4
Window Message WM_LBUTTONDOWN CChildView
Tap Class Wizard Properties Message WM_LBUTTONDOWN >
OnLButtonDown 3-5
voidCChildView::OnLButtonDown(UINTnFlags,
CPointpoint)
{
////TODO:Addyourmessagehandlercodehere
CWnd::OnLButtonDown(nFlags,point);
}
18
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
3-6
voidCChildView::OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
CClientDCdc(this);
intSy,Sx,S,L;
dc.TextOut(440,Home.y40,"SobelMtd");
dc.TextOut(440,Home.y10+sImage.cy,"Laplacian1Mtd");
dc.TextOut(440,Home.y+20+2*sImage.cy,"Laplacian2Mtd");
for(intj=1;j<=sImage.cy1;j++)
for(inti=1;i<=sImage.cx1;i++)
{
SobelFilteringMethod
//Sobelmaskingfordetectingtheedges
Sy=f[i1][j+1]f[i+1][j+1]+2*f[i1][j]//horizontalkernel
1
2
1
2*f[i+1][j]+f[i1][j1]f[i+1][j1];
Sx=f[i1][j+1]2*f[i][j+1]f[i+1][j+1]//verticalkernel
+f[i1][j1]+2*f[i][j1]+f[i+1][j1];
S=abs(Sy)+abs(Sx);
if(S<=(int)threshold)
S=RGB(0,0,0);
else
S=RGB(255,255,255);
2
dc.SetPixel(440+i,Home.y25+j,S);
//Laplacianmaskingfordetectingtheedges
L=f[i][j+1]f[i1][j]
+4*f[i][j]f[i+1][j]f[i][j1];//kernel1
L=abs(L);
if(L<=(int)threshold)
L=RGB(0,0,0);
else
3
L=RGB(255,255,255);
dc.SetPixel(440+i,Home.y+5+sImage.cy+j,L);
L=f[i1][j+1]f[i][j+1]f[i+1][j+1]//kernel2
f[i1][j]+8*f[i][j]f[i+1][j]
f[i1][j1]f[i][j1]f[i+1][j1];
L=abs(L);
if(L<=(int)threshold)
L=RGB(0,0,0);
else
4
L=RGB(255,255,255);
dc.SetPixel(440+i,Home.y+35+2*sImage.cy+j,L);
S=
0
0
0
1
2
1
1 0
1
2 0
2
1 0
1
LaplacianFilteringMethod
Kernel1:
0 0 0 0 1 0
L= 1
2 1 + 0
2 0
0 0 0 0 1 0
0 1 0
= 1
4 1
0 1 0
LaplacianFilteringMethod
Kernel2:
1
1
1
L= 1
8
1
1
1
1
CWnd::OnLButtonDown(nFlags,point);
3-6
19
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
3-7
EdgeDetect
//ChildView.h:interfaceoftheCChildViewclass
#pragmaonce
#defineN200
classCChildView:publicCWnd
{
//Construction
public:
CChildView();
//Operations
private:
CBitmapbmp;
CPointHome;
CSizesImage;
doublethreshold;
int**f;
//Overrides
protected:
virtualBOOLPreCreateWindow(CREATESTRUCT&cs);
//Implementation
public:
virtual~CChildView();
//Generatedmessagemapfunctions
protected:
afx_msgvoidOnPaint();
DECLARE_MESSAGE_MAP()
public:
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);
};
20
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
//ChildView.cpp:implementationoftheCChildViewclass
#include"stdafx.h"
#include"EdgeDetect.h"
#include"ChildView.h"
#include".\childview.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//CChildView
CChildView::CChildView()
{
f=newint*[N+1];
for(inti=0;i<=N;i++)
f[i]=newint[N+1];
Home=CPoint(10,50);
sImage=CSize(200,100);
threshold=0;
bmp.LoadBitmap(IDB_BITMAP1);
}
CChildView::~CChildView()
{
for(inti=0;i<=N;i++)
deletef[i];
deletef;
}
BEGIN_MESSAGE_MAP(CChildView,CWnd)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
//CChildViewmessagehandlers
BOOLCChildView::PreCreateWindow(CREATESTRUCT&cs)
{
if(!CWnd::PreCreateWindow(cs))
returnFALSE;
cs.dwExStyle|=WS_EX_CLIENTEDGE;
cs.style&=~WS_BORDER;
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL,IDC_ARROW),reinterpret_cast<HBRUSH>(COLOR_WINDOW+1),NULL);
returnTRUE;
}
voidCChildView::OnPaint()
{
CPaintDCdc(this);//devicecontextforpainting
CDCmemDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&bmp);
dc.BitBlt(Home.x,Home.y,400,300,&memDC,0,0,SRCCOPY);
for(intj=0;j<=sImage.cy;j++)
for(inti=0;i<=sImage.cx;i++)
f[i][j]=dc.GetPixel(Home.x+i+50,Home.y+j+100);
threshold+=(double)f[i][j];
threshold/=(double)(N*N);
CWinApp*app=AfxGetApp();
if(app)
app>m_pMainWnd>SetWindowPos(NULL,50,50,700,500,SWP_SHOWWINDOW);
//DonotcallCWnd::OnPaint()forpaintingmessages
}
21
DigitalImageProcessingusingMicrosoftVisualC++,KMITNB
voidCChildView::OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
CClientDCdc(this);
intSy,Sx,S,L;
dc.TextOut(440,Home.y40,"SobelMtd");
dc.TextOut(440,Home.y10+sImage.cy,"Laplacian1Mtd");
dc.TextOut(440,Home.y+20+2*sImage.cy,"Laplacian2Mtd");
for(intj=1;j<=sImage.cy1;j++)
for(inti=1;i<=sImage.cx1;i++)
//Sobelmaskingfordetectingtheedges
Sy=f[i1][j+1]f[i+1][j+1]+2*f[i1][j]//horizontalkernel
2*f[i+1][j]+f[i1][j1]f[i+1][j1];
Sx=f[i1][j+1]2*f[i][j+1]f[i+1][j+1]//verticalkernel
+f[i1][j1]+2*f[i][j1]+f[i+1][j1];
S=abs(Sy)+abs(Sx);
if(S<=(int)threshold)
S=RGB(0,0,0);
else
S=RGB(255,255,255);
dc.SetPixel(440+i,Home.y25+j,S);
//Laplacianmaskingfordetectingtheedges
L=f[i][j+1]f[i1][j]
+4*f[i][j]f[i+1][j]f[i][j1];//kernel1
L=abs(L);
if(L<=(int)threshold)
L=RGB(0,0,0);
else
L=RGB(255,255,255);
dc.SetPixel(440+i,Home.y+5+sImage.cy+j,L);
L=f[i1][j+1]f[i][j+1]f[i+1][j+1]//kernel2
f[i1][j]+8*f[i][j]f[i+1][j]
f[i1][j1]f[i][j1]f[i+1][j1];
L=abs(L);
if(L<=(int)threshold)
L=RGB(0,0,0);
else
L=RGB(255,255,255);
dc.SetPixel(440+i,Home.y+35+2*sImage.cy+j,L);
CWnd::OnLButtonDown(nFlags,point);
}
References:
- Numerical Simulations and Case Studies Using Visual C++.NET
22