Я пытаюсь вычислить два вектора X
и Y
на основе этой формулы:
![enter image description here](https://i.stack.imgur.com/tkUV0.png)
![enter image description here](https://i.stack.imgur.com/N1U3l.png)
где:
Я решил использовать два Mat s в качестве векторов:
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))
Я изменил нулевые значения на единицы из-за этого в documentmentaion :
void log(InputArray src, OutputArray dst);
![enter image description here](https://i.stack.imgur.com/Rv7Gd.png)
где C - большое отрицательное число (около -700 в текущая реализация).
Я не хочу больших отрицательных чисел, потому что позже я собираюсь суммировать все значения пикселей X
и Y
, и сумма станет -nan
.
Я уверен, что что-то не так с моим логарифмом, потому что результат неправильный. Как я должен сделать это правильно?
Например, для этого изображения:
![enter image description here](https://i.stack.imgur.com/ziFiy.png)
The * Значения 1066 * и Y
должны быть такими (синие точки):
![enter image description here](https://i.stack.imgur.com/qqObh.png)
Но в моем случае они таковы:
![enter image description here](https://i.stack.imgur.com/XarRm.png)
Это коврики:
![enter image description here](https://i.stack.imgur.com/IDVLL.png)
Согласно ответ ниже, я добавил это к коду, чтобы избежать деления нуля:
R += 1;
B += 1;
G += 1;
Но теперь мой график все еще выглядит иначе:
![enter image description here](https://i.stack.imgur.com/Cy5Z4.png)
на основании следующего ответа это было исправлено (функция логарифма OpenCV берет журнал абсолютных значений):
![enter image description here](https://i.stack.imgur.com/jAF2w.png)