使用 for 循环收缩
Shrinking with for loops
,我正在努力做到这一点,但稍作修改并使用 for
循环。
我的代码是这样的,我会解释我想要表达的内容,只是为了给你一些背景知识。
function output = shrinkx(img)
[r,c] = size(img);
output = zeros(r,c);
for x = 1:r
for y = 1:c
i mg = (img(x,y) + img(x+1,y) + img(x,y+1) + img(x+1,y+1))/4;
output = img;
end
end
end
我想做的是将 img
分配给适当的象限,然后将其除以四,但结果是它不起作用,因为我超出了图像的尺寸.我的另一种方法是找到一种关系来挑选彼此的像素,然后将其实现到代码中。任何帮助将不胜感激!
顺便说一下@rayryeng,你帮了我大忙,我很感激你所做的,但是对于这个特定的问题,我想知道你是否可以 'hint' 让我进入正确的方向而不是完全代码。不想表现得粗鲁什么的!如果我的方法完全不正确,以及我是否需要开始以不同的方式思考,因为这是我的第一门编码课程,请随时告诉我。再一次感谢你。
我注意到在你提出的所有问题中,你似乎对索引有问题。在此处发布更多问题之前,您真的应该查阅一些 MATLAB 教程。无论如何,您的代码几乎是正确的。您需要声明一个具有输入尺寸一半的输出图像,然后在每一步正确地索引到输出中。我不会像在其他帖子中那样在这里详细介绍,因为我确实在那里详细介绍了如何为放大和缩小图像建立索引,但看起来在这里您不仅想要缩小图像,而且还也做平滑处理。因此,借用 ,您只需修改该代码以包括从 2 x 2 块中获取像素。
您只需更改几处。一方面,您不再需要 factor
作为输入,因为现在只是 2。此外,您需要确保输出图像最初是 double
,以便在添加时值并找到局部平均值,图像不会饱和。您还需要将输入图像的类型更改为 double
,以确保不会发生饱和。
如果您将图像设置为与输入图像相同的类型,它不可避免地会使输出饱和,因为您将超过执行求和时读取图像的特定数据类型的最大值操作。当你完成输出中的每个像素时,只在最后 投射图像 :
function output = shrinkx(img) %// factor is not an input anymore
class_im = class(img); %// Save class of original image
img = double(img); %// Cast image to double for precision
[r, c] = size(img);
output = zeros(floor(r/2),floor(c/2)); %// Factor is now 2
[rnew, cnew] = size(output);
for x = 1:rnew
for y = 1:cnew
j = 2*(x-1) + 1; %// Change - factor is 2
i = 2*(y-1) + 1;
output(x,y) = (img(j,i) + img(j,i+1) + img(j+1,i) + img(j+1,i+1))/4; %// Change here
end
end
output = cast(output, class_im); %// Change
end
使用示例:
>> im = imread('cameraman.tif');
>> out = shrinkx(im);
>> imshow(out);
输入
输出
for
循环。
我的代码是这样的,我会解释我想要表达的内容,只是为了给你一些背景知识。
function output = shrinkx(img)
[r,c] = size(img);
output = zeros(r,c);
for x = 1:r
for y = 1:c
i mg = (img(x,y) + img(x+1,y) + img(x,y+1) + img(x+1,y+1))/4;
output = img;
end
end
end
我想做的是将 img
分配给适当的象限,然后将其除以四,但结果是它不起作用,因为我超出了图像的尺寸.我的另一种方法是找到一种关系来挑选彼此的像素,然后将其实现到代码中。任何帮助将不胜感激!
顺便说一下@rayryeng,你帮了我大忙,我很感激你所做的,但是对于这个特定的问题,我想知道你是否可以 'hint' 让我进入正确的方向而不是完全代码。不想表现得粗鲁什么的!如果我的方法完全不正确,以及我是否需要开始以不同的方式思考,因为这是我的第一门编码课程,请随时告诉我。再一次感谢你。
我注意到在你提出的所有问题中,你似乎对索引有问题。在此处发布更多问题之前,您真的应该查阅一些 MATLAB 教程。无论如何,您的代码几乎是正确的。您需要声明一个具有输入尺寸一半的输出图像,然后在每一步正确地索引到输出中。我不会像在其他帖子中那样在这里详细介绍,因为我确实在那里详细介绍了如何为放大和缩小图像建立索引,但看起来在这里您不仅想要缩小图像,而且还也做平滑处理。因此,借用
您只需更改几处。一方面,您不再需要 factor
作为输入,因为现在只是 2。此外,您需要确保输出图像最初是 double
,以便在添加时值并找到局部平均值,图像不会饱和。您还需要将输入图像的类型更改为 double
,以确保不会发生饱和。
如果您将图像设置为与输入图像相同的类型,它不可避免地会使输出饱和,因为您将超过执行求和时读取图像的特定数据类型的最大值操作。当你完成输出中的每个像素时,只在最后 投射图像 :
function output = shrinkx(img) %// factor is not an input anymore
class_im = class(img); %// Save class of original image
img = double(img); %// Cast image to double for precision
[r, c] = size(img);
output = zeros(floor(r/2),floor(c/2)); %// Factor is now 2
[rnew, cnew] = size(output);
for x = 1:rnew
for y = 1:cnew
j = 2*(x-1) + 1; %// Change - factor is 2
i = 2*(y-1) + 1;
output(x,y) = (img(j,i) + img(j,i+1) + img(j+1,i) + img(j+1,i+1))/4; %// Change here
end
end
output = cast(output, class_im); %// Change
end
使用示例:
>> im = imread('cameraman.tif');
>> out = shrinkx(im);
>> imshow(out);