matlab - 使用 for 循环缩小和重新缩放图像
问题描述
我对 Matlab 比较陌生,并试图理解为什么一段代码不起作用。
我有一个 512x512 图像需要缩小到 256,然后重新调整到 512。我对数学的理解是,我需要指图像中的像素才能得到 256,然后将它们加起来得到 512。这是正确的吗?以下是我正在查看的代码,如果有人可以解释我出了什么问题(它给出了一个空白的白色图像),我将不胜感激:
w = double(imread('walkbridge.tif'));
%read the image
w = w(:,:,1);
for x = 1:256
for y = 1:256
s256(x,y) = (w(2*x,2*y)+ w(2*x,(2*y)-1) + w((2*x)-1,2*y)+ w((2*x)-1,(2*y)-1))/4;
end
end
for x = 1 : 256
for y = 1 : 256
for x1 = 0:1
for y1 = 0:1
R1((2*x)-x1,((2*y)-y1)) = s256(x,y);
end
end
end
end
imshow(R1)
解决方案
我让您的代码正常工作,因此您的图像数据中可能有一些错误的值。也就是说,如果您的图像的值在 0..127 或类似范围内,它很可能会显示为全白。默认情况下,imshow
期望颜色通道在 0..1 范围内。
您可能还想通过索引原始数组而不是访问单个元素来稍微简化代码。这样代码甚至很容易更改:
half_size = 256;
w = magic(2*half_size);
w = w / max(w(:));
figure()
imshow(w)
s = zeros(half_size);
for x = 1:half_size
for y = 1:half_size
ix = w(2*x-1:2*x, 2*y-1:2*y);
s(x,y) = sum(ix(:))/4;
end
end
for x = 1:half_size
for y = 1:half_size
R1(2*x-1:2*x, 2*y-1:2*y) = s(x,y);
end
end
figure()
imshow(R1)
我想计算甚至可以以某种方式向量化而不是循环,但我没有打扰。
推荐阅读
- typescript - 为什么使用 cordova google-plus 插件会弹出两次“确认您的选择”?
- python - 快速替换字符串中的字符并检查子字符串是否为回文
- apache-spark - Cassandra + Spark 执行器超融合
- android - 如何从 Firestore 服务器获取时间戳,而无需担心设备时钟与 Firestore 不同步的情况
- c++ - Clang 工具(clang-tidy、iwyu 等)的单遍运行以及编译?
- matlab - fmincon:优化 MPC 的问题
- reactjs - 为什么我需要在 `useEffect` 中定义事件处理程序 `handleStatusChange`?
- r - 在 levelplot 中每种颜色的中间放置刻度
- java - 无法使用 geoTools 获取 FeaturesCollection 中的内容
- flutter - 删除 Firebase 存储中的所有文件