HSV 直方图 bin 等于零
HSV Histogram bins equal zero
我正在尝试使用以下代码创建 HSV 直方图
Mat image = new Mat(file, LoadImageType.Color);
int hBins = 16;
int sBins = 16;
int vBins = 16;
RangeF hRange = new RangeF(0F, 180F);
RangeF sRange = new RangeF(0f, 255f);
RangeF vRange = new RangeF(0f, 255f);
Image<Bgr, Byte> imageSource = new Image<Bgr, Byte>(image.Bitmap);
Image<Hsv, Byte> imageHsv = imageSource.Convert<Hsv, Byte>();
DenseHistogram hist = new DenseHistogram(new int[] { hBins, sBins, vBins }, new RangeF[] { hRange, sRange, vRange });
hist.Calculate<byte>(imageHsv.Split(), false, null);
问题是,当调用 hist.GetBinValues()
时,所有 bin 的值都是零
逐个通道计算直方图似乎给出了预期的输出:
Mat image = new Mat(file, LoadImageType.Color);
int hBins = 16;
int sBins = 16;
int vBins = 16;
RangeF hRange = new RangeF(0F, 180F);
RangeF sRange = new RangeF(0f, 256f);
RangeF vRange = new RangeF(0f, 256f);
var imageSource = image.ToImage<Bgr, Byte>();
Image<Hsv, Byte> imageHsv = imageSource.Convert<Hsv, Byte>();
var hsvChannels = imageHsv.Split();
DenseHistogram hHist = new DenseHistogram(hBins, hRange);
DenseHistogram sHist = new DenseHistogram(sBins, sRange);
DenseHistogram vHist = new DenseHistogram(vBins, vRange);
hHist.Calculate<byte>(new Image<Gray, Byte>[] { hsvChannels[0] }, false, null);
sHist.Calculate<byte>(new Image<Gray, Byte>[] { hsvChannels[1] }, false, null);
vHist.Calculate<byte>(new Image<Gray, Byte>[] { hsvChannels[2] }, false, null);
var hVals = hHist.GetBinValues();
var sVals = sHist.GetBinValues();
var vVals = vHist.GetBinValues();.
不过,我无法回答为什么您的方法不起作用。我看到 GetBinValues()
returns 一个包含 16 ^ 3 个值的数组,我希望它是 16 * 3 个值。
与此斗争了几天后,我放弃了 EMGU,只使用了来自 C++ 的 OpenCV,这给了我正确的 HSV 容器。
我正在尝试使用以下代码创建 HSV 直方图
Mat image = new Mat(file, LoadImageType.Color);
int hBins = 16;
int sBins = 16;
int vBins = 16;
RangeF hRange = new RangeF(0F, 180F);
RangeF sRange = new RangeF(0f, 255f);
RangeF vRange = new RangeF(0f, 255f);
Image<Bgr, Byte> imageSource = new Image<Bgr, Byte>(image.Bitmap);
Image<Hsv, Byte> imageHsv = imageSource.Convert<Hsv, Byte>();
DenseHistogram hist = new DenseHistogram(new int[] { hBins, sBins, vBins }, new RangeF[] { hRange, sRange, vRange });
hist.Calculate<byte>(imageHsv.Split(), false, null);
问题是,当调用 hist.GetBinValues()
时,所有 bin 的值都是零
逐个通道计算直方图似乎给出了预期的输出:
Mat image = new Mat(file, LoadImageType.Color);
int hBins = 16;
int sBins = 16;
int vBins = 16;
RangeF hRange = new RangeF(0F, 180F);
RangeF sRange = new RangeF(0f, 256f);
RangeF vRange = new RangeF(0f, 256f);
var imageSource = image.ToImage<Bgr, Byte>();
Image<Hsv, Byte> imageHsv = imageSource.Convert<Hsv, Byte>();
var hsvChannels = imageHsv.Split();
DenseHistogram hHist = new DenseHistogram(hBins, hRange);
DenseHistogram sHist = new DenseHistogram(sBins, sRange);
DenseHistogram vHist = new DenseHistogram(vBins, vRange);
hHist.Calculate<byte>(new Image<Gray, Byte>[] { hsvChannels[0] }, false, null);
sHist.Calculate<byte>(new Image<Gray, Byte>[] { hsvChannels[1] }, false, null);
vHist.Calculate<byte>(new Image<Gray, Byte>[] { hsvChannels[2] }, false, null);
var hVals = hHist.GetBinValues();
var sVals = sHist.GetBinValues();
var vVals = vHist.GetBinValues();.
不过,我无法回答为什么您的方法不起作用。我看到 GetBinValues()
returns 一个包含 16 ^ 3 个值的数组,我希望它是 16 * 3 个值。
与此斗争了几天后,我放弃了 EMGU,只使用了来自 C++ 的 OpenCV,这给了我正确的 HSV 容器。