【问题标题】:OpenCV - How to project RGB image to log (R/G) ~ log (B/G) space?OpenCV - 如何将 RGB 图像投影到 log (R/G) ~ log (B/G) 空间?
【发布时间】:2020-06-10 21:56:41
【问题描述】:

我正在尝试将 RGB 图像投影到 log (R/G) ~ log (B/G) 坐标系。

根据herehere的定义,log (R/G) ~ log (B/G)空间计算如下:

基本上,我想要两个数组 X 和 Y(我使用 Mat 作为数组),其中:

这是我尝试过的:

计算 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);

但是当我尝试其余的指令以获得结果时,我的结果与他们的完全不同。

计算内在图像:

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

我认为我在计算 X*Y* 矩阵时做错了。因为当我尝试使用 alpha 的任何值时,结果不会正确:

这是图片:

这是预期的结果:

这就是我得到的:

这是第一篇论文的截图:

【问题讨论】:

    标签: c++ opencv mat logarithm color-space


    【解决方案1】:

    一个小问题(抱歉,我还不能评论):

    不应该是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);

    以及如何计算 α?

    编辑

    这是来自您的2nd posted source 的屏幕截图。

    如您所见,灰度图像 G inv 是通过您的X_star:intrinsic = X_star * cos(alpha) + Y_star * sin(alpha); 计算得出的。 您发布的第一个方程式也是如此。

    我无法访问您发布的第一个链接,它不是免费的。

    【讨论】:

    • 感谢您的回答!但根据最后一个公式,应该根据XY 计算内在图像。 X*Y* 只是为了计算正确的alpha。要计算alpha,我们有:alpha = arctan(sign(cov(X*,Y*)) * sum(abs(Y)) / sum(abs(X))。但我知道logarithms 的计算是错误的,因为任何alpha 的结果都不正确。
    • 正如您在我的编辑中看到的那样,XY 的计算是基于分别减去 x_bary_bar 来自X,分别。 Y。这是你的X_starY_star
    • 我添加了第一篇论文的截图。我的实现就是基于此。但是alpha的所有值的结果都是错误的,所以对数应该有问题。
    • 您错过了 b) 中的第一句话“向量 XY 被移除了中心”。这是在您的 X_starY_star 中计算的:您从 XY 中删除中心(平均值)
    • 您必须使用您的X_starY_star 来计算I_inv。对于x*y*,您必须计算X_starY_star 的平均值并计算x* = X_star - mean(X_star)y* 也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多