none
C#2008进行图像处理的怪事情 RRS feed

  • 问题

  • 使用C#2008对图像进行灰度处理,代码如下,处理结果是图像不会处理完全还有大约3分之一没有处理,就是下半部分,同时处理的这部分图像还会出现镂空现象,请大家帮忙解决。

                    Bitmap image1 = new Bitmap(this.OriginalPicture.Image);
                    
                    Rectangle rect =new  Rectangle(0, 0, image1.Width, image1.Height);
                    
        System.Drawing.Imaging.BitmapData bmpData =
                        image1.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                        image1.PixelFormat);
                    
                    IntPtr ptr = bmpData.Scan0;

                    
                                    int bytes = image1.Width * image1.Height*3;
                    byte [] rgbValues=new byte [bytes];
                            System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues,0, bytes);
                   

        for(int count=0;count<rgbValues.Length ;count+=3)
        {
          byte  k=System.Convert .ToByte(rgbValues[count]* 0.299+rgbValues[count+1]*0.587+rgbValues[count+2]*0.114);
          rgbValues[count]=k;
          rgbValues[count+1]=k;
          rgbValues[count+2]=k;
        }

                    
        System.Runtime.InteropServices.Marshal.Copy(rgbValues , 0, ptr, bytes);

                    
                    image1.UnlockBits(bmpData);

                    
                    this.ResultPicture.Image = image1;
                    
                    this.ResultPicture.Refresh();
                    this.ResultPicture.Update();
    其中的ResultPicture为图像处理之后存放的PictureBox,OriginalPicture为原始PictureBox,O(∩_∩)O谢谢。

    2010年10月3日 14:32

答案

  • 首先,我要说用C#做数字图像处理有点不太高效,最好用C++结合OpenCV,如果C#也可以考虑用Emgu。

    这样说的原因有二:

    一是速度,OpenCV和它的C#实现都是做了大量优化的,比自己用指针快多了。

    二是稳定性,你怎么清楚你用PictureBox载入的图像的源信息是否符合要求?

     

    现在你遇到的情况可能就是原来的图像带有4个通道,多一个Alpha,因此可能发生不完全或者镂空的现象。

    而且你也没有考虑灰度值的运算溢出,建议你先用int算,算了再判断是否在0~255,然后在强制转换成byte。

     


    喜欢C#,喜欢看上去很酷、或者用起来很有用、或者很高效的代码
    2010年10月5日 2:23
  • 如果说教程的话,BroadView的《C++数字图像处理》是一本还不错的书。

    如果你还关心纯理论,你可以看看电子工业出版社的《数字图像处理》冈萨雷斯或者其他人写的版本。

    如果只是想了解OpenCV,搜索引擎就足够了,OpenCV的中文官方论坛有很多资料可以学习。

    Emgu是OpenCV在C#的移植版本,用于教学很不错,实用则差一些。


    喜欢C#,喜欢看上去很酷、或者用起来很有用、或者很高效的代码
    2010年10月7日 16:29

全部回复

  • 首先,我要说用C#做数字图像处理有点不太高效,最好用C++结合OpenCV,如果C#也可以考虑用Emgu。

    这样说的原因有二:

    一是速度,OpenCV和它的C#实现都是做了大量优化的,比自己用指针快多了。

    二是稳定性,你怎么清楚你用PictureBox载入的图像的源信息是否符合要求?

     

    现在你遇到的情况可能就是原来的图像带有4个通道,多一个Alpha,因此可能发生不完全或者镂空的现象。

    而且你也没有考虑灰度值的运算溢出,建议你先用int算,算了再判断是否在0~255,然后在强制转换成byte。

     


    喜欢C#,喜欢看上去很酷、或者用起来很有用、或者很高效的代码
    2010年10月5日 2:23
  • 嗯,谢谢sartrey的回答,的确存在你说的哪些问题。但是使用C++结合OpenCV或者Emgu方法有没有好的教程或者示例呢?谢谢!

    2010年10月5日 11:06
  • 如果说教程的话,BroadView的《C++数字图像处理》是一本还不错的书。

    如果你还关心纯理论,你可以看看电子工业出版社的《数字图像处理》冈萨雷斯或者其他人写的版本。

    如果只是想了解OpenCV,搜索引擎就足够了,OpenCV的中文官方论坛有很多资料可以学习。

    Emgu是OpenCV在C#的移植版本,用于教学很不错,实用则差一些。


    喜欢C#,喜欢看上去很酷、或者用起来很有用、或者很高效的代码
    2010年10月7日 16:29
  • 要速度一的话用个unsafe代码啊,处理大概为16ms就行了.marshal类是好用,但是速度慢的很啊.

    2010年10月8日 1:42