C#从Image<,>获取像素位置EMGU CV 3.3

时间:2018-01-13 14:51:56

标签: c# .net image-processing emgucv getpixel

我一直致力于基于EMGU的项目,我需要使用ZhangSuen细化算法创建一个骨架图像,该算法非常精细。为了进一步分析,我想获得骨架的所有像素位置并将它们存储在List<Point>

我在使用Bitmap.GetPixel()Bitmap.SetPixel()方法时对性能问题进行了大量研究。这就是为什么我遵循使用byte[,,]数组来获取像素位置的方法。到目前为止,我的方法看起来像这样:

    public static List<Point> GetSkeletonPoints(Image<Gray, Byte> src, Byte color = 255)
    {
        var SkeletonPoints = new List<Point>();
        int rows = src.Width;
        int cols = src.Height;
        byte[,,] data = src.Data;

        for(int y = rows - 1; y >= 0; y--)
        {
            for(int x = cols - 1; x >= 0; x--)
            {
              if(data[x, y, 0] != 0)
                {
                    SkeletonPoints.Add(new Point(x, y));
                }
            }
        }
        return SkeletonPoints;
    }

骨架像素的值为255,而背景为黑色(0)。 现在奇怪的是,如果我尝试像这样修改输入图像:

src.Data[0,0,0] = 255;
当我使用CvInvoke.Imshow("test", src);

查看图像时,

绝对没有任何变化

运行present方法会导致没有Point添加到列表中,这意味着永远不会满足if语句中的条件。 像这样if(data[x, y, 0] == 0)运行if语句会导致一个条件总是被满足,并且我得到图像中的每个单点位置,尽管实际上是黑色(0)或白色(255)。

我认为我错误地使用了一个完全黑色的图像.. 但后来我将CvInvoke.FindNonZero()方法应用于输入图像并找到了500个NonZero像素,这对我来说毫无意义。

我现在有点绝望,也许我错过了什么? 非常感谢任何帮助或提示! (即使它不能解决我的问题,但通常会提高循环图像的性能)

0 个答案:

没有答案