openHV中有多个通道的calcHist

时间:2017-12-08 16:24:24

标签: c++ opencv

我尝试使用带cv::calcHist的openCV计算3D 2x2x2 RGB直方图。但是,我不明白calcHist如何使用多个渠道。我希望它选择两个红色的分层i中的一个,两个绿色分层j之一和两个蓝色分层k之一,并将结果存储到相应的三重索引的bin bins[i][j][k]。但这不是它正在做的事情。

以下循环正常

int bin_index(const float x, unsigned int nbins)
{
    return std::min(static_cast<unsigned int>(x*nbins), nbins - 1);
}

//...

for(cv::Point pixel_idx : all possible pixel positions)
{
    int red_idx = bin_index(image(pixel_idx)[0], number_of_red_bins);
    int green_idx = bin_index(image(pixel_idx)[0], number_of_green_bins);
    int blue_idx = bin_index(image(pixel_idx)[0], number_of_blue_bins);
    histogram[blue_idx * number_of_green_bins * number_of_red_bins 
        + green_idx * number_of_red_bins + red_idx] += 1;
}

但是cv :: calcHist的以下用法会产生不同的结果

cv::Mat block = image(rect of the patch);
const int channels[] = {0, 1, 2};
const int histSize[] = {number_of_red_bins, number_of_green_bins, number_of_blue_bins};
constexpr int histSizeDims = sizeof(histSize) / sizeof(const int);
const float range[] {0.0f, 1.001f};
const float* histRanges[] = {range, range, range};
cv::Mat result;

cv::calcHist(
        &block,
        1,
        channels,
        cv::Mat(),
        result,
        histSizeDims,
        histSize,
        histRanges,
        true, false);

你能告诉我calcHist如何用多维直方图表现吗?谢谢你的帮助!

0 个答案:

没有答案