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

📄 weifendib.cpp

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

WeiFenDib::WeiFenDib()
{
}

WeiFenDib::~WeiFenDib()
{
}

/***************************************************************/           
/*函数名称:ZongXiang()                                        */
/*函数类型:void                                               */
/*返回值:处理成功返回TRUE;处理失败返回FALSE。                 */                                       
/*功能:对图像进行纵向微分                                     */
/***************************************************************/
void WeiFenDib::ZongXiang()
{    
    BYTE  *p_data;     //原图数据区指针
	int wide,height;    //原图长、宽	
	p_data=this->GetData ();
    wide=this->GetWidth ();
    height=this->GetHeight ();
	if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{	    
        LPBYTE   temp=new BYTE [wide*height];    //开辟图像一缓冲区
		memset(temp,255,wide*height);
		for(int j=1;j<height-1;j++)
			for(int i=1;i<wide-1;i++)
				//当前像素的灰度值等于其和左方像素灰度值之差的绝对值
				temp[wide*j+i]=abs(p_data[wide*j+i]-p_data[wide*j+(i-1)]);
		//将缓冲区中的图像复制回原图数据区
		memcpy(p_data, temp,wide*height);
		//删除缓冲区
		delete  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_pt=0;
				pby_pt=*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-1)*DibWidth+i-3);
                *(p_temp+(height-j-1)*DibWidth+i)=abs(pby_pt);
			}
		}
		memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
        delete []p_temp;  //删除暂时分配内存
	}    
}

/***************************************************************/           
/*函数名称:HengXiang()                                        */
/*函数类型:void                                               */
/*返回值:处理成功返回TRUE;处理失败返回FALSE。                 */                                       
/*功能:对图像进行横向微分                                     */
/***************************************************************/
void WeiFenDib::HengXiang()
{
    LPBYTE p_data;     //原图数据区指针
    int wide,height;    //原图长、宽	
	p_data=this->GetData ();
    wide=this->GetWidth ();
    height=this->GetHeight ();
	if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{	    
        LPBYTE  temp=new BYTE [wide*height];    //开辟图像一缓冲区
		memset(temp,255,wide*height);
		for(int j=1;j<height-1;j++)
		    for(int i=1;i<wide-1;i++)
				//当前像素的灰度值等于其和上方像素灰度值之差的绝对值
				temp[wide*j+i]=abs(p_data[wide*j+i]-p_data[wide*(j-1)+i]);
        //将缓冲区中的图像复制回原图数据区
		memcpy(p_data, temp,wide*height);
		//删除缓冲区
		delete  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_pt=0;
				pby_pt=*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j)*DibWidth+i);
                *(p_temp+(height-j-1)*DibWidth+i)=abs(pby_pt);
			}
		}
		memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
        delete []p_temp;  //删除暂时分配内存
	}    
}

/***************************************************************/           
/*函数名称:ShuangXiang()                                      */
/*函数类型:void                                               */
/*返回值:处理成功返回TRUE;处理失败返回FALSE。                 */                                       
/*功能:对图像进行双向一次微分                                 */
/***************************************************************/
void WeiFenDib::ShuangXiang()
{
    LPBYTE  p_data;     //原图数据区指针
	int wide,height;    //原图长、宽 	
	p_data=this->GetData ();
    wide=this->GetWidth ();
    height=this->GetHeight ();
	if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{	    
        LPBYTE temp=new BYTE [wide*height];    //开辟图像一缓冲区
		memset(temp,255,wide*height);
		for(int j=1;j<height-1;j++)
			for(int i=1;i<wide-1;i++)
				//根据双向一次微分公式计算当前像素的灰度值
				temp[wide*j+i]=(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]));
        //将缓冲区中的图像复制回原图数据区
		memcpy(p_data, temp,wide*height);
		//删除缓冲区
		delete  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_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);
                *(p_temp+(height-j-1)*DibWidth+i)=(int)sqrt(pby_pt1*pby_pt1+pby_pt2*pby_pt2);
			}
		}
		memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
        delete []p_temp;  //删除暂时分配内存
	}	
}

/***************************************************************/           
/*函数名称:ErCi1()                                            */
/*函数类型:void                                               */
/*返回值:处理成功返回TRUE;处理失败返回FALSE。                 */                                       
/*功能:对图像进行二次微分                                     */
/*算子如下:       +1  -2  +1                                  */
/*                 -2  +4  -2                                  */
/*                 +1  -2  +1                                  */
/*                                                             */
/***************************************************************/
void WeiFenDib::ErCi1()
{
    LPBYTE p_data;     //原图数据区指针
	int wide,height;    //原图长、宽	
	p_data=this->GetData ();
    wide=this->GetWidth ();
    height=this->GetHeight ();
	if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{	    
        LPBYTE   temp=new BYTE [wide*height];    //开辟图像一缓冲区
		memset(temp,255,wide*height);   //初始化为255
		for(int j=1;j<height-1;j++)
		    for(int i=1;i<wide-1;i++)

⌨️ 快捷键说明

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