📄 imagesegmentation.cpp
字号:
// ImageSegmentation.cpp: implementation of the CImageSegmentation class.
//
// 图象分割类实现文件
//
// 作者:张秋枫
// E-mail: z.maple@263.net
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ImageSegmentation.h"
#include "MaskDialog.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CImageSegmentation::CImageSegmentation( CDib* pDib )
{
m_pDib = pDib;
m_lpImageData = m_pDib->GetImageDataPtr();
m_nHeight = m_pDib->GetBmpHeight();
m_nWidth = m_pDib->GetBmpWidth();
m_nBytesPerRow = m_pDib->GetBytesPerRow();
}
CImageSegmentation::~CImageSegmentation()
{
}
// 高通滤波
void CImageSegmentation::HighpassFiltering()
{
// 高通滤波模板( Laplacian算子 )
int HighpassMask[10] = { -1,-1,-1,-1,8,-1,-1,-1,-1,1 };
AdjustableFilter( HighpassMask, 3, 3 );
m_pDib->StatHistogramInfo();
}
void CImageSegmentation::MaskFiltering()
{
INT aMask[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 9 };
CMaskDialog dlg( aMask );
dlg.DoModal();
Filter( aMask );
m_pDib->StatHistogramInfo();
}
// 3x3 滤波器
void CImageSegmentation::Filter(int *mask)
{
LONG i, j;
LPBYTE pData, pDataTemp; // 位图数据指针
LPINT pBuffer, pBufferTemp; // 位图数据缓冲区指针
// 赋值
pDataTemp = pData = m_lpImageData;
// 分配缓冲区并清零
pBufferTemp = pBuffer = (LPINT)new INT[ m_nBytesPerRow * m_nHeight ];
memset( pBuffer, 0, m_nBytesPerRow * m_nHeight * sizeof(INT) );
// 滤波,滤波结果存入缓冲区中
ASSERT( mask[9]!=0 );
for( i=1; i<m_nHeight-1; i++ )
for( j=1; j<m_nWidth-1; j++ )
{
pDataTemp = pData+i*m_nBytesPerRow+j;
pBufferTemp = pBuffer+i*m_nBytesPerRow+j;
*pBufferTemp = (
mask[0]**(pDataTemp-m_nBytesPerRow-1) +
mask[1]**(pDataTemp-m_nBytesPerRow) +
mask[2]**(pDataTemp-m_nBytesPerRow+1) +
mask[3]**(pDataTemp-1) +
mask[4]**pDataTemp +
mask[5]**(pDataTemp+1) +
mask[6]**(pDataTemp+m_nBytesPerRow-1) +
mask[7]**(pDataTemp+m_nBytesPerRow) +
mask[8]**(pDataTemp+m_nBytesPerRow+1)
)/
mask[9];
}
// 灰度范围变化
SpatialTransform( pBuffer );
// 将缓冲区数据拷入位图数据区中
pBufferTemp = pBuffer;
for( i=0; i<m_nHeight; i++ )
for( j=0; j<m_nBytesPerRow; j++ )
{
*pData++ = (BYTE)*pBufferTemp++;
}
delete []pBuffer;
}
// 灰度范围变换
void CImageSegmentation::SpatialTransform( INT* pBuffer )
{
LONG w, h;
INT maxGrayLevel, minGrayLevel;
// 赋值
maxGrayLevel = minGrayLevel = 0;
for( h=0; h<m_nHeight; h++ )
for( w=0; w<m_nWidth; w++ )
{
if( maxGrayLevel < *(pBuffer+h*m_nBytesPerRow+w) )
maxGrayLevel = *(pBuffer+h*m_nBytesPerRow+w);
if( minGrayLevel > *(pBuffer+h*m_nBytesPerRow+w) )
minGrayLevel = *(pBuffer+h*m_nBytesPerRow+w);
}
for( h=0; h<m_nHeight; h++ )
for( w=0; w<m_nWidth; w++ )
{
*(pBuffer+h*m_nBytesPerRow+w) = 255*( *(pBuffer+h*m_nBytesPerRow+w)-minGrayLevel ) / ( maxGrayLevel-minGrayLevel );
}
}
//////////////////////////////////////////////////////////////////
/*
函数:CImageSegmentation::AdjustableFilter
访问类型: private
作用:卷积模板大小可调节滤波器
参数:
mask 模板指针
wndWidth 模板的宽度
wndHeight 模板的高度
返回值:void
*/
//
void CImageSegmentation::AdjustableFilter(int *mask, int wndWidth, int wndHeight)
{
LONG w, h;
INT i, j;
INT halfHeight, halfWidth; // 滤波器窗口高宽
LPBYTE pData, pDataTemp; // 位图数据指针
LPINT pBuffer, pBufferTemp; // 位图数据缓冲区指针
LPINT pMask;
// 确保滤波器窗口高宽均为奇数
ASSERT( wndHeight%2 && wndWidth%2 && wndHeight>1 && wndWidth>1 );
halfHeight = ( wndHeight-1 )/2;
halfWidth = ( wndWidth-1)/2;
// 赋值
pDataTemp = pData = m_lpImageData;
// 分配缓冲区
pBufferTemp = pBuffer = (LPINT)new INT[ m_nBytesPerRow * m_nHeight ];
memset( pBuffer, 0, m_nBytesPerRow*m_nHeight*sizeof(INT) );
////////////////////////////////////////////////////
// 滤波
//
////////////////////////////////////////////////////
for( h=1; h<m_nHeight-1; h++ )
{
for( w=1; w<m_nWidth-1; w++ )
{
pMask = mask;
for( i=-halfHeight; i<=halfHeight; i++ )
{
for( j=-halfWidth; j<=halfWidth; j++ )
{
*(pBufferTemp+w) += *( pData + (h+i)*m_nBytesPerRow + w+j )
*
*pMask++;
}
}
*(pBufferTemp+w) /= *pMask;
}
pBufferTemp += m_nBytesPerRow;
}
// 灰度范围变化
SpatialTransform( pBuffer );
// 将缓冲区数据拷入位图数据区中
pBufferTemp = pBuffer;
for( i=0; i<m_nHeight; i++ )
for( j=0; j<m_nBytesPerRow; j++ )
{
*pData++ = (BYTE)*pBufferTemp++;
}
delete []pBuffer;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -