我正致力于使用emgu简历从图像中检测静脉,我有几个问题。有什么简单的方法来检测颜色或颜色范围吗?是否有一种简单的方法将这种颜色替换为另一种颜色(例如图像的平均颜色)?我怎么才能做到这一点而不降低表演的质量呢?
提前感谢!
发布于 2016-07-28 22:10:30
我无法想象这个问题已经发表了三年.
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;
}
为什么是矩阵?
不像Image<,>类,其中内存是预先分配和固定的,Mat的内存可以通过Open函数调用自动重新分配。我们不能预先分配托管内存,并假设在Mat对象的生存期内使用相同的内存。因此,Mat类不包含像Image<,>类这样的数据属性,其中像素可以通过托管数组访问。
InRange是什么?
http://www.emgu.com/wiki/files/2.0.0.0/html/07eff70b-f81f-6313-98a9-02d508f7c7e0.htm
检查图像元素是否位于两个标量之间 返回值 如果inrange,则为0。
SetTo是什么?
http://www.emgu.com/wiki/files/2.4.0/document/html/0309f41d-aa02-2c0d-767f-3d7d8ccc9212.htm
将标量值复制到目标GpuMat的每个选定元素:GpuMat(I)=值if掩码(I)!=0
事实就是如此。
引用:http://blog.zsxsoft.com/post/24 (只有中文) (CC BY-NC-ND)
发布于 2013-10-03 05:38:12
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);
}
}
}
https://stackoverflow.com/questions/17303512
复制相似问题