1

在对 MATLAB 中的图像应用滑动窗口操作后stdfilt(i, ones(5, 5)),我想设置边框像素,即使用填充计算的像素,以NaN将它们标记为无意义。在此示例中,我会将最外面的两行和两列设置为NaN. 给定一个 M * M 窗口,如何将 (M - 1) / 2 像素宽的边框设置为特定值?

4

3 回答 3

3

假设,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等等。

于 2012-11-11T23:06:13.173 回答
0

这将完成这项工作,但这似乎是图像处理工具箱中的那种功能。

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;
于 2012-11-12T15:08:01.930 回答
0

首先找到NaN矩阵中的位置。假设您的图像名称是 A。

a = isnan(A);

这将在数​​字位置创建a0 矩阵,在 位置创建 1矩阵NaN。然后找到Nan元素的位置:

[x,y]=find(a==1);

然后将它们替换为值V

for i=1:length(x)
   A(x(i),y(i)) = V;
end
于 2012-11-11T23:03:55.973 回答