【发布时间】:2012-10-31 10:16:24
【问题描述】:
在 MATLAB 中对图像应用 stdfilt(i, ones(5, 5)) 之类的滑动窗口操作后,我想将边框像素(使用填充计算的像素)设置为 NaN 以将它们标记为无意义。在此示例中,我会将最外面的两行和两列设置为 NaN。给定一个 M * M 窗口,如何将 (M - 1) / 2 像素宽的边框设置为特定值?
【问题讨论】:
标签: matlab image-processing sliding-window
在 MATLAB 中对图像应用 stdfilt(i, ones(5, 5)) 之类的滑动窗口操作后,我想将边框像素(使用填充计算的像素)设置为 NaN 以将它们标记为无意义。在此示例中,我会将最外面的两行和两列设置为 NaN。给定一个 M * M 窗口,如何将 (M - 1) / 2 像素宽的边框设置为特定值?
【问题讨论】:
标签: matlab image-processing sliding-window
假设,r 是矩阵(stdfilt 的结果)。这是一个如何将 NaN 分配给边界的示例。
一般来说,您需要指定正确的索引。
>> r = rand(4)
r =
0.8147 0.6324 0.9575 0.9572
0.9058 0.0975 0.9649 0.4854
0.1270 0.2785 0.1576 0.8003
0.9134 0.5469 0.9706 0.1419
>> r([1, end], :) = nan
r =
NaN NaN NaN NaN
0.9058 0.0975 0.9649 0.4854
0.1270 0.2785 0.1576 0.8003
NaN NaN NaN NaN
>> r(:, [1, end]) = nan
r =
NaN NaN NaN NaN
NaN 0.0975 0.9649 NaN
NaN 0.2785 0.1576 NaN
NaN NaN NaN NaN
更新: 一般来说,由于图像是一个矩阵,你的问题是“如何设置某些矩阵值?”。答案是:“使用矩阵的索引”。有很多方法可以做到这一点(例如,通过构建索引矩阵、逻辑掩码或使用行/列坐标)。使用哪种方法的决定通常取决于此特定任务的操作速度。例如,如果您需要用 NaN 替换零,则使用逻辑掩码会更快:r(r == 0) = nan,等等。
【讨论】:
首先找到NaN 在您的矩阵中的位置。假设您的图像名称是 A。
a = isnan(A);
这将创建矩阵a,0 在数字位置,1 在NaN 位置。然后找到Nan元素的位置为:
[x,y]=find(a==1);
然后将它们替换为值V 为:
for i=1:length(x)
A(x(i),y(i)) = V;
end
【讨论】:
这将完成这项工作,但这似乎是图像处理工具箱中的那种功能。
mask = logical(ones(size(i)));
width = (m - 1) / 2;
mask(width + 1:size(i, 1) - width, width + 1:size(i, 2) - width) = 0;
i(mask) = NaN;
【讨论】: