我尝试使用带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如何用多维直方图表现吗?谢谢你的帮助!