【问题标题】:matrix dimension error in matlab codematlab代码中的矩阵维数错误
【发布时间】:2023-04-05 03:07:01
【问题描述】:

我正在 matlab 中尝试特定代码,但收到错误
Error using ==> plus
Matrix dimensions must agree.

在这一行

LL_1=LL+k;

k=w*alpha;[LL,LH,HL,HH] = dwt2(X,'db1','d');X=imread('cameraman.tif'); X=im2double(X);
请帮助我如何解决这个错误?

编辑:我浏览了这里的一篇文章并尝试使用 bsxfun

LL_1=bsxfun(@plus,LL+k);  

但这并不能解决问题

编辑 2:代码是关于使用 dwt 算法的数字图像水印,我在浏览互联网时发现了这个代码,但它给出了我上面讨论的错误。
我已经发布了代码的前半部分,直到出现错误。
希望我的回复对解决错误有用

%loading cover image 
X=imread('cameraman.tif'); 
X=im2double(X); 
[F1,F2]=wfilters('db1','d'); 
[LL,LH,HL,HH] = dwt2(X,'db1','d');

%watermark image 
b=imread('copyright.bmp'); 
level=graythresh(b); 
w=im2bw(b,level); 
w=double(w); 
alpha=0.09; 
k=w*alpha; 
LL_1=bsxfun(@plus, LL, k); 
Y=idwt2(LL_1,LH,HL,HH,'db1','d');

【问题讨论】:

  • 当您在编写的矩阵上使用size 时,您会得到什么?即size(LL)size(K)
  • LL 的值为:,k 的值为:
  • size(LL) ans = 171 210 3 size(k) ans = 273 286
  • 您的水印图片大于封面图片 - 是否允许?也许您需要将水印图像裁剪为 171 x 210 像素?
  • @Dan 我试过了,但它仍然给我一个错误:LL_1=bsxfun(@plus, LL, k); 错误是:两个输入数组的非单一维度必须相互匹配。

标签: matlab image-processing watermark bsxfun


【解决方案1】:

看起来将b 的大小重新调整为X 的大小(反之亦然)将解决您的问题。看完b试试,

 b=imresize(b,size(X))

那么@Dan 建议的bsxfun 应该可以工作...

【讨论】:

  • 我试过了,但仍然报错:Error using ==> iptcheckmap at 40 Function IMRESIZE expected its second input argument, MAP, to be a valid colormap. Valid colormaps cannot have values outside the range [0,1]. Error in ==> imresize>parsePreMethodArgs at 368 iptcheckmap(map, mfilename, 'MAP', 2); Error in ==> imresize>parseInputs at 263 [params.A, params.map, params.scale, params.output_size] = ... Error in ==> imresize at 140 params = parseInputs(varargin{:}); Error in ==> dwtcode at 10 b=imresize(b,size(X));
  • 那不妨试试b=imresize(b,size(squeeze(X(:, :, 1)))
  • @Dan 我尝试了上述建议,但它仍然给我一个错误:LL_1=bsxfun(@plus, LL, k); 尺寸不匹配
  • 这次 LL 和 k 的大小是多少?基本上bsxfun 工作size(squeeze(L(:,:,1))) 必须等于size(k)。如果XLL 具有不同的维度,那么您需要b=imresize(b,size(squeeze(LL(:, :, 1)))。顺便说一句,挤压可能没有必要,没有它就检查一下,如果你没有得到错误,那就把它关掉。
  • 我在这方面浪费了很多时间,但它不起作用,我已经尝试过这个并为我的项目使用另一个代码,它工作得很好。
【解决方案2】:

像这样尝试bsxfun

LL_1=bsxfun(@plus, LL, k); 

编辑: 合并上述建议的答案、Natan 答案的 cmets 和 OP 发布的新代码

%loading cover image 
X=imread('cameraman.tif'); 
X=im2double(X); 
[F1,F2]=wfilters('db1','d'); 
[LL,LH,HL,HH] = dwt2(X,'db1','d');

%watermark image 
b=imread('copyright.bmp');
b=imresize(b,size(squeeze(LL(:, :, 1)));
level=graythresh(b); 
w=im2bw(b,level); 
w=double(w); 
alpha=0.09; 
k=w*alpha; 
LL_1=bsxfun(@plus, LL, k); 
Y=idwt2(LL_1,LH,HL,HH,'db1','d');

【讨论】:

  • 您好,我试过了,但我收到错误消息“两个输入数组的非单一维度必须相互匹配。”
  • 请在LLk 上显示size() 的输出,就像@Count 建议的那样
  • 这是您要问的吗? LL 的值为:,k 的值为: 我刚刚在@Count 的问题中发布了相同的内容
  • 是的,那么您究竟想如何添加这两个?它们的尺寸没有一个匹配。我认为你需要重写你的问题,并包括更多关于你正在尝试做的事情的信息,以及walphaX 等输入的值以及编写顺序的代码
  • 请将其移出 cmets 并编辑您的问题。这里很难读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多