Download as pdf or txt
Download as pdf or txt
You are on page 1of 22

DigitalImageProcessingusingMicrosoftVisualC++,KMITNB

Mr.NattapholJasungnuen andPoolsakKoseeyaporn,Ph.D
DepartmentofTeacherTraininginElectricalEngineering

(Digital Image Processing)


(Digital format)

(pixel)

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-2 Application Type


-Single document
-Document/View architecture support

1-3 User Interface Features


-Main frame style
-Toolbar Support

1- 4 Advance Interface
Features
-ActiveX controls

DigitalImageProcessingusingMicrosoftVisualC++,KMITNB

Class Wizard

1-5 Class Wizard


Microsoft Visual C++ Applications
ImageColor 1-5
Project
Resource Add Resource.. 1-6

2
Resource Bitmap

1-6 BITMAP Image Color

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);
}

1-10 Constructer CChildView


Resource
IDB_BITMAP1 Object CBitmap m_pImage

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
}

1-11 OnPaint CChildView


Build > Build ImageColor Run
Ctrl+F5 1-12

1-12 Visual C++

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);
}

2-2 Constructers CChildView


2-3
OnPaint(void) CChildView
memDC Object CDC (Device Context)
CreateCompatibleDC
SelectObject BitBlt
Resource
2-3
//ChildView.cpp
VoidCChildView::OnPaint()
{

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

Build > Build ColorImage


Ctrl+F5 2-5
dc.TextOut(10,10,"Theoriginalimage");

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);

2-5 Color Image Processing

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

3-1 Single Document

16

DigitalImageProcessingusingMicrosoftVisualC++,KMITNB

1
private ChildView Preprocessor N
200 threshold
3-2
//CChildView.h
#defineN200
classCChildView:publicCWnd
{
private:

CBitmapbmp;

CPointHome;

CSizesImage;

doublethreshold;

int**f;
.
}

3-2 private ChildView


2
Constructers CChildView
Constructers Dynamic array **f N 200
Home
3-3
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);
}

3-3 Constructers CChildView

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);
}

3-5 WM_LBUTTONDOWN CChildView

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

Build > Build EdgeDetect


EdgeDetect 3-7

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

You might also like