19,468
社区成员
发帖
与我相关
我的任务
分享
// 9点加权平均,int weight 权重值,0表示正常平均
void HFilter::weighted9( DWORD weight )
{
ASSERT( m_nWidth > 3 && m_nHeight > 3 );
LPWORD p0 = m_pData;
LPWORD p1 = m_pSource;
LPWORD p2 = m_pSource + m_nWidth + 2;
LPWORD p3 = m_pSource + (m_nWidth + 2)*2;
DWORD w9 = weight + 9; // 加权后的基数
for( int i = 0; i < m_nHeight; i++ )
{
for( int j = 0; j < m_nWidth; j++, p0++, p1++, p2++, p3++ )
{
DWORD w = p2[1] * weight; // 加权求和,权重值不能太大,太大可能越界
for( int k = 0; k < 3; k++ )
{
w += p1[k];
w += p2[k];
w += p3[k];
}
// 取加权平均值
*p0 = WORD(w / w9);
}
p1 += 2;
p2 += 2;
p3 += 2;
}
}
源文件到http://download.csdn.net/detail/hhhh63/7373687处下载
里还包括3x3中值滤波,效果更好,与原数据更接近。
调用方法:
HFilter( buf2, CAMERA_WIDTH, CAMERA_HEIGHT ).weighted9(7); // 一次平滑
HFilter( buf3, CAMERA_WIDTH, CAMERA_HEIGHT ).weighted9(11); // 二次平滑
HFilter( buf4, CAMERA_WIDTH, CAMERA_HEIGHT ).median3(); // 中值