我有一个灰度图像,其中包含需要在WPF C#程序中圈出的各个区域。这种图像的一个例子是:
我想要圈出的区域是白色区域,以这种方式:
到目前为止,我要做的是制作一个字节数组,由每个像素的强度组成(0为黑色和白色为4000及以上。)然后,我将每个字节通过阈值测试,看看是否它是否包含部分区域的像素(例如,如果字节长度超过3500,则将其视为区域的一部分,否则不是。)
在此之后,我很难过。到目前为止,我的一个想法是找到一行中一个区域的第一个像素,然后找到一个区域底部的行区域的最后一个像素(左上角和右下角。)然后我会找到两个像素之间的距离,并使用它来获得中心点(从中我可以用它来获得绘制圆所需的坐标。)这种方法的问题我认为是噪声会导致许多圆圈出现在图像上或误导了圈子。我想我可以使用阈值来消除小圆圈。
这些图像实际上是视频的帧(信息是作为字节数组获得然后写入WriteableBitmap),所以我不知道是否有太多的数据操作会滞后于镜头。我也是C#,字节和CS的新手,但这个项目是我在冬歇期学习如何编程的。任何答案或资源都会受到高度赞赏,特别是在伪代码或C#中。
答案 0 :(得分:1)
从你说的话来看,这听起来像是一个计算机视觉问题。我曾经开发过几个基于C#的CV问题应用程序。基本的想法是使用GDI +将Bitmap.Lockbits()
对象编组到Byte[]
并进行操作,或者只使用Bitmap.SetPixel() Bitmap.GetPixel()
,但它们的速度要慢得多。
一个很好的选择是使用EmguCV。适用于.NET 2.0及更高版本的OpenCV包装器。因此,编写C#来解决CV问题更加容易。