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

📄 convolutionfilter.cpp

📁 visual c++数字图像与图形处理中的光盘内容
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////////
//
//	ConvolutionFilter.cpp: implementation of the CConvolutionFilter class.
//
////////////////////////////////////////////////////////////////////////////////
// 版权所有(2000)
// Copyright(2000)
// 编写者: 向世明
// Author: Xiang Shiming


//统一的卷积处理类

#include "stdafx.h"
#include "ConvolutionFilter.h"

 
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CConvolutionFilter, CImageAreaProcess)
CConvolutionFilter::CConvolutionFilter()
{
	//缺省情况为自定义卷积核
	m_dwOperation = IMAGE_GENERAL_CONVOLUTION_FILTER;
	m_nKernelWeight = 0;
	m_pnKernel = NULL;
}

CConvolutionFilter::~CConvolutionFilter()
{
	if(m_pnKernel)delete[] m_pnKernel;
	m_pnKernel = NULL;
}

#ifdef _DEBUG
void CConvolutionFilter::Dump(CDumpContext& dc) const
{
	CImageAreaProcess::Dump(dc);
}

void CConvolutionFilter::AssertValid() const
{
	CImageAreaProcess::AssertValid();
}
#endif

//重载虚拟SetOperation()函数
void CConvolutionFilter::SetOperation(DWORD dwOperation)
{
	m_dwOperation = dwOperation;
	switch(m_dwOperation)
	{
		//三阶算术平均模糊:
		case IMAGE_BLUR_MEAN_SMOOTH_3:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 9;
			m_pnKernel = new int[9];
			for(int i = 0;i < 9;i++)m_pnKernel[i] = 1;
			break;
		}
		//五阶算术平均模糊:
		case IMAGE_BLUR_MEAN_SMOOTH_5:
		{
			m_nRows = m_nCols = 5;
			m_nKernelWeight = 25;
			m_pnKernel = new int[25];
			for(int i = 0;i < 25;i++)m_pnKernel[i] = 1;
			break;
		}
		//基本三阶低通滤波光滑处理
		case IMAGE_LOWPASS_NOISE_REMOVE_3:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 16;
	 		m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[2] = m_pnKernel[6] = m_pnKernel[8] = 1;
			m_pnKernel[1] = m_pnKernel[3] = m_pnKernel[5] = m_pnKernel[7] = 2;
			m_pnKernel[4] = 4;
			break;
		}
		//基本五阶低通滤波光滑处理
		//注意, 中值过滤另外专门处理.
		case IMAGE_LOWPASS_NOISE_REMOVE_5:
		{
			m_nRows = m_nCols = 5;
			m_nKernelWeight = 60;
			m_pnKernel = new int[25];
			for(int i = 0;i < 25;i++)m_pnKernel[i] = 1;
			m_pnKernel[6] = m_pnKernel[7] = m_pnKernel[8] = 4;
			m_pnKernel[16] = m_pnKernel[17] = m_pnKernel[18] = 4;
			m_pnKernel[11] = m_pnKernel[13] = 4;
			m_pnKernel[12] = 12;
			break;
		}

		//高通锐化处理
		//基本锐化
		case IMAGE_HIGHPASS_BASIC_SHARPEN:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 7;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[2] = m_pnKernel[6] = m_pnKernel[8] = -1;
			m_pnKernel[1] = m_pnKernel[3] = m_pnKernel[5] = m_pnKernel[7] = -2;
			m_pnKernel[4] = 19;
			break;
		}
		//中等强度
		case IMAGE_HIGHPASS_MODERATE_SHARPEN:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 1;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[2] = m_pnKernel[6] = m_pnKernel[8] = 0;
			m_pnKernel[1] = m_pnKernel[3] = m_pnKernel[5] = m_pnKernel[7] = -1;
			m_pnKernel[4] = 5;
			break;
		}
		//高强度
		case IMAGE_HIGHPASS_EXCESSIVE_SHARPEN:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 1;
			m_pnKernel = new int[9];
			for(int i = 0;i < 9;i++)m_pnKernel[i] = -1;
			m_pnKernel[4] = 9;
			break;
		}

		//高通五阶锐化处理
		case IMAGE_HIGHPASS_OUTLINE_SHARPEN:
		{
			m_nRows = m_nCols = 5;
			m_nKernelWeight = -7;
			m_pnKernel = new int[25];
			m_pnKernel[0] = m_pnKernel[4] = m_pnKernel[20] = m_pnKernel[24] = 0;
			m_pnKernel[1] = m_pnKernel[2] = m_pnKernel[3] = -1;
			m_pnKernel[5] = m_pnKernel[10] = m_pnKernel[15] = -1;
			m_pnKernel[9] = m_pnKernel[14] = m_pnKernel[19] = -1;
			m_pnKernel[21] = m_pnKernel[22] = m_pnKernel[23] = -1;
			m_pnKernel[6] = m_pnKernel[8] = m_pnKernel[16] = m_pnKernel[18] = 2;
			m_pnKernel[7] = m_pnKernel[11] = m_pnKernel[13] = m_pnKernel[17] = -4;
			m_pnKernel[12] = 13;
			break;
		}
		//Laplacian 过滤, 三阶, 增强不连续性
		//基本的
		case IMAGE_LAPLACIAN_BASIC_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[2] = m_pnKernel[6] = m_pnKernel[8] = 0;
			m_pnKernel[1] = m_pnKernel[3] = m_pnKernel[5] = m_pnKernel[7] = -1;
			m_pnKernel[4] = 4;
			break;
		}
		//中度的
		case IMAGE_LAPLACIAN_MODERATE_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			for(int i = 0;i < 9;i++)m_pnKernel[i] = -1;
			m_pnKernel[4] = 8;
			break;
		}
		
		//过度的, 高度的
		case IMAGE_LAPLACIAN_EXCESSIVE_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[2] = m_pnKernel[6] = m_pnKernel[8] = 1;
			m_pnKernel[1] = m_pnKernel[3] = m_pnKernel[5] = m_pnKernel[7] = -2;
			m_pnKernel[4] = 4;
			break;
		}


		//梯度检测, 南
		case IMAGE_GRADIENT_SOUTH_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[2] = -1;  m_pnKernel[1] = -2;
			m_pnKernel[3] = m_pnKernel[4] = m_pnKernel[5] = 0;
			m_pnKernel[6] = m_pnKernel[8] = 1;   m_pnKernel[7] = 2;
			break;		
		}
		//梯度检测, 东
		case IMAGE_GRADIENT_EAST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[6] = -1;  m_pnKernel[3] = -2;
			m_pnKernel[1] = m_pnKernel[4] = m_pnKernel[7] = 0;
			m_pnKernel[2] = m_pnKernel[8] = 1;   m_pnKernel[5] = 2;
			break;		
		}
		//梯度检测, 西
		case IMAGE_GRADIENT_WEST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[6] = 1;  m_pnKernel[3] = 2;
			m_pnKernel[1] = m_pnKernel[4] = m_pnKernel[7] = 0;
			m_pnKernel[2] = m_pnKernel[8] = -1;   m_pnKernel[5] = -2;
			break;		
		}
		//梯度检测, 北
		case IMAGE_GRADIENT_NORTH_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[2] = 1;  m_pnKernel[1] = 2;
			m_pnKernel[3] = m_pnKernel[4] = m_pnKernel[5] = 0;
			m_pnKernel[6] = m_pnKernel[8] = -1;   m_pnKernel[7] = -2;
			break;		
		}
		//梯度检测, 西南
		case IMAGE_GRADIENT_SOUTHWEST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[1] = m_pnKernel[5] = -1;  m_pnKernel[2] = -2;
			m_pnKernel[0] = m_pnKernel[4] = m_pnKernel[8] = 0;
			m_pnKernel[3] = m_pnKernel[7] = 1;   m_pnKernel[6] = 2;
			break;		
		}
		//梯度检测, 东北
		case IMAGE_GRADIENT_NORTHEAST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[1] = m_pnKernel[5] = 1;    m_pnKernel[2] = 2;
			m_pnKernel[0] = m_pnKernel[4] = m_pnKernel[8] = 0;
			m_pnKernel[3] = m_pnKernel[7] = -1;   m_pnKernel[6] = -2;
			break;			
		}
		//梯度检测, 东南
		case IMAGE_GRADIENT_SOUTHEAST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = -2;  m_pnKernel[1] = m_pnKernel[3] = -1;  
			m_pnKernel[2] = m_pnKernel[4] = m_pnKernel[6] = 0;
			m_pnKernel[5] = m_pnKernel[7] = 1;   m_pnKernel[8] = 2;
			break;			
		}
		//梯度检测, 西北
		case IMAGE_GRADIENT_NORTHWEST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = 2;  m_pnKernel[1] = m_pnKernel[3] = 1;  
			m_pnKernel[2] = m_pnKernel[4] = m_pnKernel[6] = 0;
			m_pnKernel[5] = m_pnKernel[7] = -1;   m_pnKernel[8] = -2;
			break;			
		}
		
		//平移和差分边缘增强
		//西
		case IMAGE_DIFFERENCE_WEST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[1] = m_pnKernel[2] = 0;
			m_pnKernel[3] = 0; m_pnKernel[4] = 1; m_pnKernel[5] = -1;
			m_pnKernel[6] = m_pnKernel[7] = m_pnKernel[8] = 0;
			break;					
		}
		//平移和差分边缘增强, 北
		case IMAGE_DIFFERENCE_NORTH_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[1] = m_pnKernel[2] = 0;
			m_pnKernel[3] = 0; m_pnKernel[4] = 1; m_pnKernel[5] = 0;
			m_pnKernel[6] = m_pnKernel[8] = 0; m_pnKernel[7] = -1;
			break;					
		}
		//平移和差分边缘增强, 东
		case IMAGE_DIFFERENCE_EAST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[1] = m_pnKernel[2] = 0;
			m_pnKernel[3] = -1; m_pnKernel[4] = 1; m_pnKernel[5] = 0;
			m_pnKernel[6] = m_pnKernel[7] = m_pnKernel[8] = 0;
			break;					
		}
		//平移和差分边缘增强, 南
		case IMAGE_DIFFERENCE_SOUTH_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[2] = 0; m_pnKernel[1] = -1;
			m_pnKernel[3] = 0; m_pnKernel[4] = 1; m_pnKernel[5] = 0;
			m_pnKernel[6] = m_pnKernel[7] = m_pnKernel[8] = 0;
			break;					
		}

		//平移和差分边缘增强, 西南
		case IMAGE_DIFFERENCE_SOUTHWEST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[1] = 0; m_pnKernel[2] = -1;
			m_pnKernel[3] = 0; m_pnKernel[4] = 1; m_pnKernel[5] = 0;
			m_pnKernel[6] = m_pnKernel[7] = m_pnKernel[8] = 0;
			break;					
		}
		//平移和差分边缘增强, 东北
		case IMAGE_DIFFERENCE_NORTHEAST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[1] = m_pnKernel[2] = 0;
			m_pnKernel[3] = 0; m_pnKernel[4] = 1; m_pnKernel[5] = 0;
			m_pnKernel[6] = -1; m_pnKernel[7] = m_pnKernel[8] = 0;
			break;					
		}
		//平移和差分边缘增强, 东南
		case IMAGE_DIFFERENCE_SOUTHEAST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = -1; m_pnKernel[1] = m_pnKernel[2] = 0;
			m_pnKernel[3] = 0; m_pnKernel[4] = 1; m_pnKernel[5] = 0;
			m_pnKernel[6] = m_pnKernel[7] = m_pnKernel[8] = 0;
			break;					
		}

		//平移和差分边缘增强, 西北
		case IMAGE_DIFFERENCE_NORTHWEST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[1] = m_pnKernel[2] = 0;
			m_pnKernel[3] = 0; m_pnKernel[4] = 1; m_pnKernel[5] = 0;
			m_pnKernel[6] = m_pnKernel[7] = 0; m_pnKernel[8] = -1;
			break;					
		}
		
		//Prewitt边缘增强
		//西
		case IMAGE_PREWITT_WEST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[1] = 1; m_pnKernel[2] = -1;
			m_pnKernel[3] = 1; m_pnKernel[4] = -2; m_pnKernel[5] = -1;
			m_pnKernel[6] = m_pnKernel[7] = 1; m_pnKernel[8] = -1;
			break;					
		}
		//Prewitt边缘增强, 北
		case IMAGE_PREWITT_NORTH_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[1] = m_pnKernel[2] = 1;
			m_pnKernel[3] = 1; m_pnKernel[4] = -2; m_pnKernel[5] = 1;
			m_pnKernel[6] = m_pnKernel[7] = m_pnKernel[8] = -1;
			break;				
		}
		//Prewitt边缘增强, 东
		case IMAGE_PREWITT_EAST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = -1; m_pnKernel[1] = m_pnKernel[2] = 1;
			m_pnKernel[3] = -1; m_pnKernel[4] = -2; m_pnKernel[5] = 1;
			m_pnKernel[6] = -1; m_pnKernel[7] = m_pnKernel[8] = 1;
			break;				
		}
		//Prewitt边缘增强, 南
		case IMAGE_PREWITT_SOUTH_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[1] = m_pnKernel[2] = -1;
			m_pnKernel[3] = 1; m_pnKernel[4] = -2; m_pnKernel[5] = 1;
			m_pnKernel[6] = m_pnKernel[7] = m_pnKernel[8] = 1;
			break;					
		}

		//Prewitt边缘增强, 西北
		case IMAGE_PREWITT_SOUTHWEST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = 1; m_pnKernel[1] = m_pnKernel[2] = -1;
			m_pnKernel[3] = 1; m_pnKernel[4] = -2; m_pnKernel[5] = -1;
			m_pnKernel[6] = m_pnKernel[7] = m_pnKernel[8] = 1;
			break;					
		}
		//Prewitt边缘增强, 东北
		case IMAGE_PREWITT_NORTHEAST_DETECT:
		{
			m_nRows = m_nCols = 3;
			m_nKernelWeight = 0;
			m_pnKernel = new int[9];
			m_pnKernel[0] = m_pnKernel[1] = m_pnKernel[2] = 1;
			m_pnKernel[3] = -1; m_pnKernel[4] = -2; m_pnKernel[5] = 1;

⌨️ 快捷键说明

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