一副256级灰度BMP位图,现在预对其进行平滑处理,方法为将每个像素点的颜色值用与其相邻点的颜色值的平均数来替换,如下所示
a1 a2 a3
a4 a5 a6
a7 a8 a9
平滑处理后a5点的颜色值等于颜色值(a1+a2+a3+a4+a6+a7+a8+a9)/8 ,显示平滑前后的位图。该怎样做?[email protected]
a1 a2 a3
a4 a5 a6
a7 a8 a9
平滑处理后a5点的颜色值等于颜色值(a1+a2+a3+a4+a6+a7+a8+a9)/8 ,显示平滑前后的位图。该怎样做?[email protected]
COLORREF CDC::SetPixel(int x, int y, COLORREF crColor) //设置象素点
我们当时做了
算法不是很清楚吗?
你可以到
http://202.117.179.251/dip2004
这里看看
不知道校外的网络能上去不
LPBITMAPFILEHEADER pBmfh;
LPBITMAPINFO pBminfo;
BYTE* pPixel;
CFile file;
file.Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL );pBmfh=(LPBITMAPFILEHEADER) new BYTE[sizeof(BITMAPFILEHEADER)];
pBminfo=(LPBITMAPINFO) new BYTE[sizeof(BITMAPINFO)+255*sizeof(RGBQUAD)];
file.Read(pBmfh, sizeof(BITMAPFILEHEADER));
file.Read(pBminfo, pBmfh->bfOffBits-sizeof(BITMAPFILEHEADER));
pPixel=new BYTE[pBmfh->bfSize-pBmfh->bfOffBits];
file.Read(pPixel, pBmfh->bfSize-pBmfh->bfOffBits);
file.Close();
wide,height为图像的宽和高
BYTE* p_temp=new BYTE[wide*height];// 申请并分配中间缓存
memcpy(p_temp,m_pData,wide*height);// 复制图象数据到中间缓存 //用3*3屏蔽窗口的8近邻均值进行平滑
for(int j=1;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
//求周围8近邻均值
averg=(int)((p_data[(j-1)*wide+(i-1)]+p_data[(j-1)*wide+i]
+p_data[(j-1)*wide+(i+1)]+p_data[j*wide+(i-1)]
+p_data[j*wide+i+1]+p_data[(j+1)*wide+(i-1)]
+p_data[(j+1)*wide+i]+p_data[(j+1)*wide+i+1])/8); p_temp[j*wide+i]=averg;
}
}
memcpy(p_data,p_temp,wide*height);