繁体   English   中英

使用Emgu OpenCV进行直方图计算

[英]Histogram computation with Emgu OpenCV

我想使用Emgu获取图像的直方图。

我有一个灰度双图像

Image<Gray, double> Crop;

我可以使用

Image<Gray, byte> CropByte = Crop.Convert<Gray, byte>(); 
DenseHistogram hist = new DenseHistogram(BinCount, new RangeF(0.0f, 255.0f));
hist.Calculate<Byte>(new Image<Gray, byte>[] { CropByte }, true, null);

问题是,用这种方式我需要转换为字节图像。 这是有问题的,因为它歪曲了我的结果。 如果可以使用双倍图像,这将使我得到的直方图略有不同。

我尝试使用CvInvoke来使用内部opencv函数来计算直方图。

IntPtr[] x = { Crop }; 

DenseHistogram cropHist = new DenseHistogram  
( 
    BinCount,  
    new RangeF 
    (
        MinCrop,
        MaxCrop
    ) 
); 

CvInvoke.cvCalcArrHist(x, cropHist, false, IntPtr.Zero); 

问题是我很难找到如何正确使用此功能的方法

错误

emgu / opencv是否允许我这样做? 我需要自己编写函数吗?

这不是EmguCV / OpenCV的问题,这个想法本身没有任何意义,因为双重直方图将需要比可用内存更多的内存。 当您为直方图分配了固定大小时,我所说的是正确的。 解决此问题的唯一方法是在处理图像时使用具有动态分配的直方图。 但这对于大图像将是危险的,因为它可以分配与图像本身一样多的内存。

我猜您的双重图像包含许多相同的值,否则直方图将不是很有用。 因此,解决此问题的一种方法是将您的值重新映射为短(16位)而不是字节(8位),这样直方图将非常类似于您对双精度值的期望。

我在opencv源代码中浏览了histogram.cpp。

内部功能

void cv::calcHist( const Mat* images, int nimages, const int* channels,
                   InputArray _mask, OutputArray _hist, int dims, const int* histSize,
                   const float** ranges, bool uniform, bool accumulate )

有一个部分处理不同的图像类型

if( depth == CV_8U )
        calcHist_8u(ptrs, deltas, imsize, ihist, dims, ranges, _uniranges, uniform );
    else if( depth == CV_16U )
        calcHist_<ushort>(ptrs, deltas, imsize, ihist, dims, ranges, _uniranges, uniform );
    else if( depth == CV_32F )
        calcHist_<float>(ptrs, deltas, imsize, ihist, dims, ranges, _uniranges, uniform );
    else
        CV_Error(CV_StsUnsupportedFormat, "");

尽管此处尚未处理双图像,但浮点图像。

虽然浮点数使精度从双精度上降低了一点,但这并不是一个大问题。

以下代码段对我来说效果很好

Image<Gray, float> CropByte = Crop.Convert<Gray, float>(); 
DenseHistogram hist = new DenseHistogram(BinCount, new RangeF(0.0f, 255.0f));
hist.Calculate<float>(new Image<Gray, float>[] { CropByte }, true, null);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM