我在msdn里找到一个SimpleImage的例子,里面是用的是CImage类,提供了一个B&W的例子,使用的是GetPixel和SetPixelRGB,但是转换速度实在太慢。有没有什么方法改进?
请问有没有关于数字图像处理的例子?关于图像像素级的操作,例如图像增强,边缘检测等,如果有完整的例子最好,我看过几本书,都是零散的,因为是初学VC,总觉得不清楚,谢谢。

解决方案 »

  1.   

    GetPixel,SetPixel,对大数据量处理不适用要加快速度必须在内存中处理数据
    例如可以使用 CreateDIBSection 得到一图像内存数据的地址,对这个内存数据进行操作或者使用GetDIBits 和 SetDIBits, 都可以加快图像处理
      

  2.   

    http://www.codeguru.com/Cpp/W-D/dislog/splashscreens/article.php/c5023/
      

  3.   

    替换代码看看
    int maxY = imgOriginal.GetHeight(), maxX = imgOriginal.GetWidth();
    byte r,g,b,avg;
    byte *pBuffer;
    int off = imgOriginal.GetBPP() >> 3;
    for (int y=0; y<maxY; y++) 
    {
    pBuffer = (byte*)imgOriginal.GetPixelAddress(0,y);
    for (int x=0; x<maxX; x++) 
    {
    r = *pBuffer;
    g = *(pBuffer + 1);
    b = *(pBuffer + 2);
    avg = ((r + g + b)/3);
    *pBuffer = *(pBuffer + 1) = *(pBuffer + 2) = avg;
    pBuffer += off;
    }
    }
      

  4.   

    像素级的操作其实在VC里不再用GetPixel和SetPixelRGB,我这段时间也在写这些代码,楼主留下邮箱我们共同学习
      

  5.   

    我查了msdn里面关于CImage的描述,可以使用GetBits和GetPitch共同完成对像素级的操作。我写了下面的关于转灰度的函数,速度还是挺快的
    // 获取图像像素的高度和宽度
    int height = m_imgCurrent.GetHeight(), width = m_imgCurrent.GetWidth();
    // 获取图像的首地址
    byte* pBase = (byte*)m_imgCurrent.GetBits();
                      // 获取每一行的宽度
    int offset = m_imgCurrent.GetPitch();
    int r, g, b, avg;
    PixelData* pixel = NULL;
    for (int x = 0; x < height; x++)
    {
    pixel = (PixelData*)(pBase + x * offset);
    for (int y = 0; y < width; y++)
    {
    b = (int)pixel->blue;
    g = (int)pixel->green;
    r = (int)pixel->red;
    avg = (int)((.587 * r + .299 * g + .114 * b) / 3);
    pixel->blue = pixel->green = pixel->red = avg;
    pixel++;
    }
    }
    其中PixelData是一个struct {byte blue; byte green; byte red;}
      

  6.   

    在后台用DIB格式处理,然后SetDib...()函数显示在界面上
      

  7.   

    CxImage 中更多的是编码的处理,而图像处理还涉及很多方面,你需要先确定一个方向
      

  8.   

    原本想用VC++来写,后来发现处理不同类型的文件格式是个梦魇,VC++调用的GDI+稍显复杂。然后就看到了C#写的代码,速度不错,你可以在The Code Projects上搜一搜。不管是C++还是C#,用GDI+可以集中精力在算法上。
      

  9.   

    C#的Bitmap类确实方便,但是你可以搜一下,凡是用到Bitmap类的C#程序,它对象素的访问必然用到所谓的“不安全指针”,其实就是拿C++的指针来用,我测试过,即使用指针C#的程序仍比同样功能的C++/C程序慢,所以用哪个还得看具体需求