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

📄 tiduruihuadib.cpp

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

}
TiDuRuiHuaDib::~TiDuRuiHuaDib()
{

}

///***************************************************************/           
/*函数名称:Menxianruihua()                                        
/*函数类型:void                                   
/*功能:对图像进行门限梯度锐化。            
/*****************************************************************/ 
void TiDuRuiHuaDib::Menxianruihua()
{
    LPBYTE p_data;     //原图数据区指针
	int wide,height;    //原图长、宽
	p_data=this->GetData ();
    wide=this->GetWidth ();
    height=this->GetHeight ();
	if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{		
        LPBYTE p_temp=new BYTE [wide*height];    //开辟图像一缓冲区
		memset(p_temp,255,wide*height);  //初始化为255
		int temp;
		for(int j=1;j<height-1;j++)
		for(int i=1;i<wide-1;i++)
		{
			//根据双向一次微分公式计算当前像素的灰度值
			temp=(int)sqrt((p_data[wide*j+i]-p_data[wide*j+(i-1)])*
				(p_data[wide*j+i]-p_data[wide*j+(i-1)])+(p_data[wide*j+i]-p_data[wide*(j-1)+i])*
				(p_data[wide*j+i]-p_data[wide*(j-1)+i]));
			if (temp>=30)
			{   
				if((temp+100)>255)
					p_temp[wide*j+i]=255;
				else 
					p_temp[wide*j+i]=temp+100;
			}
			if (temp<30)
				p_temp[wide*j+i]=p_data[wide*j+i];
		}
		//将缓冲区中的图像复制回原图数据区
		memcpy(p_data,p_temp,wide*height);
		//删除缓冲区
		delete p_temp;
	}
	else	//24位彩色
	{	
		int DibWidth;    //原图长、宽、字节宽	
		DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
        BYTE *p_temp=new BYTE[height*DibWidth];
		for(int j=1;j<height-1;j++)	// 每行
		{
			for(int i=3;i<DibWidth-3;i++)	// 每列
			{
				int pby_pt1=0,pby_pt2=0,pby_pt=0;	
				pby_pt1=p_data[DibWidth*j+i]-p_data[DibWidth*j+(i-3)];
				pby_pt2=p_data[DibWidth*j+i]-p_data[DibWidth*(j-1)+i];
				pby_pt=(int)sqrt(pby_pt1*pby_pt1+pby_pt2*pby_pt2);
				if (pby_pt>=30)
				{	 
					if((pby_pt+100)>255)
						p_temp[DibWidth*j+i]=255;
					else 
						p_temp[DibWidth*j+i]=pby_pt+100;
				}
				if (pby_pt<30)
					p_temp[DibWidth*j+i]=p_data[DibWidth*j+i];
			}
		}
		memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
		delete []p_temp;  //删除暂时分配内存
	}
}

///***************************************************************/           
/*函数名称:Erzhirihua()                                      
/*函数类型:void                                   
/*功能: 根据梯度二值化图像。            
/***************************************************************/ 
void TiDuRuiHuaDib::Erzhirihua()
{
	LPBYTE  p_data;     //原图数据区指针
	int wide,height;    //原图长、宽
	p_data=this->GetData ();
    wide=this->GetWidth ();
    height=this->GetHeight ();
	if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{        
        LPBYTE p_temp=new BYTE [wide*height];    //开辟图像一缓冲区
		memset(p_temp,255,wide*height);  //初始化为255
		int temp;
		for(int j=1;j<height-1;j++)
			for(int i=1;i<wide-1;i++)
			{			
				//根据双向一次微分公式计算当前像素的灰度值
				temp=(int)sqrt((p_data[wide*j+i]-p_data[wide*j+(i-1)])*(p_data[wide*j+i]-p_data[wide*j+(i-1)])+(p_data[wide*j+i]-p_data[wide*(j-1)+i])*(p_data[wide*j+i]-p_data[wide*(j-1)+i]));
                if (temp>30)
				{   
					p_temp[wide*j+i]=255;					 
				}
				else 
					p_temp[wide*j+i]=0;
			}
		//将缓冲区中的图像复制回原图数据区
		memcpy(p_data,p_temp,wide*height);
		//删除缓冲区
		delete p_temp;
	}	
	else	//24位彩色
	{	
	    int DibWidth;    //原图长、宽、字节宽	
	    DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
        BYTE *p_temp=new BYTE[height*DibWidth];
		for(int j=1;j<height-1;j++)	// 每行
		{
			for(int i=3;i<DibWidth-3;i++)	// 每列
			{
				int pby_pt1=0,pby_pt2=0,pby_pt=0;	
				pby_pt1=*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-1)*DibWidth+i-3);
				pby_pt2=*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j)*DibWidth+i);
				pby_pt=(int)sqrt(pby_pt1*pby_pt1+pby_pt2*pby_pt2);
                if (pby_pt>30)
				{   
					*(p_temp+(height-j-1)*DibWidth+i)=255;					 
				}
				else 
					*(p_temp+(height-j-1)*DibWidth+i)=0;
			}
		}
        memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
        delete []p_temp;  //删除暂时分配内存
	}
}

///***************************************************************/           
/*函数名称:GuDingRuiHua()                                       
/*函数类型:void                                   
/*功能:给边缘规定一个特定的灰度级。            
/***************************************************************/ 
void TiDuRuiHuaDib::GuDingRuiHua()
{
	LPBYTE p_data;     //原图数据区指针
	int wide,height;    //原图长、宽 	
	p_data=this->GetData ();
    wide=this->GetWidth ();
    height=this->GetHeight ();
	if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{     
        LPBYTE p_temp=new BYTE [wide*height];    //开辟图像一缓冲区
		memset(p_temp,255,wide*height);  //初始化为255
		int temp;
		for(int j=1;j<height-1;j++)
		    for(int i=1;i<wide-1;i++)
			{
				//根据双向一次微分公式计算当前像素的灰度值
				temp=(int)sqrt((p_data[wide*j+i]-p_data[wide*j+(i-1)])*(p_data[wide*j+i]-p_data[wide*j+(i-1)])+(p_data[wide*j+i]-p_data[wide*(j-1)+i])*(p_data[wide*j+i]-p_data[wide*(j-1)+i]));
                if (temp>30)
				{   
                   p_temp[wide*j+i]=255;
				}
				else 
					p_temp[wide*j+i]=p_data[wide*j+i];
			}
		//将缓冲区中的图像复制回原图数据区
		memcpy(p_data,p_temp,wide*height);
		//删除缓冲区
		delete p_temp;
	}
	else	//24位彩色
	{	    
	    int DibWidth;    //原图长、宽、字节宽	
	    DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
        BYTE *p_temp=new BYTE[height*DibWidth];
	    for(int j=1;j<height-1;j++)	// 每行
		{
			for(int i=3;i<DibWidth-3;i++)	// 每列
			{
				int pby_pt1=0,pby_pt2=0,pby_pt=0;	
				pby_pt1=*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-1)*DibWidth+i-3);
				pby_pt2=*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j)*DibWidth+i);
				pby_pt=(int)sqrt(pby_pt1*pby_pt1+pby_pt2*pby_pt2);
				if (pby_pt>30)
				{   
					*(p_temp+(height-j-1)*DibWidth+i)=255;
				}
				else 
					*(p_temp+(height-j-1)*DibWidth+i)=*(p_data+(height-j-1)*DibWidth+i);
			}
		}
        memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
        delete []p_temp;  //删除暂时分配内存
	}
}

⌨️ 快捷键说明

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