www.pudn.com > ImgSeg.rar > ImgPro.cpp
// ImgPro.cpp: implementation of the CImgPro class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ImgSeg.h"
#include "ImgPro.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CImgPro::CImgPro(LPBYTE lpBits,LONG lWidth,LONG lHeight)
{
//初始化
m_lpBits=lpBits;
m_lWidth=lWidth;
m_lHeight=lHeight;
}
CImgPro::~CImgPro()
{
}
BOOL CImgPro::Roberts()
{
//Robert边缘检测算法
// 指向源图像的指针
LPSTR lpSrc;
// 指向缓存图像的指针
LPSTR lpDst;
// 指向缓存位图图像的指针
LPSTR lpNewBmpBits;
HLOCAL hNewBmpBits;
//循环变量
long i;
long j;
//像素值
double result;
unsigned char pixel[4];
// 暂时分配内存,以保存新图像
hNewBmpBits=LocalAlloc(LHND,m_lWidth*m_lHeight);
if(hNewBmpBits==NULL)
{
//分配内存失败
return FALSE;
}
// 锁定内存
lpNewBmpBits=(char*)LocalLock(hNewBmpBits);
// 初始化新分配的内存,设定初始值为255
lpDst=(char*)lpNewBmpBits;
memset(lpDst,(BYTE)255,m_lWidth*m_lHeight);
//使用水平方向的结构元素进行腐蚀
for(j=m_lHeight-1;j>0;j--)
{
for(i=0;i 255)
{
// 直接赋值为255
* lpDst = 255;
}
else
{
// 赋值
*lpDst=(unsigned char)(fResult+0.5);
}
}
}
// 复制变换后的图像
memcpy(lpBits, lpNewBmpBits, m_lWidth * m_lHeight);
// 释放内存
LocalUnlock(hNewBmpBits);
LocalFree(hNewBmpBits);
// 返回
return TRUE;
}
BOOL CImgPro::Sobel()
{
//Sobel算子
// 指向缓存图像的指针
LPSTR lpDst1;
LPSTR lpDst2;
// 指向缓存位图图像的指针
LPSTR lpNewBmpBits1;
HLOCAL hNewBmpBits1;
LPSTR lpNewBmpBits2;
HLOCAL hNewBmpBits2;
//循环变量
long i;
long j;
// 模板高度
int iTempH;
// 模板宽度
int iTempW;
// 模板系数
FLOAT fTempC;
// 模板中心元素X坐标
int iTempMX;
// 模板中心元素Y坐标
int iTempMY;
//模板数组
FLOAT aTemplate[9];
// 暂时分配内存,以保存新图像
hNewBmpBits1 = LocalAlloc(LHND, m_lWidth * m_lHeight);
if (hNewBmpBits1 == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewBmpBits1 = (char * )LocalLock(hNewBmpBits1);
// 暂时分配内存,以保存新图像
hNewBmpBits2 = LocalAlloc(LHND, m_lWidth *m_lHeight);
if (hNewBmpBits2 == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewBmpBits2 = (char * )LocalLock(hNewBmpBits2);
// 拷贝源图像到缓存图像中
lpDst1 = (char *)lpNewBmpBits1;
memcpy(lpNewBmpBits1, m_lpBits, m_lWidth * m_lHeight);
lpDst2 = (char *)lpNewBmpBits2;
memcpy(lpNewBmpBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置Sobel模板参数
iTempW = 3;
iTempH = 3;
fTempC = 1.0;
iTempMX = 1;
iTempMY = 1;
aTemplate[0] = -1.0;
aTemplate[1] = -2.0;
aTemplate[2] = -1.0;
aTemplate[3] = 0.0;
aTemplate[4] = 0.0;
aTemplate[5] = 0.0;
aTemplate[6] = 1.0;
aTemplate[7] = 2.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBmpBits1,iTempH,iTempW,iTempMX,iTempMY,aTemplate,fTempC))
{
return FALSE;
}
// 设置Sobel模板参数
aTemplate[0] = -1.0;
aTemplate[1] = 0.0;
aTemplate[2] = 1.0;
aTemplate[3] = -2.0;
aTemplate[4] = 0.0;
aTemplate[5] = 2.0;
aTemplate[6] = -1.0;
aTemplate[7] = 0.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBmpBits2,iTempH,iTempW,
iTempMX,iTempMY,aTemplate,fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 复制经过模板运算后的图像到源图像
memcpy(m_lpBits, lpNewBmpBits1, m_lWidth * m_lHeight);
// 释放内存
LocalUnlock(hNewBmpBits1);
LocalFree(hNewBmpBits1);
LocalUnlock(hNewBmpBits2);
LocalFree(hNewBmpBits2);
// 返回
return TRUE;
}
BOOL CImgPro::Threshold(unsigned char iThreshold)
{
//如果阈值小于0或大于255,返回FALSE
if(iThreshold<0 || iThreshold>255)
return FALSE;
int i,j; //循环变量
unsigned cur; //当前象素位置
for(i=0;i *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 复制经过模板运算后的图像到源图像
memcpy(m_lpBits, lpNewBmpBits1, m_lWidth * m_lHeight);
// 释放内存
LocalUnlock(hNewBmpBits1);
LocalFree(hNewBmpBits1);
LocalUnlock(hNewBmpBits2);
LocalFree(hNewBmpBits2);
// 返回
return TRUE;
}
unsigned char CImgPro::IterativeThreshold()
{
// 指向源图像的指针
LPSTR lpSrc;
//循环变量
long i;
long j;
//像素值
unsigned char pixel;
//直方图数组
long lHistogram[256];
//阈值,最大灰度值与最小灰度值,两个区域的平均灰度值
unsigned char iThreshold,iNewThreshold,iMaxGrayValue,
iMinGrayValue,iMean1GrayValue,iMean2GrayValue;
//用于计算区域灰度平均值的中间变量
long lP1,lP2,lS1,lS2;
//迭代次数
int iIterationTimes;
for (i = 0; i < 256;i++)
{
lHistogram[i]=0;
}
//获得直方图
iMaxGrayValue = 0;
iMinGrayValue = 255;
for (i = 0;i pixel)
{
iMinGrayValue = pixel;
}
if(iMaxGrayValue < pixel)
{
iMaxGrayValue = pixel;
}
}
}
//迭代求最佳阈值
iNewThreshold = (iMinGrayValue + iMaxGrayValue)/2;
iThreshold = 0;
for(iIterationTimes = 0; iThreshold != iNewThreshold &&
iIterationTimes < 100;iIterationTimes ++)
{
iThreshold = iNewThreshold;
lP1 =0;
lP2 =0;
lS1 = 0;
lS2 = 0;
//求两个区域的灰度平均值
for (i = iMinGrayValue;i < iThreshold;i++)
{
lP1 += lHistogram[i]*i;
lS1 += lHistogram[i];
}
if(lP1!=0 && lS1!=0)
{
iMean1GrayValue = (unsigned char)(lP1 / lS1);
}
else
{
iMean1GrayValue=(unsigned char)lP1;
}
for (i = iThreshold+1;i < iMaxGrayValue;i++)
{
lP2 += lHistogram[i]*i;
lS2 += lHistogram[i];
}
if(lP2!=0 && lS2!=0)
{
iMean2GrayValue = (unsigned char)(lP2 / lS2);
}
else
{
iMean2GrayValue = (unsigned char)lP2;
}
iNewThreshold = (iMean1GrayValue + iMean2GrayValue)/2;
}
return iThreshold;
}
BOOL CImgPro::Prewitt()
{
// 指向缓存图像的指针
LPSTR lpDst1;
LPSTR lpDst2;
// 指向缓存位图图像的指针
LPSTR lpNewBits1;
HLOCAL hNewBits1;
LPSTR lpNewBits2;
HLOCAL hNewBits2;
//循环变量
long i;
long j;
// 模板高度
int iTempH;
// 模板宽度
int iTempW;
// 模板系数
FLOAT fTempC;
// 模板中心元素X坐标
int iTempMX;
// 模板中心元素Y坐标
int iTempMY;
//模板数组
FLOAT aTemplate[9];
// 暂时分配内存,以保存新图像
hNewBits1 = LocalAlloc(LHND, m_lWidth * m_lHeight);
if (hNewBits1 == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewBits1 = (char * )LocalLock(hNewBits1);
// 暂时分配内存,以保存新图像
hNewBits2 = LocalAlloc(LHND, m_lWidth * m_lHeight);
if (hNewBits2 == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewBits2 = (char * )LocalLock(hNewBits2);
// 拷贝源图像到缓存图像中
lpDst1 = (char *)lpNewBits1;
memcpy(lpNewBits1, m_lpBits, m_lWidth * m_lHeight);
lpDst2 = (char *)lpNewBits2;
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置Prewitt模板参数
iTempW = 3;
iTempH = 3;
fTempC = 1.0;
iTempMX = 1;
iTempMY = 1;
aTemplate[0] = -1.0;
aTemplate[1] = -1.0;
aTemplate[2] = -1.0;
aTemplate[3] = 0.0;
aTemplate[4] = 0.0;
aTemplate[5] = 0.0;
aTemplate[6] = 1.0;
aTemplate[7] = 1.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBits1,iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
// 设置Prewitt模板参数
aTemplate[0] = 1.0;
aTemplate[1] = 0.0;
aTemplate[2] = -1.0;
aTemplate[3] = 1.0;
aTemplate[4] = 0.0;
aTemplate[5] = -1.0;
aTemplate[6] = 1.0;
aTemplate[7] = 0.0;
aTemplate[8] = -1.0;
// 调用Template()函数
if (!Template(lpNewBits2,iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 复制经过模板运算后的图像到源图像
memcpy(m_lpBits, lpNewBits1, m_lWidth * m_lHeight);
// 释放内存
LocalUnlock(hNewBits1);
LocalFree(hNewBits1);
LocalUnlock(hNewBits2);
LocalFree(hNewBits2);
// 返回
return TRUE;
}
BOOL CImgPro::Kirsch()
{
// 指向缓存图像的指针
LPSTR lpDst1;
LPSTR lpDst2;
// 指向缓存位图图像的指针
LPSTR lpNewBits1;
HLOCAL hNewBits1;
LPSTR lpNewBits2;
HLOCAL hNewBits2;
//循环变量
long i;
long j;
// 模板高度
int iTempH;
// 模板宽度
int iTempW;
// 模板系数
FLOAT fTempC;
// 模板中心元素X坐标
int iTempMX;
// 模板中心元素Y坐标
int iTempMY;
//模板数组
FLOAT aTemplate[9];
// 暂时分配内存,以保存新图像
hNewBits1 = LocalAlloc(LHND, m_lWidth * m_lHeight);
if (hNewBits1 == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewBits1 = (char * )LocalLock(hNewBits1);
// 暂时分配内存,以保存新图像
hNewBits2 = LocalAlloc(LHND, m_lWidth * m_lHeight);
if (hNewBits2 == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewBits2 = (char * )LocalLock(hNewBits2);
// 拷贝源图像到缓存图像中
lpDst1 = (char *)lpNewBits1;
memcpy(lpNewBits1, m_lpBits, m_lWidth * m_lHeight);
lpDst2 = (char *)lpNewBits2;
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置Kirsch模板1参数
iTempW = 3;
iTempH = 3;
fTempC = 1.0;
iTempMX = 1;
iTempMY = 1;
aTemplate[0] = 5.0;
aTemplate[1] = 5.0;
aTemplate[2] = 5.0;
aTemplate[3] = -3.0;
aTemplate[4] = 0.0;
aTemplate[5] = -3.0;
aTemplate[6] = -3.0;
aTemplate[7] = -3.0;
aTemplate[8] = -3.0;
// 调用Template()函数
if (!Template(lpNewBits1, iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
// 设置Kirsch模板2参数
aTemplate[0] = -3.0;
aTemplate[1] = 5.0;
aTemplate[2] = 5.0;
aTemplate[3] = -3.0;
aTemplate[4] = 0.0;
aTemplate[5] = 5.0;
aTemplate[6] = -3.0;
aTemplate[7] = -3.0;
aTemplate[8] = -3.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置Kirsch模板3参数
aTemplate[0] = -3.0;
aTemplate[1] = -3.0;
aTemplate[2] = 5.0;
aTemplate[3] = -3.0;
aTemplate[4] = 0.0;
aTemplate[5] = 5.0;
aTemplate[6] = -3.0;
aTemplate[7] = -3.0;
aTemplate[8] = 5.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置Kirsch模板4参数
aTemplate[0] = -3.0;
aTemplate[1] = -3.0;
aTemplate[2] = -3.0;
aTemplate[3] = -3.0;
aTemplate[4] = 0.0;
aTemplate[5] = 5.0;
aTemplate[6] = -3.0;
aTemplate[7] = 5.0;
aTemplate[8] = 5.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY,
aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置Kirsch模板5参数
aTemplate[0] = -3.0;
aTemplate[1] = -3.0;
aTemplate[2] = -3.0;
aTemplate[3] = -3.0;
aTemplate[4] = 0.0;
aTemplate[5] = -3.0;
aTemplate[6] = 5.0;
aTemplate[7] = 5.0;
aTemplate[8] = 5.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置Kirsch模板6参数
aTemplate[0] = -3.0;
aTemplate[1] = -3.0;
aTemplate[2] = -3.0;
aTemplate[3] = 5.0;
aTemplate[4] = 0.0;
aTemplate[5] = -3.0;
aTemplate[6] = 5.0;
aTemplate[7] = 5.0;
aTemplate[8] = -3.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置Kirsch模板7参数
aTemplate[0] = 5.0;
aTemplate[1] = -3.0;
aTemplate[2] = -3.0;
aTemplate[3] = 5.0;
aTemplate[4] = 0.0;
aTemplate[5] = -3.0;
aTemplate[6] = 5.0;
aTemplate[7] = -3.0;
aTemplate[8] = -3.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置Kirsch模板8参数
aTemplate[0] = 5.0;
aTemplate[1] = 5.0;
aTemplate[2] = -3.0;
aTemplate[3] = 5.0;
aTemplate[4] = 0.0;
aTemplate[5] = -3.0;
aTemplate[6] = -3.0;
aTemplate[7] = -3.0;
aTemplate[8] = -3.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 复制经过模板运算后的图像到源图像
memcpy(m_lpBits, lpNewBits1, m_lWidth * m_lHeight);
// 释放内存
LocalUnlock(hNewBits1);
LocalFree(hNewBits1);
LocalUnlock(hNewBits2);
LocalFree(hNewBits2);
// 返回
return TRUE;
}
BOOL CImgPro::Gauss()
{
// 指向源图像的指针
LPSTR lpSrc;
// 指向缓存图像的指针
LPSTR lpDst;
// 指向缓存位图图像的指针
LPSTR lpNewBits;
HLOCAL hNewBits;
// 模板高度
int iTempH;
// 模板宽度
int iTempW;
// 模板系数
FLOAT fTempC;
// 模板中心元素X坐标
int iTempMX;
// 模板中心元素Y坐标
int iTempMY;
//模板数组
FLOAT aTemplate[25];
//像素值
double result=0.0;
//循环变量
LONG i;
LONG j;
LONG k;
//过零点检测求最终边缘点时原始图像
//的0和1区域灰度值之和与象素数量
int iGray0=0;
int iGray1=0;
int iGray0Num=0;
int iGray1Num=0;
//0区域与1区域灰度均值
float iGray0Av=0.0;
float iGray1Av=0.0;
//象素指针
char *lpPixel[18];
// 暂时分配内存,以保存新图像
hNewBits = LocalAlloc(LHND, m_lWidth * m_lHeight);
if (hNewBits == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewBits = (char * )LocalLock(hNewBits);
// 拷贝源图像到缓存图像中
lpDst = (char *)lpNewBits;
memcpy(lpNewBits, m_lpBits, m_lWidth * m_lHeight);
// 设置Gauss模板参数
iTempW = 5;
iTempH = 5;
fTempC = 1.0;
iTempMX = 2;
iTempMY = 2;
aTemplate[0] = -2.0;
aTemplate[1] = -4.0;
aTemplate[2] = -4.0;
aTemplate[3] = -4.0;
aTemplate[4] = -2.0;
aTemplate[5] = -4.0;
aTemplate[6] = 0.0;
aTemplate[7] = 8.0;
aTemplate[8] = 0.0;
aTemplate[9] = -4.0;
aTemplate[10] = -4.0;
aTemplate[11] = 8.0;
aTemplate[12] = 24.0;
aTemplate[13] = 8.0;
aTemplate[14] = -4.0;
aTemplate[15] = -4.0;
aTemplate[16] = 0.0;
aTemplate[17] = 8.0;
aTemplate[18] = 0.0;
aTemplate[19] = -4.0;
aTemplate[20] = -2.0;
aTemplate[21] = -4.0;
aTemplate[22] = -4.0;
aTemplate[23] = -4.0;
aTemplate[24] = -2.0;
// 调用Template()函数
if (!Template(lpNewBits, iTempH, iTempW, iTempMX, iTempMY,
aTemplate, fTempC))
{
return FALSE;
}
/*//过零点检测
//除去面积小于t的区域
for(i=1;i=(p-fWin)) && (iGrayXY<=p))
{
return 2*(float)pow((iGrayXY-p+fWin)/(2*fWin),2);
}
else
if((iGrayXY>p) && (iGrayXY<=(p+fWin)))
{
return 1-2*(float)pow((iGrayXY-p-fWin)/(2*fWin),2);
}
else
{
return 1.0;
}
}
unsigned char CImgPro::FuzzyThreshold(unsigned char iWin)
{
//模糊阈值分割算法
//iWin为隶属函数窗口宽度
float fFuzzy; //模糊率
float fMinFuzzy; //最小模糊率
float s; //隶属函数返回值
unsigned char iThreshold; //模糊阈值
LPSTR lpSrc; // 指向源图像的指针
//循环变量
long i;
long j;
//灰度循环变量
int l;
//窗口中心循环变量
unsigned char q;
//像素值
unsigned char pixel;
//直方图数组
long lHistogram[256];
for (i = 0; i < 256;i++)
{
lHistogram[i]=0;
}
for (i = 0;i 0.5)
s=1-s;
//求模糊率
fFuzzy+=s*lHistogram[l];
}
fFuzzy=2*fFuzzy/(m_lWidth*m_lHeight);
if(fFuzzy=0; j--)
{
// 指向缓存图像1第i行,第j个象素的指针
lpDst1 = (char *)lpNewBits1 + m_lWidth * i + j;
// 指向目标图像(缓存图像2)第i行,第j个象素的指针
lpDst2 = (char *)lpNewBits2 + m_lWidth * i + j;
//计算目标图像中的当前点
pixel[0]=(unsigned char)*lpDst1;
pixel[1]=(unsigned char)*((char *)lpNewBits2 + m_lWidth * i + j+1);
result=pixel[1]+a*(pixel[0]-pixel[1]);
*lpDst2 = (unsigned char)result;
}
}
// 缓存图像1清0
lpDst1=(char*)lpNewBits1;
memset(lpDst1,(BYTE)0,m_lWidth*m_lHeight);
//正向列递归滤波
for(i = 1; i =0; i--)
{
for(j = 0;j >=m_lWidth; j++)
{
// 指向缓存图像1第i行,第j个象素的指针
lpDst1 = (char *)lpNewBits1 + m_lWidth * i + j;
// 指向目标图像第i行,第j个象素的指针
lpDst2 = (char *)lpNewBits2 + m_lWidth * i + j;
//计算目标图像中的当前点
pixel[0]=(unsigned char)*lpDst1;
pixel[1]=(unsigned char)*((char *)lpNewBits2 + m_lWidth * (i+1) + j);
result=pixel[1]+a*(pixel[0]-pixel[1]);
*lpDst2 = (unsigned char)result;
}
}
//求滤波后的图像与原图像的差
for(i = 0; i 0)
*lpDst2 =(unsigned char)255;
else
*lpDst2=(unsigned char)0;
}
}
/*//过零点检测
//除去面积小于t的区域
for(i=1;i *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置综合正交模板波纹1参数
aTemplate[0] = 0.0;
aTemplate[1] = -1.0;
aTemplate[2] = 2.0;
aTemplate[3] = 1.0;
aTemplate[4] = 0.0;
aTemplate[5] = -1.0;
aTemplate[6] = -2.0;
aTemplate[7] = 1.0;
aTemplate[8] = 0.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置综合正交模板波纹2参数
aTemplate[0] = 2.0;
aTemplate[1] = -1.0;
aTemplate[2] = 0.0;
aTemplate[3] = -1.0;
aTemplate[4] = 0.0;
aTemplate[5] = 1.0;
aTemplate[6] = 0.0;
aTemplate[7] = 1.0;
aTemplate[8] = -2.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY,
aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置综合正交模板直线模板1的参数
aTemplate[0] = 0.0;
aTemplate[1] = 1.0;
aTemplate[2] = 0.0;
aTemplate[3] = -1.0;
aTemplate[4] = 0.0;
aTemplate[5] = -1.0;
aTemplate[6] = 0.0;
aTemplate[7] = 1.0;
aTemplate[8] = 0.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置综合正交模板直线模板2参数
aTemplate[0] = -1.0;
aTemplate[1] = 0.0;
aTemplate[2] = 1.0;
aTemplate[3] = 0.0;
aTemplate[4] = 0.0;
aTemplate[5] = 0.0;
aTemplate[6] = 1.0;
aTemplate[7] = 0.0;
aTemplate[8] = -1.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置综合正交模板Laplacian模板1的参数
aTemplate[0] = 1.0;
aTemplate[1] = -2.0;
aTemplate[2] = 1.0;
aTemplate[3] = -2.0;
aTemplate[4] = 4.0;
aTemplate[5] = -2.0;
aTemplate[6] = 1.0;
aTemplate[7] = -2.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置综合正交模板Laplacian模板2参数
aTemplate[0] = -2.0;
aTemplate[1] = 1.0;
aTemplate[2] = -2.0;
aTemplate[3] = 1.0;
aTemplate[4] = 4.0;
aTemplate[5] = 1.0;
aTemplate[6] = -2.0;
aTemplate[7] = 1.0;
aTemplate[8] = -2.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置综合正交模板平均模板的参数
fTempC = 9.0;
aTemplate[0] = 1.0;
aTemplate[1] = 1.0;
aTemplate[2] = 1.0;
aTemplate[3] = 1.0;
aTemplate[4] = 1.0;
aTemplate[5] = 1.0;
aTemplate[6] = 1.0;
aTemplate[7] = 1.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 复制经过模板运算后的图像到源图像
memcpy(m_lpBits, lpNewBits1, m_lWidth * m_lHeight);
// 释放内存
LocalUnlock(hNewBits1);
LocalFree(hNewBits1);
LocalUnlock(hNewBits2);
LocalFree(hNewBits2);
// 返回
return TRUE;
}
BOOL CImgPro::EdgeMod()
{
//边缘模板匹配
// 指向缓存图像的指针
LPSTR lpDst1;
LPSTR lpDst2;
// 指向缓存位图图像的指针
LPSTR lpNewBits1;
HLOCAL hNewBits1;
LPSTR lpNewBits2;
HLOCAL hNewBits2;
//循环变量
long i;
long j;
// 模板高度
int iTempH;
// 模板宽度
int iTempW;
// 模板系数
FLOAT fTempC;
// 模板中心元素X坐标
int iTempMX;
// 模板中心元素Y坐标
int iTempMY;
//模板数组
FLOAT aTemplate[9];
// 暂时分配内存,以保存新图像
hNewBits1 = LocalAlloc(LHND, m_lWidth * m_lHeight);
if (hNewBits1 == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewBits1 = (char * )LocalLock(hNewBits1);
// 暂时分配内存,以保存新图像
hNewBits2 = LocalAlloc(LHND, m_lWidth * m_lHeight);
if (hNewBits2 == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewBits2 = (char * )LocalLock(hNewBits2);
// 拷贝源图像到缓存图像中
lpDst1 = (char *)lpNewBits1;
memcpy(lpNewBits1, m_lpBits, m_lWidth * m_lHeight);
lpDst2 = (char *)lpNewBits2;
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置边缘模板1参数
iTempW = 3;
iTempH = 3;
fTempC = 1.0;
iTempMX = 1;
iTempMY = 1;
aTemplate[0] = 1.0;
aTemplate[1] = 1.0;
aTemplate[2] = 1.0;
aTemplate[3] = 0.0;
aTemplate[4] = 0.0;
aTemplate[5] = 0.0;
aTemplate[6] = -1.0;
aTemplate[7] = -1.0;
aTemplate[8] = -1.0;
// 调用Template()函数
if (!Template(lpNewBits1, iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
// 设置边缘模板2参数
aTemplate[0] = 1.0;
aTemplate[1] = 1.0;
aTemplate[2] = 0.0;
aTemplate[3] = 1.0;
aTemplate[4] = 0.0;
aTemplate[5] = -1.0;
aTemplate[6] = 0.0;
aTemplate[7] = -1.0;
aTemplate[8] = -1.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置边缘模板3参数
aTemplate[0] = 1.0;
aTemplate[1] = 0.0;
aTemplate[2] = -1.0;
aTemplate[3] = 1.0;
aTemplate[4] = 0.0;
aTemplate[5] = -1.0;
aTemplate[6] = 1.0;
aTemplate[7] = 0.0;
aTemplate[8] = -1.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置边缘模板4参数
aTemplate[0] = 0.0;
aTemplate[1] = -1.0;
aTemplate[2] = -1.0;
aTemplate[3] = 1.0;
aTemplate[4] = 0.0;
aTemplate[5] = -1.0;
aTemplate[6] = 1.0;
aTemplate[7] = 1.0;
aTemplate[8] = 0.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY,
aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
/*// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置边缘模板5参数
aTemplate[0] = -1.0;
aTemplate[1] = -1.0;
aTemplate[2] = -1.0;
aTemplate[3] = 0.0;
aTemplate[4] = 0.0;
aTemplate[5] = 0.0;
aTemplate[6] = 1.0;
aTemplate[7] = 1.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置边缘模板6参数
aTemplate[0] = -1.0;
aTemplate[1] = -1.0;
aTemplate[2] = 0.0;
aTemplate[3] = -1.0;
aTemplate[4] = 0.0;
aTemplate[5] = 1.0;
aTemplate[6] = 0.0;
aTemplate[7] = 1.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置边缘模板7参数
aTemplate[0] = -1.0;
aTemplate[1] = 0.0;
aTemplate[2] = 1.0;
aTemplate[3] = -1.0;
aTemplate[4] = 0.0;
aTemplate[5] = 1.0;
aTemplate[6] = -1.0;
aTemplate[7] = 0.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置边缘模板8参数
aTemplate[0] = 0.0;
aTemplate[1] = 1.0;
aTemplate[2] = 1.0;
aTemplate[3] = -1.0;
aTemplate[4] = 0.0;
aTemplate[5] = 1.0;
aTemplate[6] = -1.0;
aTemplate[7] = -1.0;
aTemplate[8] = 0.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}*/
// 复制经过模板运算后的图像到源图像
memcpy(m_lpBits, lpNewBits1, m_lWidth * m_lHeight);
// 释放内存
LocalUnlock(hNewBits1);
LocalFree(hNewBits1);
LocalUnlock(hNewBits2);
LocalFree(hNewBits2);
// 返回
return TRUE;
}
BOOL CImgPro::LineMod()
{
//线模板匹配
// 指向缓存图像的指针
LPSTR lpDst1;
LPSTR lpDst2;
// 指向缓存位图图像的指针
LPSTR lpNewBits1;
HLOCAL hNewBits1;
LPSTR lpNewBits2;
HLOCAL hNewBits2;
//循环变量
long i;
long j;
// 模板高度
int iTempH;
// 模板宽度
int iTempW;
// 模板系数
FLOAT fTempC;
// 模板中心元素X坐标
int iTempMX;
// 模板中心元素Y坐标
int iTempMY;
//模板数组
FLOAT aTemplate[9];
// 暂时分配内存,以保存新图像
hNewBits1 = LocalAlloc(LHND, m_lWidth * m_lHeight);
if (hNewBits1 == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewBits1 = (char * )LocalLock(hNewBits1);
// 暂时分配内存,以保存新图像
hNewBits2 = LocalAlloc(LHND, m_lWidth * m_lHeight);
if (hNewBits2 == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewBits2 = (char * )LocalLock(hNewBits2);
// 拷贝源图像到缓存图像中
lpDst1 = (char *)lpNewBits1;
memcpy(lpNewBits1, m_lpBits, m_lWidth * m_lHeight);
lpDst2 = (char *)lpNewBits2;
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置点模板1参数
iTempW = 3;
iTempH = 3;
fTempC = 1.0;
iTempMX = 1;
iTempMY = 1;
aTemplate[0] = -1.0;
aTemplate[1] = -1.0;
aTemplate[2] = -1.0;
aTemplate[3] = 2.0;
aTemplate[4] = 2.0;
aTemplate[5] = 2.0;
aTemplate[6] = -1.0;
aTemplate[7] = -1.0;
aTemplate[8] = -1.0;
// 调用Template()函数
if (!Template(lpNewBits1, iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
// 设置点模板2参数
aTemplate[0] = -1.0;
aTemplate[1] = -1.0;
aTemplate[2] = 2.0;
aTemplate[3] = -1.0;
aTemplate[4] = 2.0;
aTemplate[5] = -1.0;
aTemplate[6] = 2.0;
aTemplate[7] = -1.0;
aTemplate[8] = -1.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置点模板3参数
aTemplate[0] = -1.0;
aTemplate[1] = 2.0;
aTemplate[2] = -1.0;
aTemplate[3] = -1.0;
aTemplate[4] = 2.0;
aTemplate[5] = -1.0;
aTemplate[6] = -1.0;
aTemplate[7] = 2.0;
aTemplate[8] = -1.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX,
iTempMY, aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 拷贝源图像到缓存图像中
memcpy(lpNewBits2, m_lpBits, m_lWidth * m_lHeight);
// 设置边缘模板4参数
aTemplate[0] = 2.0;
aTemplate[1] = -1.0;
aTemplate[2] = -1.0;
aTemplate[3] = -1.0;
aTemplate[4] = 2.0;
aTemplate[5] = -1.0;
aTemplate[6] = -1.0;
aTemplate[7] = -1.0;
aTemplate[8] = 2.0;
// 调用Template()函数
if (!Template(lpNewBits2, iTempH, iTempW, iTempMX, iTempMY,
aTemplate, fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst1)
*lpDst1 = *lpDst2;
}
}
// 复制经过模板运算后的图像到源图像
memcpy(m_lpBits, lpNewBits1, m_lWidth * m_lHeight);
// 释放内存
LocalUnlock(hNewBits1);
LocalFree(hNewBits1);
LocalUnlock(hNewBits2);
LocalFree(hNewBits2);
// 返回
return TRUE;
}
unsigned char CImgPro::OstuThreshold()
{
//最大类间方差法求最佳阈值
// 指向源图像的指针
LPSTR lpSrc;
//循环变量
long i;
long j;
long l;
//最佳阈值
unsigned char iThreshold;
//象素值
unsigned char pixel;
//两个类的出现概率
double fProb1;
double fProb2;
//两个类的灰度均值均值
double fAvg1;
double fAvg2;
//整副图像的灰度均值
double fAvg;
//类间方差
double fSqr;
//最大类间方差
double fMaxSqr;
//第一类灰度累计值
double iGray1;
//直方图数组
long lHistogram[256];
//归一化灰度直方图
double fHistogram[256];
//赋初值
fMaxSqr=0.0;
iThreshold=0;
fProb1=0.0;
fProb2=0.0;
fAvg=0.0;
fAvg1=0.0;
fAvg2=0.0;
iGray1=0.0;
for (i = 0; i < 256;i++)
{
lHistogram[i]=0;
fHistogram[i]=0.0;
}
//获取灰度直方图
for (i = 0;i < m_lHeight;i++)
{
for(j = 0;j fMaxSqr)
{
fMaxSqr=fSqr;
iThreshold=(unsigned char)l;
}
//变量清零
fProb1=0.0;
fProb2=0.0;
fAvg1=0.0;
fAvg2=0.0;
iGray1=0;
}
//返回阈值
return iThreshold;
}
BOOL CImgPro::PalKing(float fd,unsigned char FuzzyNum)
{
//Pal.King模糊边缘检测算法
// 指向源图像的指针
LPSTR lpSrc;
// 指向缓存图像的指针
LPSTR lpDst;
// 指向缓存位图图像的指针
LPSTR lpNewBits;
HLOCAL hNewBits;
//模糊矩阵元素指针
double *pFuzzySet;
//模糊矩阵头指针及缓存句柄
double *lpFuzzy;
HLOCAL hFuzzy;
//循环变量
long i;
long j;
int k;
//象素值
double result;
unsigned char pixel;
unsigned char pixels[9];
//最大最小灰度级
unsigned char MaxGray=0;
//模糊矩阵元素最小值
double minfuzzy;
// 暂时分配内存,以保存新图像
hNewBits=LocalAlloc(LHND,m_lWidth*m_lHeight);
if(hNewBits==NULL)
{
//分配内存失败
return FALSE;
}
// 锁定内存
lpNewBits=(char*)LocalLock(hNewBits);
// 拷贝源图像到缓存图像中
lpDst = (char *)lpNewBits;
memcpy(lpNewBits, m_lpBits, m_lWidth * m_lHeight);
// 暂时分配内存,以保存模糊矩阵
hFuzzy=LocalAlloc(LHND,m_lWidth*m_lHeight*sizeof(double));
if(hFuzzy==NULL)
{
//分配内存失败
return FALSE;
}
// 锁定内存
lpFuzzy=(double *)LocalLock(hFuzzy);
//求最大灰度级
for(i = 0; i MaxGray)
MaxGray=pixel;
}
}
//进行G变换
for(i = 0; i 0)
{
for(i = 0; i MaxGray)
MaxGray=pixel;
}
}
//求阈值
iThreshold=OstuThreshold();
//求模糊增强表
for(i=0;i<256;i++)
{
if(i<=iThreshold)
if(iThreshold!=0)
table[i]=(unsigned char)(i*i/iThreshold);
else
table[i]=(unsigned char)0;
else
{
if(i!=MaxGray)
table[i]=(unsigned char)(MaxGray-(MaxGray-i)*(MaxGray-i)/(MaxGray-iThreshold)+0.5);
else
table[i]=(unsigned char)i;
}
}
//图象增强
while(FuzzyNum>0)
{
for(i = 0; i *lpDst1)
*lpDst1 = *lpDst2;
}
}
while((n--)>0)
{
// 复制经过第一次边缘提取的图象到缓存图象2和3
memcpy(lpNewBmpBits2, lpNewBmpBits1, m_lWidth * m_lHeight);
memcpy(lpNewBmpBits3, lpNewBmpBits1, m_lWidth * m_lHeight);
// 设置Sobel模板参数
aTemplate[0] = -1.0;
aTemplate[1] = -2.0;
aTemplate[2] = -1.0;
aTemplate[3] = 0.0;
aTemplate[4] = 0.0;
aTemplate[5] = 0.0;
aTemplate[6] = 1.0;
aTemplate[7] = 2.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBmpBits2,iTempH,iTempW,iTempMX,iTempMY,
aTemplate,fTempC))
{
return FALSE;
}
// 设置Sobel模板参数
aTemplate[0] = -1.0;
aTemplate[1] = 0.0;
aTemplate[2] = 1.0;
aTemplate[3] = -2.0;
aTemplate[4] = 0.0;
aTemplate[5] = 2.0;
aTemplate[6] = -1.0;
aTemplate[7] = 0.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBmpBits3,iTempH,iTempW,
iTempMX,iTempMY,aTemplate,fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst2)
*lpDst2 = *lpDst3;
}
}
//求两次边缘检测结果的差
for(j = 0; j 0)
{
// 复制经过第一次边缘提取的图象到缓存图象2和3
memcpy(lpNewBmpBits2, lpNewBmpBits1, m_lWidth * m_lHeight);
memcpy(lpNewBmpBits3, lpNewBmpBits1, m_lWidth * m_lHeight);
// 设置Sobel模板参数
aTemplate[0] = -1.0;
aTemplate[1] = -2.0;
aTemplate[2] = -1.0;
aTemplate[3] = 0.0;
aTemplate[4] = 0.0;
aTemplate[5] = 0.0;
aTemplate[6] = 1.0;
aTemplate[7] = 2.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBmpBits2,iTempH,iTempW,iTempMX,iTempMY,
aTemplate,fTempC))
{
return FALSE;
}
// 设置Sobel模板参数
aTemplate[0] = -1.0;
aTemplate[1] = 0.0;
aTemplate[2] = 1.0;
aTemplate[3] = -2.0;
aTemplate[4] = 0.0;
aTemplate[5] = 2.0;
aTemplate[6] = -1.0;
aTemplate[7] = 0.0;
aTemplate[8] = 1.0;
// 调用Template()函数
if (!Template(lpNewBmpBits3,iTempH,iTempW,
iTempMX,iTempMY,aTemplate,fTempC))
{
return FALSE;
}
//求两幅缓存图像的最大值
for(j = 0; j *lpDst2)
*lpDst2 = *lpDst3;
}
}
//求两次边缘检测结果的差
for(j = 0; j fMaxEntropy)
{
//找使熵最小的iGray
fMaxEntropy=fOBEntropy;
iThreshold=(unsigned char)i;
}
fLowProb=0.0;
fLowEntropy=0.0;
}
//返回阈值
return iThreshold;
}
unsigned char CImgPro::NormalThreshold()
{
// 指向源图像的指针
LPSTR lpSrc;
//像素值
unsigned char pixel;
//循环变量
long i;
long j;
long k;
long m;
double minf;
double q[256],f[256];
//阈值
unsigned char T;
//直方图数组
long h[256];
for (i = 0; i < 256;i++)
{
h[i]=0;
f[i]=0.0;
q[i]=0.0;
}
//求灰度直方图
for (i = 0;i f[j])
{
minf=f[j];
T=(unsigned char)j;
}
}
return T;
}
unsigned char CImgPro::EqualityThreshold()
{
// 指向源图像的指针
LPSTR lpSrc;
//像素值
unsigned char pixel;
int i,j,k;
unsigned char T2;
long h[256];
double f[256];
double minf;
T2=0;
minf=0.0;
for (i = 0; i < 256;i++)
{
h[i]=0;
f[i]=0.0;
}
//求灰度直方图
for (i = 0;i f[j])
{
minf=f[i];
f[i]=f[j];
f[j]=minf;
T2=(unsigned char)j;
}
}
return T2;
}
unsigned char CImgPro::ImprovedThreshold()
{
// 指向源图像的指针
LPSTR lpSrc;
//像素值
unsigned char pixel;
//直方图数组
float lHistogram[256];
long i,j,k;
unsigned char maxt;
double maxf,HT;
double p[256],f[256];
for (i = 0; i < 256;i++)
{
lHistogram[i]=0.0;
f[i]=0.0;
}
//求灰度直方图
for (i = 0;i