📄 dibapi.cpp
字号:
*lpSrc=(unsigned char)(fTemp+0.5);
}
}
}
return TRUE;
}
*/
BOOL WINAPI Laplacian(LPSTR lpDIBBits, LONG lmageWidth, LONG lmageHeight)
{
int nTempWidth; //模板的宽度
int nTempHeight; // 模板的高度
int nTempCenX; //模板中心的X坐标(相对于模板)
int nTempCenY; //模板中心的Y坐标(相对于模板)
double* Tempdata; //模板数组的指针
double TempCoef; //模板系数
//循环变量
int i;
int j;
//Sobel算子
// 指向缓存图像的指针
unsigned char* lpDst1;
unsigned char* lpDst2;
// 指向存贮图像的指针
LPBYTE lpImage1;
LPBYTE lpImage2;
// 暂时分配内存,以保存新图像
lpImage1 = (LPBYTE) new char[lmageWidth*lmageHeight];
lpImage2 = (LPBYTE) new char[lmageWidth*lmageHeight];
// 判断是否内存分配失败
if (lpImage1 == NULL)
{
// 分配内存失败
return FALSE;
}
// 判断是否内存分配失败
if (lpImage2 == NULL)
{
// 分配内存失败
return FALSE;
}
// 初始化图像为原始图像
memcpy(lpImage1, lpDIBBits, lmageWidth*lmageHeight);
memcpy(lpImage2, lpDIBBits, lmageWidth*lmageHeight);
lpDst1 = (unsigned char*)lpImage1;
lpDst2 = (unsigned char*)lpImage2;
nTempWidth=3;
nTempHeight=3;
nTempCenX=1;
nTempCenY=1;
TempCoef=1;
Tempdata=new double[9];//Laplacian算子模板为3X3
//水平向模板参数
Tempdata[0]=-1;
Tempdata[1]=-1;
Tempdata[2]=-1;
Tempdata[3]=-1;
Tempdata[4]=8;
Tempdata[5]=-1;
Tempdata[6]=-1;
Tempdata[7]=-1;
Tempdata[8]=-1;
if (!Template((LPSTR)lpImage1, lmageWidth, lmageHeight,nTempWidth, nTempHeight,
nTempCenX, nTempCenY,Tempdata, TempCoef))
{
return FALSE;
}
delete[] Tempdata;
//求两幅缓存图像的最大值
for(j = 0; j <lmageHeight; j++)
{
for(i = 0;i <lmageWidth; i++)
{
// 指向缓存图像1倒数第j行,第i个象素的指针
lpDst1 = (unsigned char*)lpImage1 + lmageWidth * j + i;
// 指向缓存图像2倒数第j行,第i个象素的指针
lpDst2 = (unsigned char*)lpImage2 + lmageWidth * j + i;
if(*lpDst2 > *lpDst1)
{
*lpDst1 = *lpDst2;
}
}
}
//复制经过模板运算后的图像到源图像
memcpy(lpDIBBits, lpImage1,lmageWidth*lmageHeight);
return TRUE;
}
BOOL WINAPI Sobel(LPSTR lpDIBBits, LONG lmageWidth, LONG lmageHeight)
{
int nTempWidth; //模板的宽度
int nTempHeight; // 模板的高度
int nTempCenX; //模板中心的X坐标(相对于模板)
int nTempCenY; //模板中心的Y坐标(相对于模板)
double* Tempdata; //模板数组的指针
double TempCoef; //模板系数
//循环变量
int i;
int j;
//Sobel算子
// 指向缓存图像的指针
unsigned char* lpDst1;
unsigned char* lpDst2;
// 指向存贮图像的指针
LPBYTE lpImage1;
LPBYTE lpImage2;
// 暂时分配内存,以保存新图像
lpImage1 = (LPBYTE) new char[lmageWidth*lmageHeight];
lpImage2 = (LPBYTE) new char[lmageWidth*lmageHeight];
// 判断是否内存分配失败
if (lpImage1 == NULL)
{
// 分配内存失败
return FALSE;
}
// 判断是否内存分配失败
if (lpImage2 == NULL)
{
// 分配内存失败
return FALSE;
}
// 初始化图像为原始图像
memcpy(lpImage1, lpDIBBits, lmageWidth*lmageHeight);
memcpy(lpImage2, lpDIBBits, lmageWidth*lmageHeight);
lpDst1 = (unsigned char*)lpImage1;
lpDst2 = (unsigned char*)lpImage2;
//Sobel算子水平检测模板参数
nTempWidth=3;
nTempHeight=3;
nTempCenX=1;
nTempCenY=1;
TempCoef=1;
Tempdata=new double[9];//Sobel算子模板为3X3
//水平向模板参数
Tempdata[0]=-1;
Tempdata[1]=-2;
Tempdata[2]=-1;
Tempdata[3]=0;
Tempdata[4]=0;
Tempdata[5]=0;
Tempdata[6]=1;
Tempdata[7]=2;
Tempdata[8]=1;
if (!Template((LPSTR)lpImage1, lmageWidth, lmageHeight,nTempWidth, nTempHeight,
nTempCenX, nTempCenY,Tempdata, TempCoef))
{
return FALSE;
}
//垂直方向模板参数
Tempdata[0]=-1;
Tempdata[1]=0;
Tempdata[2]=1;
Tempdata[3]=-2;
Tempdata[4]=0;
Tempdata[5]=2;
Tempdata[6]=-1;
Tempdata[7]=0;
Tempdata[8]=1;
if (!Template((LPSTR)lpImage2, lmageWidth, lmageHeight,nTempWidth, nTempHeight,
nTempCenX, nTempCenY,Tempdata, TempCoef))
{
return FALSE;
}
delete[] Tempdata;
//求两幅缓存图像的最大值
for(j = 0; j <lmageHeight; j++)
{
for(i = 0;i <lmageWidth; i++)
{
// 指向缓存图像1倒数第j行,第i个象素的指针
lpDst1 = (unsigned char*)lpImage1 + lmageWidth * j + i;
// 指向缓存图像2倒数第j行,第i个象素的指针
lpDst2 = (unsigned char*)lpImage2 + lmageWidth * j + i;
if(*lpDst2 > *lpDst1)
{
*lpDst1 = *lpDst2;
}
}
}
//复制经过模板运算后的图像到源图像
memcpy(lpDIBBits, lpImage1,lmageWidth*lmageHeight);
return TRUE;
}
BOOL WINAPI Prewitt(LPSTR lpDIBBits, LONG lmageWidth, LONG lmageHeight)
{
int nTempWidth; //模板的宽度
int nTempHeight; // 模板的高度
int nTempCenX; //模板中心的X坐标(相对于模板)
int nTempCenY; //模板中心的Y坐标(相对于模板)
double* Tempdata; //模板数组的指针
double TempCoef; //模板系数
//循环变量
int i;
int j;
//Sobel算子
// 指向缓存图像的指针
unsigned char* lpDst1;
unsigned char* lpDst2;
// 指向存贮图像的指针
LPBYTE lpImage1;
LPBYTE lpImage2;
// 暂时分配内存,以保存新图像
lpImage1 = (LPBYTE) new char[lmageWidth*lmageHeight];
lpImage2 = (LPBYTE) new char[lmageWidth*lmageHeight];
// 判断是否内存分配失败
if (lpImage1 == NULL)
{
// 分配内存失败
return FALSE;
}
// 判断是否内存分配失败
if (lpImage2 == NULL)
{
// 分配内存失败
return FALSE;
}
// 初始化图像为原始图像
memcpy(lpImage1, lpDIBBits, lmageWidth*lmageHeight);
memcpy(lpImage2, lpDIBBits, lmageWidth*lmageHeight);
lpDst1 = (unsigned char*)lpImage1;
lpDst2 = (unsigned char*)lpImage2;
//Sobel算子水平检测模板参数
nTempWidth=3;
nTempHeight=3;
nTempCenX=1;
nTempCenY=1;
TempCoef=1;
Tempdata=new double[9];//Sobel算子模板为3X3
//水平向模板参数
Tempdata[0]=-1;
Tempdata[1]=-1;
Tempdata[2]=-1;
Tempdata[3]=0;
Tempdata[4]=0;
Tempdata[5]=0;
Tempdata[6]=1;
Tempdata[7]=1;
Tempdata[8]=1;
if (!Template((LPSTR)lpImage1, lmageWidth, lmageHeight,nTempWidth, nTempHeight,
nTempCenX, nTempCenY,Tempdata, TempCoef))
{
return FALSE;
}
//垂直方向模板参数
Tempdata[0]=-1;
Tempdata[1]=0;
Tempdata[2]=1;
Tempdata[3]=-1;
Tempdata[4]=0;
Tempdata[5]=1;
Tempdata[6]=-1;
Tempdata[7]=0;
Tempdata[8]=1;
if (!Template((LPSTR)lpImage2, lmageWidth, lmageHeight,nTempWidth, nTempHeight,
nTempCenX, nTempCenY,Tempdata, TempCoef))
{
return FALSE;
}
delete[] Tempdata;
//求两幅缓存图像的最大值
for(j = 0; j <lmageHeight; j++)
{
for(i = 0;i <lmageWidth; i++)
{
// 指向缓存图像1倒数第j行,第i个象素的指针
lpDst1 = (unsigned char*)lpImage1 + lmageWidth * j + i;
// 指向缓存图像2倒数第j行,第i个象素的指针
lpDst2 = (unsigned char*)lpImage2 + lmageWidth * j + i;
if(*lpDst2 > *lpDst1)
{
*lpDst1 = *lpDst2;
}
}
}
//复制经过模板运算后的图像到源图像
memcpy(lpDIBBits, lpImage1,lmageWidth*lmageHeight);
return TRUE;
}
/* BOOL WINAPI Laplacian(LPSTR lpDIBBits,LONG lWidth,LONG lHeight)
{
int i;
int j;
unsigned char* lpSrc2,*lpSrc4,*lpSrc6,*lpSrc8,*lpSrc;
LONG lLineBytes;
LONG fTemp;
LONG fBiex=20;
lLineBytes=WIDTHBYTES(lWidth*8);
for(i=0;i<lHeight-1;i++)
{
for(j=0;j<lWidth-1;j++)
{
lpSrc=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
if((i>0) || ((i+1)<lHeight) || (j>0) || ((j+1)<lWidth))
{
lpSrc8=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i+1))+j;
lpSrc6=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j+1;
lpSrc4=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j-1;
lpSrc2=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i-1))+j;
fTemp=abs(4*(int)(*lpSrc)-(int)(*lpSrc2))-abs((int)(*lpSrc4)-(int)(*lpSrc6)-(int)(*lpSrc8));
}else
fTemp=(LONG)lpSrc;
if(fTemp>255)
{
*lpSrc=255;
}
else if(fTemp<0)
{
*lpSrc=0;
}
else
{
*lpSrc=(unsigned char)(fTemp+0.5);
}
}
}
return TRUE;
}
*/
BOOL WINAPI Roberts(LPSTR lpDIBBits,LONG lWidth,LONG lHeight)
{
int i;
int j;
unsigned char* lpSrc1,*lpSrc2,*lpSrc3,*lpSrc;
LONG lLineBytes;
LONG fTemp;
LONG fBiex=20;
lLineBytes=WIDTHBYTES(lWidth*8);
for(i=0;i<lHeight-1;i++)
{
for(j=0;j<lWidth-1;j++)
{
lpSrc=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
if((i>0) || ((i+1)<lHeight) || (j>0) || ((j+1)<lWidth))
{
lpSrc3=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i+1))+j+1;
lpSrc2=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i+1))+j;
lpSrc1=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j+1;
// fTempx=abs(-1*(int)(*lpSrc1)+1*(int)(*lpSrc3)-2*(int)(*lpSrc4)+2*(int)(*lpSrc6)-1*(int)(*lpSrc7)+1*(int)(*lpSrc9));
//fTempy=abs(-1*(int)(*lpSrc7)+1*(int)(*lpSrc1)-2*(int)(*lpSrc8)+2*(int)(*lpSrc2)-1*(int)(*lpSrc9)+1*(int)(*lpSrc3));
// fTemp=(LONG)(fTempx+fTempy);
fTemp=abs((int)(*lpSrc)-(int)(*lpSrc3))+abs((int)(*lpSrc2)-(int)(*lpSrc1));
}else
fTemp=(LONG)lpSrc;
if(fTemp>255)
{
*lpSrc=255;
}
else if(fTemp<0)
{
*lpSrc=0;
}
else
{
*lpSrc=(unsigned char)(fTemp+0.5);
}
}
}
return TRUE;
}
/*************************************************************************
* \函数名称:
* Template()
* \输入参数:
* LPSTR lpDIBBits - 指向源图像的像素指针
* LONG lmageWidth - 源图像的宽度
* LONG lmageHeight - 源图像的高度
* int nTempWidth - 模板的宽度
* int nTempHeight - 模板的高度
* int nTempCenX - 模板中心的X坐标(相对于模板)
* int nTempCenY - 模板中心的Y坐标(相对于模板)
* double* Tempdata - 模板数组的指针
* double* TempCoef - 模板的系数
* \返回值:
* BOOL - 成功则返回TRUE,否则返回FALSE
* \说明:
* 该函数用指定的模板对lpDIBBits指向的图象进行模板操作。模板的定义了宽度,高度,中心坐标
*和系数,模板的数据存放在Tempdata中。对图象进行模板操作后,仍然存放在lpDIBBits指向的对象
*中。需要注意的是,该函数只能处理8位的图象,否则,指向的数据将出错。
**************************************************************************/
BOOL Template(LPSTR lpDIBBits, LONG lmageWidth, LONG lmageHeight,
int nTempWidth, int nTempHeight,
int nTempCenX, int nTempCenY,
double* Tempdata, double TempCoef)
{
LPBYTE lpImage; // 临时存放图像数据的指针
int i; // 循环变量
int j; // 循环变量
int k; // 循环变量
int l; // 循环变量
unsigned char* lpSrc; // 指向源图像的指针
unsigned char* lpDst; // 指向要复制区域的指针
double dbResult; // 计算结果
lpImage = (LPBYTE) new char[lmageWidth*lmageHeight]; // 分配内存
if (lpImage == NULL) // 判断是否内存分配失败
{
return FALSE; // 分配内存失败
}
// 将原始图像的数据拷贝到临时存放内存中
memcpy(lpImage, lpDIBBits, lmageWidth*lmageHeight);
// 进行模板计算,行(除去边缘几行)
for(i = nTempCenY ; i <lmageHeight - nTempHeight + nTempCenY + 1; i++)
{
// 列(除去边缘几列)
for(j = nTempCenX; j < lmageWidth - nTempWidth + nTempCenX + 1; j++)
{
// 指向新DIB第i行,第j个象素的指针
lpDst = (unsigned char*)lpImage + lmageWidth * (lmageHeight - 1 - i) + j;
dbResult = 0; // 置0
for (k = 0; k < nTempHeight; k++)
{
for (l = 0; l < nTempWidth; l++)
{
// 指向DIB第i - iFilterMY + k行,第j - iFilterMX + l个象素的指针
lpSrc = (unsigned char*)lpDIBBits + lmageWidth * (lmageHeight - 1 - i + nTempCenY - k) + j - nTempCenX + l;
dbResult += (* lpSrc) * Tempdata[k * nTempWidth + l]; // 保存象素值
}
}
dbResult *= TempCoef; // 乘上系数
dbResult = (double ) fabs(dbResult); // 取绝对值
if(dbResult > 255) // 判断是否超过255
{
* lpDst = 255; // 直接赋值为255
}
else
{
* lpDst = (unsigned char) (dbResult + 0.5); // 赋值
}
}
}
memcpy(lpDIBBits, lpImage, lmageWidth*lmageHeight); //复制变换后的图像
delete[] lpImage; // 释放内存
return TRUE; // 返回
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -