我正在尝试将RGB图像投影到日志(R / G)〜日志(B / G)坐标系中。
根据here和here的定义,日志(R / G)〜日志(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
的任何值来执行此操作时,结果提示不正确:这是图像:
这是预期的结果:
这就是我得到的:
这是第一篇论文的屏幕截图:
最佳答案
一个小问题(对不起,我无法发表评论):
不应使用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);
计算的。您发布的第一个方程式也是如此。
我无法访问您发布的第一个链接,它不是免费的。
关于c++ - OpenCV-如何将RGB图像投影到日志(R/G)〜日志(B/G)空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60423881/