【发布时间】:2020-02-27 14:25:16
【问题描述】:
我正在尝试根据这个公式计算两个向量 X 和 Y:
地点:
我决定使用两个 Mat 作为向量:
Mat X, Y, B, G, R, input_f;
// read RGB image
Mat input = imread("an RGB image");
// convert to float to deal with larger numbers
input.convertTo(input_f, CV_64FC3);
// split the image into 3 channels
vector<Mat> channels(3);
split(input_f, channels);
B = channels[0];
G = channels[1];
R = channels[2];
// calculate X , Y vectors
Mat div_x, div_y;
divide(R, G, div_x); // R(p_i) / G(p_i)
divide(B, G, div_y); // B(p_i) / G(p_i)
div_x.setTo(1, Mat(div_x == 0)); // set zeros to ones to avoid large negative numbers
div_y.setTo(1, Mat(div_y == 0));
log(div_x, X); // X = log(R(p_i) / G(p_i))
log(div_y, Y); // Y = log(B(p_i) / G(p_i))
因为documentaion 中的这个原因,我将零值更改为一:
void log(InputArray src, OutputArray dst);
其中 C 是一个很大的负数(在当前实现中约为 -700)。
我不想要大的负数,因为稍后我要将X 和Y 的所有像素值相加,总和变为-nan。
我确定我取对数的方式有问题,因为结果是错误的。我应该如何以正确的方式做到这一点?
例如,对于这张图片:
X 和 Y 值应该是这样的(蓝点):
但就我而言,它们是这样的:
这些是垫子:
根据下面的答案,我将这个添加到代码中以避免零除:
R += 1;
B += 1;
G += 1;
但现在我的情节看起来仍然不同:
基于以下答案,已修复(OpenCV 对数函数采用绝对值的对数):
【问题讨论】:
-
出了点问题……因为结果是错误的您能否更具体地说明什么是错误的,即预期什么,得到了什么?
-
@S.M.我为这个问题添加了一个情节。纵轴为
log(B/G),横轴为log(R/G)。