OpenCV - Как проецировать RGB-изображение в лог (R / G) ~ лог (B / G) пространство? - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь проецировать изображение RGB в log (R / G) ~ log (B / G) систему координат.

Согласно определению здесь и здесь log (R / G) ~ log (B / G) пространство вычисляется следующим образом:

enter image description here

По сути, я хочу два массива X и Y (я использую Mat в качестве массива), где:

enter image description here

enter image description here

Это то, что я пробовал:

вычисление X * и Y *:

    Mat input = imread("an RGB image");
    Mat X, Y, B, G, R, input_f;
    input.convertTo(input_f, CV_32FC3);
    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);
    divide(B, G, div_y);
    log(div_x, X);
    log(div_y, Y);
    X.setTo(0, Mat(X < 0));
    Y.setTo(0, Mat(Y < 0));

    //-- calculate X* , Y* vectors
    Mat X_star, Y_star;
    Scalar x_bar = mean(X);
    Scalar y_bar = mean(Y); 

    subtract(X, Scalar(x_bar), X_star);
    subtract(Y, Scalar(y_bar), Y_star);

Но когда я пытаюсь выполнить остальные инструкции для получения результата, мой результат совсем не похоже на их.

enter image description here

вычисление intrinsi c image:

    Mat intrinsic;
    intrinsic = X * cos(alpha) + Y * sin(alpha);
    imshow("intrinsic", intrinsic);

Я думаю, что я что-то не так при расчете матриц X* и Y*. Потому что, когда я пытаюсь это сделать с любым значением alpha, результат dow не становится правильным:

Это изображение:

enter image description here

Это ожидаемый результат:

enter image description here

Вот что я получаю:

enter image description here

Вот скриншот первой статьи: enter image description here

1 Ответ

2 голосов
/ 27 февраля 2020

Один маленький вопрос (извините, я пока не могу комментировать):

Разве X

intrinsic = X * cos(alpha) + Y * sin(alpha);

не должно быть X_star вместо?

intrinsic = X_star * cos(alpha) + Y_star * sin(alpha);

В противном случае вы могли бы написать subtract(X, Scalar(x_bar), X);

А как вам вычислить α?

Редактировать enter image description here

Это скриншот из вашего 2-го опубликованного источника .

Как вы можете видеть, серое изображение G inv вычисляется с помощью вашего X_star: intrinsic = X_star * cos(alpha) + Y_star * sin(alpha);. Это также относится и к первому уравнению, которое вы опубликовали.

Я не могу получить доступ к первой опубликованной вами ссылке, это не бесплатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...