图像处理任务:侵蚀C#

时间:2013-01-15 14:39:37

标签: c# image bitmap unsafe

我正在进行图像处理任务,我想实现侵蚀和扩张算法。它需要在所有方向上查找每个像素(在这种情况下是向上,向下,向左和向右),所以我使用的是加号结构元素。这是我的问题:我有4个for循环嵌套,这使得这个操作非常慢。 谁能告诉我如何在不使用不安全方法的情况下更快地进行侵蚀过程? 这就是我所拥有的:

        colorlistErosion = new List<Color>();
        int colorValueR, colorValueG, colorValueB;
        int tel = 0;

        for (int y = 0; y < bitmap.Height; y++)
        {
            for (int x = 0; x < bitmap.Width; x++)
            {
                Color col = bitmap.GetPixel(x, y);
                colorValueR = col.R; colorValueG = col.G; colorValueB = col.B;
                //Erosion
                for (int a = -1; a < 2; a++)
                {
                    for (int b = -1; b < 2; b++)
                    {
                        try
                        {
                            Color col2 = bitmap.GetPixel(x + a, y + b);
                            colorValueR = Math.Min(colorValueR, col2.R);
                            colorValueG = Math.Min(colorValueG, col2.G);
                            colorValueB = Math.Min(colorValueB, col2.B);
                        }
                        catch
                        {
                        }
                    }
                }
                colorlistErosion.Add(Color.FromArgb(0 + colorValueR, 0+colorValueG, 0+colorValueB));
            }
        }
        for (int een = 0; een < bitmap.Height; een++)
            for (int twee = 0; twee < bitmap.Width; twee++)
            {
                bitmap.SetPixel(twee, een, colorlistErosion[tel]);
                tel++;
            }

2 个答案:

答案 0 :(得分:0)

  

如何在不使用不安全方法的情况下更快地进行侵蚀过程?

您可以将内部循环转换为Parallel.For()

但我不能100%确定GetPixel()和特别是SetPixel()是否是线程安全的。这是一个交易破坏者。

答案 1 :(得分:0)

由于4个嵌套循环,您的算法本质上很慢。您还使用最慢的方法处理位图bitmap.GetPixel

看看SharpGL。如果他们没有您的过滤器,您可以下载源代码并找出如何制作自己的过滤器。