📄 convolutionfilter.cpp
字号:
/////////////////////////////////////////////////////////////////////////////////
//
// 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 + -