在对 MATLAB 中的图像应用stdfilt(i, ones(5, 5))
等滑动窗口操作后,我想将边框像素(使用填充计算的像素)设置为NaN
以将它们标记为无意义。在此示例中,我将最外层的两行和列设置为NaN
。给定一个 M * M 窗口,如何将此宽度为 (M - 1)/2 像素的边框设置为特定值?
假设矩阵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,在NaN
的位置为 1。然后查找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;