我正在使用双边滤镜来处理图像,我想在一个“框”中打印由于更改参数而产生的滤镜图像。这是我运行的脚本调用过滤器并打印图像,结果很糟糕,它打印完整的图像,然后是一个非常小的图片的子图,你不能告诉任何东西。有人能告诉我在subplot / subimage命令中我做错了什么吗?
I = im2double(imread('cat.jpg'));
sig_d = 1;
sig_r = 10;
for i=1:10
sig_d = i;
for j=1:10
sig_r = 10*j;
J = bilateral(I,sig_d,sig_r);
figure,subplot(10,10,j), subimage(J);
end
end
我的目标是一个10x10的块,其中的每个图像都是独特的,与点不相似。是否有可能完成?
答案 0 :(得分:2)
1)您正在内循环的每个阶段创建多个数字;你只想要(我想)一个数字,所以你需要把命令figure
放在你的嵌套循环之外。
2)您对subplot
的来电永远不会填满整个数组
subplot(10,10,j)
在图中创建一个10乘10的子图阵列,并将当前轴设置为数字j
。因此,如果您想要使用10 x 10图像数组填充图形,则需要按顺序调用subplot(10,10,1)
到subplot(10,10,100)
。
另一种可行的方法是,如果输出图像J的大小始终相同,则预先分配正确大小的单个矩阵并使用montage
。例如:
在循环之前,预分配:
I2 = zeros(n,m,1,100); % n and m are the size of the output image J
在循环内部,将输出分配给预分配矩阵
I2(:,:,:,z) = J; % z is your counter from 1 to 100
之后,显示蒙太奇
montage(I2,'Size',[10 10]);
这样做的好处是,每次计算时都不会丢弃J
- 所以如果你想试验如何显示输出,你可以。
答案 1 :(得分:1)
首先,删除对figure
的调用。每次都会打开一个新窗口
您的图像也会相互覆盖,因为subplot
计算子图(在本例中为100)并使用第3个参数来确定要绘制的子图。您的代码将仅绘制到最顶行
要解决此问题,请使用subplot(10,10,(i-1)*10+j)
,这会考虑您的i
(在这种情况下为行)。如果您想以columwise的方式显示图像,请使用subplot(10,10,(j-1)*10+i)
。
至于图像的大小,你真的没什么可做的。如果要以10x10网格显示它们,一个屏幕上将有100个图像,因此每个图像都必须相当小。