彩色图像均值滤波,部分程序,就考虑3×3矩阵。图像滤波结果有问题。求大神指导。程序哪有问题?

Stevenwmy 2014-05-18 08:39:17
int i,j;
for( j=1;j<height-1;j++)
for( i=1;i<wide-1;i++)
{
m=0;
for(yy=j-1;yy<=j+1;yy++)//n2
for(xx=i-1;xx<=i+1;xx++)//n2
{
mado[m]=p_data[yy*wide*3+xx*3];
mado2[m]=p_data[yy*wide*3+xx*3+1];
mado3[m]=p_data[yy*wide*3+xx*3+2];
m++;
}

//求均值medi
medi=(mado[0]+mado[1]+mado[2]+mado[3]+mado[4]+mado[5]+mado[6]+mado[7]+mado[8])/9;
medi2=(mado2[0]+mado2[1]+mado2[2]+mado2[3]+mado2[4]+mado2[5]+mado2[6]+mado2[7]+mado2[8])/9;
medi3=(mado3[0]+mado3[1]+mado3[2]+mado3[3]+mado3[4]+mado3[5]+mado3[6]+mado3[7]+mado3[8])/9;

//把均值代入显示图像中
p_temp[j*wide+i*3]=medi;
p_temp[j*wide+i*3+1]=medi2;
p_temp[j*wide+i*3+2]=medi3;
...全文
493 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhhh63 2014-05-20
  • 打赏
  • 举报
回复
我正用的加权平均算法,部分代码:

// 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(); // 中值
relaxisland 2014-05-20
  • 打赏
  • 举报
回复
程序看起来,貌似没大问题啊, 你没有说 错误现象很难判断啊, 你确定你的彩色图片 是 24位? 不是32位 或其他? 你确定 图像的每行数据的大小刚好是4的倍数,没有填充数字 填充数字:为了达到每行字节数是4的倍数,有事需要行的尾巴填充一些0
relaxisland 2014-05-20
  • 打赏
  • 举报
回复
引用 2 楼 u013602835 的回复:
mado[m]=p_data[yy*wide*3+xx*3]; p_temp[j*wide+i*3]=medi; wide 是什么,为什么这两句不对应?
这位同学说的对, 好眼力
大飞哥666 2014-05-19
  • 打赏
  • 举报
回复
mado[m]=p_data[yy*wide*3+xx*3]; p_temp[j*wide+i*3]=medi; wide 是什么,为什么这两句不对应?
shiter 2014-05-19
  • 打赏
  • 举报
回复
看了半天也没有看太明白,友情绑定了
worldy 2014-05-18
  • 打赏
  • 举报
回复
不用这么折腾了,使用OpenCV吧

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧