有一个由矩阵组成的3个线性方程组,由RGB图像表示。说
A = A1*x1 + A2*x2 + A3*x3 ......(Eq 1)
B= A1*x4 + A2*x5 + A3*x6 ........(Eq 2)
C= A1*x7 + A2*x8 + A3*x9 ........(Eq 3)
每个都是相同维度的3D。我执行了以下
A11=rgb2gray(A1);
x11=rgb2gray(x1);
A11 =double(A1) ; x11 = double(x11); b = A1*x1;
opts.UT = true; opts.TRANSA = false;
y1 = linsolve(x1,b,opts);
imshow(y1);
%目标是获得A1,A2,A3 在这样做时,以下问题浮出水面: 1.错误 输出y1与A1不一样,应该是A1。为什么会这样?请帮忙
答案 0 :(得分:0)
R,G和B空间是正交的。因此,您可以独立地解决每个集合。这里的问题是mtimes
,它是您的矩阵乘法运算符,不接受3D输入。
要解决此问题,您可以遍历R,G和B中的每一个,并对每个生成的2D矩阵使用linsolve。通常情况下,我不建议在MATLAB中使用任何循环,但是在这里,由于循环中只有3次迭代,所以不会有任何可辨别的开销。
如果您一次性解决所有这些问题(如果可能的话),您的答案将与您的答案没有任何不同,因为这三个空格是独立的。
修改强>
你编写方程的方式,xi
形成系数矩阵,Ai
是未知数。方程组可以紧凑地编写为XY=Z
,其中X
是由系数组成的3D矩阵,xi
用于每个颜色空间RGB
; Y
是一个2D矩阵,每个颜色空间中都有一个向量[A1, A2, A3]'
,而Z
也是每个颜色空间中带有向量[A, B, C]'
的二维矩阵。
假设色彩空间是最后一个维度,您可以尝试
[xPixels,yPixels,colorSpace]=size(X);
Y=zeros(yPixels,colorspace);
opts.UT=true; opts.TRANSA=false;
for i=1:colorspace
Y(:,i)=linsolve(X(:,:,i),Z(:,i),opts);
end
您必须根据您的问题设置矩阵X
,Y
和Z
。保持循环维度(在本例中为colorspace
)作为最外层维度是有帮助的,否则,您必须使用squeeze
来删除单例维度。