【发布时间】:2015-01-19 15:54:21
【问题描述】:
我是 OpenCV 新手,我将编写以下代码来计算 rgb 图像的量化和加权直方图。
M 是权重图。这是一个与输入图像具有相同尺寸的 Mat 对象。 首先,我将所有(双)值放在 [1,8] 范围内。然后,对于 rgb 值 (1,1,1), (1,1,2), .... (8,8,8) 的每个三元组,我想对相应权重的值求和。因此,当我找到三元组 (1,2,1) 时,我知道它对应于 bin 9(即第 9 个 bin)。所以我尝试将 M(x,y) 的值与当前 bin 累加器 H 相加,但它不起作用!
注意:在我的 matlab 代码中,我使用 accumarray 但是,当我这样做时出现了问题
H.at<uchar>(idx,1) = H.at<uchar>(idx,1) + M.at<double>(Point(x, y));
如果我运行 M.type() 它返回值 3
Mat H = Mat::zeros(1,512,CV_8UC1);
for (int y = 0; y < R.rows; ++y) {
for (int x = 0; x < R.cols; ++x) {
intensity = R.at<double>(Point(x, y));
p = intensity[0];
r = 1 + floor(p * 7.9999);
cout << "R index = " << r << endl << endl;
intensity = G.at<double>(Point(x, y));
p = intensity[0];
g = 1 + floor(p * 7.9999);
cout << "G index = " << g << endl << endl;
intensity = B.at<double>(Point(x, y));
p = intensity[0];
b = 1 + floor(p * 7.9999);
cout << "B index = " << b << endl << endl;
C.at<cv::Vec3b>(x, y)[0] = r;
C.at<cv::Vec3b>(x, y)[1] = g;
C.at<cv::Vec3b>(x, y)[2] = b;
//idx = 1 +((r-1)*64 + (g-1)*8 + (b-1)*1 )
//Here i don't sum 1 because in C the indices starts from 0
idx = (r - 1) * 64 + (g - 1) * 8 + (b - 1) * 1;
H.at<uchar>(idx,1) = H.at<uchar>(idx,1) + M.at<double>(Point(x, y));
cout << endl << idx;
}
}
编辑 好的,在你的建议之后我说一些改变,这些是C和H的初始化
cv::Mat C(doubleRed.rows, doubleRed.cols, CV_8UC3);
Mat H = Mat::zeros(1, 512, CV_16UC1);
我解决了发生的错误
C.at<cv::Vec3b>(x, y)[0] = r;
C.at<cv::Vec3b>(x, y)[1] = g;
C.at<cv::Vec3b>(x, y)[2] = b;
将 x 和 y 反转它可以工作...但我希望了解为什么我必须这样做....但是当我尝试使用 H 的函数 at() 时代码仍然崩溃:
H.at<uchar>(idx, 1) = H.at<uchar>(idx, 1) + M.at<double>(Point(x, y));
【问题讨论】:
标签: c++ opencv image-processing histogram