我一直致力于基于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像素,这对我来说毫无意义。
我现在有点绝望,也许我错过了什么? 非常感谢任何帮助或提示! (即使它不能解决我的问题,但通常会提高循环图像的性能)