我想将 Bgr 值(一个像素)转换为 Hsv 值。我怎样才能在 EmguCV 中做到这一点(无需从头开始编写转换代码)?
请注意,我对转换整个图像的颜色空间不感兴趣,而只对转换一个像素感兴趣,因此
CvInvoke.cvCvtColor()
对我不起作用。
如果你想在 EmguCV 中执行此操作,只需将图像读入 Image 中,获取像素值并将其粘贴到 Hsv 结构中。
例如:
static void Main(string[] args)
{
bool haveOpenCL = CvInvoke.HaveOpenCL;
bool haveOpenClGpu = CvInvoke.HaveOpenCLCompatibleGpuDevice;
CvInvoke.UseOpenCL = true;
Emgu.CV.Image<Bgr, Byte> lenaBgr = new Image<Bgr, Byte>(@"D:\OpenCV\opencv-3.2.0\samples\data\Lena.jpg");
CvInvoke.Imshow("Lena BSG", lenaBgr);
Bgr color = lenaBgr[100, 100];
Console.WriteLine("Bgr: {0}", color.ToString());
Emgu.CV.Image<Hsv, Byte> lenaHsv = new Image<Hsv, Byte>(@"D:\OpenCV\opencv-3.2.0\samples\data\Lena.jpg");
CvInvoke.Imshow("Lena HSV", lenaHsv);
Hsv colorHsv = lenaHsv[100, 100];
Console.WriteLine("HSV: {0}", colorHsv.ToString());
CvInvoke.WaitKey(0);
}
}
结果: 背景:[87,74,182] 单纯疱疹病毒:[176,151,182]
Lena BGR Lena HSV
好吧,我已经找到了一种使用 .NET 框架的帮助的方法
给予
Bgr pixel
;
1- 将颜色转换为
System.Drawing.Color
:
System.Drawing.Color intermediate = System.Drawing.Color.FromArgb((int)pixel.Red, (int)pixel.Green, (int)pixel.Blue);
2- 从中间体构建 Hsv。
Hsv hsvPixel = new Hsv(intermediate.GetHue(), intermediate.GetSaturation(), intermediate.GetBrightness());
干杯。
抱歉唤醒了一个老问题......
由于 opencv/emgu 没有公开像素转换函数,有时我会使用这个:
Bgr bgrColor = new Bgr(...);
Hsv hsvColor = new Image<Bgr, byte>(1, 1, bgrColor).Convert<Hsv, byte>()[0, 0];
这根本没有优化,但会给出正确的颜色。