【问题标题】:2D/3D plot of image processing filters图像处理过滤器的 2D/3D 图
【发布时间】:2012-09-18 08:00:53
【问题描述】:

我试图了解 Matlab 中的 2D 和 3D 绘图功能,关于图像处理过滤器,如箱线图、高斯、墨西哥帽等...

我只得到了过滤器的内核,例如一个 5x5 矩阵,其中包含每个单元的系数。 ezsurfc 不起作用,我不明白。 surf 反而有效,但我不知道网格以及如何使其更细化和平滑?

我对 surf 的理解是,我需要每个参数都具有相同的尺寸,那么我应该如何在不使内核为 20x20 甚至更大的情况下做到这一点? 这个想法是,我得到一个像例子一样的输出,我已经发布了。我提到了过滤器的 20x20 网格掩码,因为看起来平滑度和扁平化需要更多的系数,而不仅仅是 5x5……我是对的还是完全错的?

我已经尝试了以下 matlab 代码,例如拉普拉斯过滤器:

[x,y] = meshgrid(1:1:5); %create a 5x5 matrix for x and y (meshes)
z = [0 1 2 1 0; 1 3 5 3 1;2 5 9 5 2; 1 3 5 3 1;0 1 2 1 0]; % kernel 5x5
surf(x,y,z);

这给了我输出:

那么,如何从 5x5 内核信息中生成精细的 2D 和 3D 图呢? 提前非常感谢!

P.S.:希望我的代码缩进没有弄乱……否则请随意编辑 - 这是我在 StackOverflow 上的第一篇文章。 :-)

我想要得到的,就像这两个例子:

【问题讨论】:

  • 您是否要在 20x20 网格上绘制 5x5 内核?是这个主意吗?
  • 这个想法是,我得到一个像示例一样的输出,我已经发布了。我提到了过滤器的 20x20 网格掩码,因为看起来平滑度和扁平化需要更多的系数,而不仅仅是 5x5……我是对的还是完全错的?
  • @mchlfchr:除非您知道底层函数(例如它是高斯函数),否则您将无法神奇地对内核进行上采样并揭示更多细节。
  • 正如@Jonas 指出的那样,您不能从如此低的速率进行上采样(通过任何插值函数的值插值),这相当于重建在对“所需”进行下采样期间丢失的信息核心。您需要对底层函数做出假设,并近似或拟合您的内核数据。请参阅我对此的回答中的更新。
  • 我害怕这个答案......但它绝对有道理,因为奈奎斯特/香农定理......谢谢你们俩

标签: matlab image-processing plot convolution


【解决方案1】:

您可以使用interp2 在相同的网格大小上查找中间值以进行可视化

step = 0.1; % granularity
[xn,yn] = meshgrid(1:step:5); % define finer grid
zn = interp2(x,y,z,xn,yn); % get new z values 
surf(xn,yn,zn);

请注意,您将使用默认的线性插值方法获得最接近原始内核的近似值,即interp2(x,y,z,xn,yn,'linear')。使用其他方法将导致使用更平滑的内核,但它们的 3D 形状会有所不同。所以这取决于你的用途和应用。

更新

您可以通过尝试使用已知内核来逼近您的数据,从而绕过不适定问题的上采样到更高分辨率,然后您可以对其进行调整。

例如,由于您给出了一个对称核的示例,它在最大值附近各向同性地衰减,您可以使用高斯函数。 MATLAB 通过fspecial 函数实现这一点。

假设底层函数(例如高斯)并使用从当前内核定义的参数(即,将函数拟合到您的数据)

% use max location, amplitude and std from your kernel
max_z = max(z(:));
std_z = std(z(:));

% Set of tunable parameters (size of grid & granularity)
bounds_grid = [30 30]; grid bounds
step = 0.5; % resolution

% Grid
siz = (bounds_grid-1)/2;
[x,y] = meshgrid(-siz(2):step:siz(2),-siz(1):step:siz(1));

% Gaussian parameters
s = std_z; m = 0;

% Analytic function
g = exp(-((x-m).^2 + (y-m).^2)/(2*s*s));
g(g<eps*max(g(:))) = 0;
g = max_z*g./max(g(:));

surf(g);

这样您尊重高斯波瓣中的内核参数,但控制最终高斯内核的网格大小和分辨率。

一些例子:

【讨论】:

  • 似乎有点元使用过滤器来平滑过滤器图。我喜欢它。
  • 感谢您的回答...也许我的帖子有点误导:我不仅想绘制 5x5 区域。相反,它应该变得更平滑并变平为零。另外像这两个例子:imgur.com/Cj3gwimgur.com/CQrXK我也更新了我的初始帖子。
猜你喜欢
  • 2012-01-02
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多