1

我正在使用 emgu CV 从图像中检测静脉,我有几个问题。有没有简单的方法来检测颜色或颜色范围?有没有一种简单的方法可以用另一种颜色替换这种颜色(例如图像的平均颜色)?如何在不降低性能的情况下实现这一目标?

提前致谢!

4

2 回答 2

4

我无法想象这个问题已经发布了大约 3 年......

    public static Image<Bgr, byte> BackgroundToGreen(Image<Bgr, byte> rgbimage)
    {
        Image<Bgr, byte> ret = rgbimage;
        var image = rgbimage.InRange(new Bgr(190, 190, 190), new Bgr(255, 255, 255));
        var mat = rgbimage.Mat;
        mat.SetTo(new MCvScalar(200, 237, 204), image);
        mat.CopyTo(ret);
        return ret;
    }

为什么是矩阵?

http://www.emgu.com/wiki/index.php/Working_with_Images#Accessing_the_pixels_from_Mat

与 Image<,> 类的内存是预先分配和固定的不同,Mat 的内存可以通过 Open CV 函数调用自动重新分配。我们不能预先分配托管内存并假设在 Mat 对象的整个生命周期中都使用相同的内存。因此,Mat 类不包含像 Image<,> 类那样的 Data 属性,其中像素可以通过托管数组访问。

什么是 InRange?

http://www.emgu.com/wiki/files/2.0.0.0/html/07eff70b-f81f-6313-98a9-02d508f7c7e0.htm

检查图像元素是否位于两个标量之间

返回值

res[i,j] = 255 如果在范围内,0 否则

什么是 SetTo?

http://www.emgu.com/wiki/files/2.4.0/document/html/0309f41d-aa02-2c0d-767f-3d7d8ccc9212.htm

将标量值复制到目标 GpuMat 的每个选定元素: GpuMat(I)=value if mask(I)!=0

就是这样。

引自:http ://blog.zsxsoft.com/post/24 (只有中文)(CC BY-NC-ND)

于 2016-07-29T06:10:30.680 回答
1
Image<Bgr, Byte> img; 
 Image<Gray, Byte> grayImg = img.Convert<Gray, Byte>();

grayImg = img.InRange(new Bgr(minB, minG, minR), new Bgr(new Bgr(maxB, maxG, maxR);

它只会以二进制显示您的颜色(范围),并且是最快的方式

但是如果你想检测一定范围的颜色并替换它们:

Image<Bgr, Byte> img;
                for (int i = 0; i < img.ManagedArray.GetLength(0); i++)
                {
                    for (int j = 0; j < img.ManagedArray.GetLength(1); j++)
                    {
                        Bgr currentColor = img[i, j];

                        if (currentColor.Blue >= minB && currentColor.Blue <= maxB && currentColor.Green >= minG && maxG <= trackBar13.Value && currentColor.Red >= minR && currentColor.Red <= maxR)
                        {
                            img[i, j] = new Bgr(B,G,R);
                        }
                    }
                }
于 2013-10-03T13:38:12.517 回答