一副256级灰度BMP位图,现在预对其进行平滑处理,方法为将每个像素点的颜色值用与其相邻点的颜色值的平均数来替换,如下所示
       a1    a2    a3
       a4    a5    a6
       a7    a8    a9
平滑处理后a5点的颜色值等于颜色值(a1+a2+a3+a4+a6+a7+a8+a9)/8 ,显示平滑前后的位图。该怎样做?[email protected]

解决方案 »

  1.   

    COLORREF CDC::GetPixel(int x, int y) //得到象素点
    COLORREF CDC::SetPixel(int x, int y, COLORREF crColor) //设置象素点
      

  2.   

    这不是数字图象处理的练习吗?
    我们当时做了
    算法不是很清楚吗?
    你可以到
    http://202.117.179.251/dip2004
    这里看看
    不知道校外的网络能上去不
      

  3.   

    读256bit位图到内存:
    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();
      

  4.   

    m_pData为数据区指针
    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);