?? yinzhang.cpp
字號:
// YinZhang.cpp
// 印章圖像處理的一些接口
//
//////////////////////////////////////////////////////////////////////
#include "YinZhang.h"
#include "math.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CYinZhang::CYinZhang()
{
m_tOriPixelArray = NULL;//原始位圖數據
m_tResPixelArray = NULL;//參考位圖數據
}
CYinZhang::~CYinZhang()
{
}
////////////////////////////////////////////////////////////////////
//功能:裝載圖像
//參數:FilePathName-圖像文件路徑名
void CYinZhang::LoadImage(CString &FilePathName)
{
int i,j;
//檢測是否為空,不為空則要釋放內存
if(m_tOriPixelArray !=NULL)
{
for(i=0; i<ImageHeight; i++)
{
delete m_tOriPixelArray[i];
delete m_tResPixelArray[i];
delete ImageArray[i];
}
}
m_dib->Open(FilePathName);
ImageWidth = m_dib->GetWidth();
ImageHeight = m_dib->GetHeight();
BYTE *colorTable;
colorTable = (BYTE *)m_dib->m_pDibBits;
int byteBitCount = m_dib->GetBiBitCount()/8;
m_tOriPixelArray = new RGBQUAD*[ImageHeight];
m_tResPixelArray = new RGBQUAD*[ImageHeight];
ImageArray = new BYTE*[ImageHeight];
for(int l=0 ; l<ImageHeight; l++)
{
m_tOriPixelArray[l] = new RGBQUAD[ImageWidth];
m_tResPixelArray[l] = new RGBQUAD[ImageWidth];
ImageArray[l] = new BYTE[ImageWidth];
}
int count = 0;
for(i=ImageHeight-1; i>=0; i--)
{
for(j=0; j<ImageWidth; j++)
{
m_tOriPixelArray[i][j].rgbBlue =colorTable[count++];
m_tOriPixelArray[i][j].rgbGreen=colorTable[count++];
m_tOriPixelArray[i][j].rgbRed =colorTable[count++];
m_tOriPixelArray[i][j].rgbReserved = 0;
m_tResPixelArray[i][j]=m_tOriPixelArray[i][j];
ImageArray[i][j] = (BYTE)(((unsigned int)m_tOriPixelArray[i][j].rgbBlue
+(unsigned int)m_tOriPixelArray[i][j].rgbGreen
+(unsigned int)m_tOriPixelArray[i][j].rgbRed)/3);
count += byteBitCount-3;
}
count += (4-(ImageWidth*byteBitCount)%4)%4;
}
}
/////////////////////////////////////////////////////////////////////////////
// 去除背景
// 這里簡單的采用了從原圖像中提取紅色部分的方案
// 參數:refer-預先設定的紅色圖像印章聚類的中心值
void CYinZhang::EroseBackground(RGBQUAD &refer)
{
//定義閾值,可以適當的變動
unsigned char threR = 50;
unsigned char threG = 50;
unsigned char threB = 50;
BOOL rIn, gIn, bIn; //用來標志R,G,B分量是否在閾值范圍內
unsigned char temp;
int i,j;
for(i=0; i<ImageHeight; i++)
{
for(j=0; j<ImageWidth; j++)
{
//先判斷R分量
if((m_tOriPixelArray[i][j].rgbRed > refer.rgbRed)
&& (m_tOriPixelArray[i][j].rgbRed-refer.rgbRed<threR))
rIn = true;
else if((refer.rgbRed > m_tOriPixelArray[i][j].rgbRed)
&& (refer.rgbRed-m_tOriPixelArray[i][j].rgbRed<threR))
rIn = true;
else
rIn = false;
//判斷G分量
if((m_tOriPixelArray[i][j].rgbGreen > refer.rgbGreen)
&& (m_tOriPixelArray[i][j].rgbGreen-refer.rgbGreen<threG))
gIn = true;
else if((refer.rgbGreen > m_tOriPixelArray[i][j].rgbGreen)
&& (refer.rgbGreen-m_tOriPixelArray[i][j].rgbGreen<threG))
gIn = true;
else
gIn = false;
//判斷B分量
if((m_tOriPixelArray[i][j].rgbBlue > refer.rgbBlue)
&& (m_tOriPixelArray[i][j].rgbBlue-refer.rgbBlue<threB))
bIn = true;
else if((refer.rgbBlue> m_tOriPixelArray[i][j].rgbBlue)
&& (refer.rgbBlue-m_tOriPixelArray[i][j].rgbBlue<threB))
bIn = true;
else
bIn = false;
if(rIn && gIn && bIn)
ImageArray[i][j] = (BYTE)1;
else
ImageArray[i][j] = (BYTE)0;
}
}
}
/////////////////////////////////////////////////////////////////////////////////
//提取特征
void CYinZhang::FeatureExtract()
{
GlobalCentroid = (double)ImageWidth*(double)ImageHeight;
GlobalCentroidX = (double)ImageWidth/2.0;
GlobalCentroidY = (double)ImageHeight/2.0;
int i,j;
PrintCentroidX = 0.0;
PrintCentroidY = 0.0;
PrintMass = 0.0;
double tempX = 0.0;
double tempY = 0.0;
for(i=0; i<ImageHeight; i++)
{
for(j=0; j<ImageWidth; j++)
{
PrintMass += (double)ImageArray[i][j];
tempX += (double)j*(double)ImageArray[i][j];
tempY += (double)i*(double)ImageArray[i][j];
}
}
PrintCentroidX = tempX/PrintMass;
PrintCentroidY = tempY/PrintMass;
CentroidDistance = sqrt((PrintCentroidX-GlobalCentroidX)*(PrintCentroidX-GlobalCentroidX)
+(PrintCentroidY-GlobalCentroidY)*(PrintCentroidY-GlobalCentroidY));
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -