我有一个关于对矩阵/图像进行二次采样的快速问题。我只是在使用for
和/或while
循环时尝试这样做。基本上问题是重申:
function output = subsample(img,2)
output = img(1:factor:end, 1:factor:end);
但是,现在我正在尝试重写该函数以执行完全相同的过程,但使用for
循环和/或while
循环并且不使用两个或更多" {{1 }}" (冒号)运算符,而不使用冒号运算符访问矩阵/向量元素。这就是我到目前为止所做的:
:
虽然我得到的是图片调整大小,但它全黑了,我试图弄清楚我哪里出错了,或者我是完全错了。我们将非常感谢任何正确方向的帮助。
答案 0 :(得分:5)
罪魁祸首是嵌套for
循环中的以下两个语句:
j = factor*j-1;
i = factor*i-1;
例如,如果我们设置factor = 2
,则执行factor*j - 1
更新j
将始终使j
在每次for
循环迭代时保持不变。具体来说,如果j = 1
最初使用j <- factor*j - 1
,您将获得j <- 2*1 - 1 = 1
,无论我们在循环中进行何种迭代,您都将获得j = 1
。因此,您只更新输出图像的左上角,此位置将一直覆盖,直到我们点击图像的最后一个像素,并且左上角最后是原始图像的最后一行和最后一列。这可能就是为什么你有一个黑色图像,因为你已经将输出图像初始化为全黑像素,但你只是更新图像中的一个像素。因此,您需要更改j
(当然还有i
)的更新方式。
我也会改变你接近问题的方式。相反,我们将迭代二次采样图像的尺寸,然后对于二次采样图像中的每个位置,我们将从原始图像中拉出右像素。给定子采样图像中的行和列位置(x,y)
以及子采样因子factor
,从原始图像访问的行和列位置(j,i)
为:
j = factor*(x-1) + 1;
i = factor*(y-1) + 1;
这假设x
和y
都从1开始。如果您从x
开始替换y
和1,2,...
的值,则可以看到上面的公式选择了依赖于factor
的正确像素。例如,如果factor = 2
,则替换x
的{{1}}和y
的值会给出:
1,2,...
正如你所看到的那样,我们正在跳过所有其他像素,这是有意义的,因为这是2的因素。我将把它留作练习,但如果你尝试使用任何其他值,你会看到我们正确地跳过正确的像素以从源中抓取正确的像素以复制到输出图像。
完成所有这些操作后,您可以修改以下代码:
j = 1, 3, 5, ...
i = i, 3, 5, ...
使用上面的代码,我使用function output = subsamplex(img,factor)
[r, c] = size(img);
output = zeros(r/factor,c/factor,class(img)); %// Cast to be sure
[rnew, cnew] = size(output); %// Change - get size of output
for x = 1:rnew %// Change for loop limits
for y = 1:cnew
j = factor*(x-1) + 1; %// Change
i = factor*(y-1) + 1;
output(x,y) = img(j,i);
end
end
end
运行它,如果您有图像处理工具箱,它是MATLAB附带的示例图像的一部分。它看起来像这样:
因此,如果我想以2倍的方式进行子采样,我们会这样做:
cameraman.tif
我明白了: