⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bianyuanjiancedib.cpp

📁 VC++图像处理程程序设计配套光盘的第六章锐化处理及边缘检测程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "windowsx.h"
#include "math.h"
#include "BianYuanJianCeDib.h"
#include "MainFrm.h"
#include "DynSplitView2.h"
 
BianYuanJianCeDib::BianYuanJianCeDib()
{
  
}
BianYuanJianCeDib::~BianYuanJianCeDib()
{
}

/***************************************************************/
/*函数名称:Templat(BYTE *m_pdata, int wide, int height, int tempH, int tempW, int tempMX, int tempMY, float *fpArray, float fCoef)                                         */
/*函数类型:void                                               */
/*参数:BYTE* m_pdata:指向原DIB图像指针                        */
/*      int wide:原图像宽度                                    */
/*      int height:原图像高度                                  */
/*      int tempH:模板高度                                     */
/*      int tempW:模板宽度                                     */
/*      int tempMX:模板的中心元素X坐标(<tempW-1)               */
/*      int tempMY:模板的中心元素Y坐标(<tempH-1)               */
/*      float *fpArray:指向模板数组的指针                      */
/*      float fCoef:模板系数                                  */
/*返回值:处理成功返回TRUE;处理失败返回FALSE。                 */
/*功能:用指定模板对灰度图像进行操作。                         */
/***************************************************************/
void BianYuanJianCeDib::Templat(BYTE *m_pdata, int wide, int height, int tempH, int tempW, int tempMX, int tempMY, float *fpArray, float fCoef)
{   
	int i,j,k,l;  //循环变量
    BYTE*  temp=new BYTE[wide*height];    //新图像缓冲区
	//初始化新图像为原始图像
    memcpy( temp,m_pdata,wide*height);
    float fResult;    //像素值计算结果
	for(j=tempMY;j<height-tempH+tempMY+1;j++)
		for(i=tempMX;i<wide-tempW+tempMX+1;i++)
		{
			//计算像素值
			fResult=0;
			for(k=0;k<tempH;k++)
				for(l=0;l<tempW;l++)
					fResult=fResult+m_pdata[(j-tempMY+k)*wide+(i-tempMX+l)]*fpArray[k*tempW+l];
			//乘上系数
			fResult*=fCoef;
			//取绝对值
			fResult=(float)fabs(fResult);
			//判断是否超过255
			if(fResult>255)
				//若超过255,直接赋值为255
                temp[j*wide+i]=255;
			else
				//未超过255,赋值为计算结果
				temp[j*wide+i]=(int)(fResult+0.5);
		}
    memcpy(m_pdata, temp,wide*height);   //复制处理后的图像
	delete  temp;
}

/***************************************************************/
/*函数名称:Templat24bit(BYTE *m_pdata, int DibWidth, int height, int tempH, int tempW, int tempMX, int tempMY, float *fpArray, float fCoef)                                         */
/*函数类型:void                                               */
/*参数:BYTE* m_pdata:指向原DIB图像指针                        */
/*      int DibWidth:原图像宽度                                */
/*      int height:原图像高度                                  */
/*      int tempH:模板高度                                     */
/*      int tempW:模板宽度                                     */
/*      int tempMX:模板的中心元素X坐标(<tempW-1)               */
/*      int tempMY:模板的中心元素Y坐标(<tempH-1)               */
/*      float *fpArray:指向模板数组的指针                      */
/*      float fCoef:模板系数                                  */
/*返回值:处理成功返回TRUE;处理失败返回FALSE。                 */
/*功能:用指定模板对24位彩色图像进行操作。                     */
/***************************************************************/
void BianYuanJianCeDib::Templat24bit(BYTE *m_pdata, int DibWidth, int height, int tempH, int tempW, int tempMX, int tempMY, float *fpArray, float fCoef)
{
    int i,j,k,l;  //循环变量
    BYTE*  p_temp=new BYTE[DibWidth*height];    //新图像缓冲区
	//初始化新图像为原始图像
    memcpy( p_temp,m_pdata,DibWidth*height);
    float fResult;    //像素值计算结果
	for(j=tempMY;j<height-tempH+tempMY+1;j++)
		for(i=3*tempMX;i<DibWidth-3*tempW+3*tempMX+1;i++)
		{
			//计算像素值
			fResult=0;
			for(k=0;k<tempH;k++)
				for(l=0;l<tempW;l++)
					fResult=fResult+m_pdata[(j-tempMY+k)*DibWidth+(i-3*tempMX+l*3)]*fpArray[k*tempW+l];
			//乘上系数
			fResult*=fCoef;
			//取绝对值
			fResult=(float)fabs(fResult);
			//判断是否超过255
			if(fResult>255)
				//若超过255,直接赋值为255
                p_temp[j*DibWidth+i]=255;
			else
				//未超过255,赋值为计算结果
				p_temp[j*DibWidth+i]=(int)(fResult+0.5);
		}
    memcpy(m_pdata, p_temp,DibWidth*height);   //复制处理后的图像
	delete  []p_temp;
}

///***************************************************************/           
/*函数名称:Robert()                                      
/*函数类型:void                                     
/*功能:用罗伯特算子对图像进行边缘检测。            
/***************************************************************/ 
void BianYuanJianCeDib::Robert()
{    
	LPBYTE  p_data;     //原图数据区指针
	int wide,height,DibWidth;    //原图长、宽
	p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
	DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
	int i,j;  //循环变量
    if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{
	    int pixel[4];   //Robert算子
		LPBYTE   temp=new BYTE[wide*height];    //新图像缓冲区
 	    memset(temp,255,wide*height);  //设定新图像初值为255
	    //由于使用2*2的模板,为防止越界,所以不处理最下边和最右边的两列像素
	    for(j=0;j<height-1;j++)
		    for(i=0;i<wide-1;i++)
			{
		        //生成Robert算子
				pixel[0]=p_data[j*wide+i];
                pixel[1]=p_data[j*wide+i+1];
				pixel[2]=p_data[(j+1)*wide+i];
				pixel[3]=p_data[(j+1)*wide+i+1];
				//处理当前像素
				 temp[j*wide+i]=(int)sqrt((pixel[0]-pixel[3])*(pixel[0]-pixel[3])+(pixel[1]-pixel[2])*(pixel[1]-pixel[2]));
			}
		//将缓冲区中的数据复制到原图数据区
		memcpy(p_data, temp,wide*height);
		//删除缓冲区
		delete  temp;
	}
  else		//24位彩色
  {
	 int pixel[4];   //Robert算子
     BYTE *p_temp=new BYTE[height*DibWidth];

	 for(j=0;j<height-1;j++)
		for(i=0;i<DibWidth-3;i++)
		{
			//生成Robert算子
			pixel[0]=p_data[j*DibWidth+i];
            pixel[1]=p_data[j*DibWidth+i+3];
			pixel[2]=p_data[(j+1)*DibWidth+i];
			pixel[3]=p_data[(j+1)*DibWidth+i+3];
			//处理当前像素
			p_temp[j*DibWidth+i]=(int)sqrt((pixel[0]-pixel[3])*(pixel[0]-pixel[3])+(pixel[1]-pixel[2])*(pixel[1]-pixel[2]));
		}
     memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
     delete []p_temp;  //删除暂时分配内存  
  }
}
 
///***************************************************************/           
/*函数名称:PreWitt()                                      
/*函数类型:void                                     
/*功能:用普瑞维特算子对图像进行边缘检测。            
/***************************************************************/
void BianYuanJianCeDib::PreWitt()
{
	int tempH;  //模板高度
	int tempW;  //模板宽度
	float tempC;  //模板系数
	int tempMY;   //模板中心元素Y坐标
	int tempMX;   //模板中心元素X坐标
	float Template[9];   //模板数组	
	LPBYTE  p_data;     //原图数据区指针
	int wide,height;    //原图长、宽
	p_data=this->GetData ();
    wide=this->GetWidth ();
    height=this->GetHeight ();
	if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{	
		LPBYTE   temp1=new BYTE[wide*height];    //新图像缓冲区
        LPBYTE   temp2=new BYTE[wide*height];    //新图像缓冲区
        //拷贝原图像到缓存图像
		memcpy( temp1,p_data,wide*height);
        memcpy( temp2,p_data,wide*height);
	 	//设置Prewitt模板1参数
		tempW=3;
		tempH=3;
		tempC=1.0;
		tempMY=1;
		tempMX=1;
		Template[0]=-1.0;
        Template[1]=-1.0;
		Template[2]=-1.0;
		Template[3]=0.0;
		Template[4]=0.0;
		Template[5]=0.0;
		Template[6]=1.0;
		Template[7]=1.0;
		Template[8]=1.0;
		//调用Templat()函数
		Templat( temp1,wide,height,tempH,tempW,tempMX,tempMY,Template,tempC);
        //设置Prewitt模板2参数
        Template[0]=1.0;
        Template[1]=0.0;
		Template[2]=-1.0;
		Template[3]=1.0;
		Template[4]=0.0;
		Template[5]=-1.0;
		Template[6]=1.0;
		Template[7]=0.0;
		Template[8]=-1.0;
		//调用Templat()函数
		Templat( temp2,wide,height,tempH,tempW,tempMX,tempMY,Template,tempC);
		//求两幅缓存图像的最大值
		for(int j=0;j<height;j++)
			for(int i=0;i<wide;i++)
				if( temp2[j*wide+i]> temp1[j*wide+i])
					 temp1[j*wide+i]= temp2[j*wide+i];
        memcpy(p_data, temp1,wide*height);   //复制处理后的图像
		delete  temp1;
		delete  temp2;
	}
	else	//24位彩色
	{	    
	    int DibWidth;    //原图长、宽    	
	    DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
        BYTE *p_temp1=new BYTE[height*DibWidth];
		BYTE *p_temp2=new BYTE[height*DibWidth];
		//将缓存中的图像复制到原图数据区
		memcpy(p_temp1,p_data,DibWidth*height);
		memcpy(p_temp2,p_data,DibWidth*height);
		//设置Prewitt模板1参数
		tempW=3;
		tempH=3;
		tempC=1.0;
		tempMY=1;
		tempMX=1;
		Template[0]=-1.0;
        Template[1]=-1.0;
		Template[2]=-1.0;
		Template[3]=0.0;
		Template[4]=0.0;
		Template[5]=0.0;
		Template[6]=1.0;
		Template[7]=1.0;
		Template[8]=1.0;
		Templat24bit( p_temp1,DibWidth,height,tempH,tempW,tempMX,tempMY,Template,tempC);
        //设置Prewitt模板2参数
        Template[0]=1.0;
        Template[1]=0.0;
		Template[2]=-1.0;
		Template[3]=1.0;
		Template[4]=0.0;
		Template[5]=-1.0;
		Template[6]=1.0;
		Template[7]=0.0;
		Template[8]=-1.0;
		Templat24bit( p_temp2,DibWidth,height,tempH,tempW,tempMX,tempMY,Template,tempC);
		//求两幅缓存图像的最大值
		for(int j=0;j<height;j++)
			for(int i=0;i<DibWidth;i++)
				if( p_temp2[j*DibWidth+i]> p_temp1[j*DibWidth+i])
					 p_temp1[j*DibWidth+i]= p_temp2[j*DibWidth+i];
	   memcpy(p_data,p_temp1,height*DibWidth);  // 复制处理后的图像
	   delete []p_temp1;  //删除暂时分配内存
	   delete []p_temp2;  //删除暂时分配内存
	}	
}

///***************************************************************/           
/*函数名称:Sobel()                                      
/*函数类型:void                                     
/*功能:用索伯尔算子对图像进行边缘检测。            
/***************************************************************/
void BianYuanJianCeDib::Sobel()
{
	int tempH;  //模板高度
	int tempW;  //模板宽度
	float tempC;  //模板系数
	int tempMY;   //模板中心元素Y坐标
	int tempMX;   //模板中心元素X坐标
	float Template[9];   //模板数组
	LPBYTE  p_data;     //原图数据区指针
    int wide,height;    //原图长、宽
	p_data=this->GetData ();
    wide=this->GetWidth ();
    height=this->GetHeight ();
	if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{        
		LPBYTE   temp1=new BYTE[wide*height];    //新图像缓冲区
        LPBYTE   temp2=new BYTE[wide*height];    //新图像缓冲区
        //拷贝原图像到缓存图像
		memcpy( temp1,p_data,wide*height);
        memcpy( temp2,p_data,wide*height);
		//设置Sobel模板参数
		tempW=3;
		tempH=3;
		tempC=1.0;
		tempMY=1;
		tempMX=1;
		Template[0]=-1.0;
        Template[1]=-2.0;
		Template[2]=-1.0;
		Template[3]=0.0;
		Template[4]=0.0;
		Template[5]=0.0;
		Template[6]=1.0;
		Template[7]=2.0;
		Template[8]=1.0;
		//调用Templat()函数
		Templat( temp1,wide,height,tempH,tempW,tempMX,tempMY,Template,tempC); 
        //设置Sobel模板参数
        Template[0]=-1.0;
        Template[1]=0.0;
		Template[2]=1.0;
		Template[3]=-2.0;
		Template[4]=0.0;
		Template[5]=2.0;
		Template[6]=-1.0;
		Template[7]=0.0;
		Template[8]=1.0;
		//调用Templat()函数
		Templat( temp2,wide,height,tempH,tempW,tempMX,tempMY,Template,tempC); 
		//求两幅缓存图像的最大值
		for(int j=0;j<height;j++)
			for(int i=0;i<wide;i++)
				if( temp2[j*wide+i]> temp1[j*wide+i])
					 temp1[j*wide+i]= temp2[j*wide+i];
        //将缓存中的图像复制到原图数据区
		memcpy(p_data, temp1,wide*height);
		//删除缓冲区
		delete  temp1;
		delete  temp2;
	}
	else	//24位彩色
	{	    
	    int DibWidth;    //原图长、宽    	
	    DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
        BYTE *p_temp1=new BYTE[height*DibWidth];
		BYTE *p_temp2=new BYTE[height*DibWidth];
		//将缓存中的图像复制到原图数据区
		memcpy(p_temp1,p_data,DibWidth*height);
		memcpy(p_temp2,p_data,DibWidth*height);
		//设置Sobel模板参数
		tempW=3;
		tempH=3;
		tempC=1.0;
		tempMY=1;
		tempMX=1;
		Template[0]=-1.0;
        Template[1]=-2.0;
		Template[2]=-1.0;
		Template[3]=0.0;
		Template[4]=0.0;
		Template[5]=0.0;
		Template[6]=1.0;
		Template[7]=2.0;
		Template[8]=1.0;
		Templat24bit( p_temp1,DibWidth,height,tempH,tempW,tempMX,tempMY,Template,tempC); 
        //设置Sobel模板参数
        Template[0]=-1.0;
        Template[1]=0.0;
		Template[2]=1.0;
		Template[3]=-2.0;
		Template[4]=0.0;
		Template[5]=2.0;
		Template[6]=-1.0;
		Template[7]=0.0;
		Template[8]=1.0;
		Templat24bit( p_temp2,DibWidth,height,tempH,tempW,tempMX,tempMY,Template,tempC); 
		//求两幅缓存图像的最大值
		for(int j=0;j<height;j++)
			for(int i=0;i<wide;i++)
				if( p_temp2[j*DibWidth+i]> p_temp1[j*DibWidth+i])
					 p_temp1[j*DibWidth+i]= p_temp2[j*DibWidth+i];
	   memcpy(p_data,p_temp1,height*DibWidth);  // 复制处理后的图像
	   delete []p_temp1;  //删除暂时分配内存
	   delete []p_temp2;  //删除暂时分配内存
	}
}

///***************************************************************/           
/*函数名称:Laplacian()                                      
/*函数类型:void                                     
/*功能:用拉普拉斯算子对图像边缘检测。            
/***************************************************************/ 
void BianYuanJianCeDib::Laplacian()
{
	int tempH;  //模板高度
	int tempW;  //模板宽度
	float tempC;  //模板系数
	int tempMY;   //模板中心元素Y坐标
	int tempMX;   //模板中心元素X坐标
	float Template[9];   //模板数组
	LPBYTE p_data;     //原图数据区指针
	int wide,height;    //原图长、宽
	p_data=this->GetData ();
    wide=this->GetWidth ();
    height=this->GetHeight ();
	if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{    
		LPBYTE   temp1=new BYTE[wide*height];    //新图像缓冲区
        //拷贝原图像到缓存图像
		memcpy( temp1,p_data,wide*height);
		//设置Laplacian模板 参数
		tempW=3;
		tempH=3;
		tempC=1.0;
		tempMY=1;
		tempMX=1;
		Template[0]=-1.0;
        Template[1]=-1.0;
		Template[2]=-1.0;
		Template[3]=-1.0;
		Template[4]=8.0;
		Template[5]=-1.0;
		Template[6]=-1.0;
		Template[7]=-1.0;
		Template[8]=-1.0;
		//调用Templat()函数
		Templat( temp1,wide,height,tempH,tempW,tempMX,tempMY,Template,tempC);
        memcpy(p_data, temp1,wide*height);   //复制处理后的图像
		delete  temp1;
	}
	else	//24位彩色
	{    
	    int DibWidth;    //原图长、宽    	
	    DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
        BYTE *p_temp1=new BYTE[height*DibWidth];
		//将缓存中的图像复制到原图数据区
		memcpy(p_temp1,p_data,DibWidth*height);
		//设置Laplacian模板 参数
		tempW=3;
		tempH=3;
		tempC=1.0;
		tempMY=1;
		tempMX=1;
		Template[0]=-1.0;
        Template[1]=-1.0;
		Template[2]=-1.0;
		Template[3]=-1.0;
		Template[4]=8.0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -