2D具有可变西格玛高斯滤波器

80次(最近30天)
乍得格林
乍得格林 在2019年4月1日
评论: 图像分析 在2019年4月4日
我有一个大的数据集的网格我想低通滤波器。美中不足的是,需要指定为网格的每个像素的不同的西格玛值。
适马的单个值对整个电网是容易 imgaussfilt, 因此,例如,我使用3这样的西格马值可以过滤网格I:
数据的%A格:
I = 10 *兰特(100);
%的格栅,过滤,标准差= 3:
如果= imgaussfilt(I,3);
但我不希望土色西格玛的单个值对整个电网。相反,我要指定每一个像素不同的西格玛。对于这个100x100的网格可以很容易地通过每一行和每一列循环,过滤电网这样西格玛的规定值:
对应于数据的网格西格玛值的%A格:
西格玛= ABS(峰(100))+ 0.1;
%预分配:
IF2 = NaN的(大小(I));
通过每行和列%循环:
对于行= 1:尺寸(I,1)
对于COL = 1:尺寸(I,2)
%使用西格玛(行,列)在整个网格执行高斯滤波器:
TMP = imgaussfilt(I,西格马(行,列));
%仅保存对应于该行和col值:
IF2(行,列)= TMP(行,列);
结束
结束
嵌套的循环方法给出我想要的答案,但它是不雅的,和缓慢的非常大的网格。有没有更好的方法来定义一个局部变滤波器?

0评论

登录发表评论。

答案(1)

沃尔夫冈Schwanghart
沃尔夫冈Schwanghart 在2019年4月3日
编辑:沃尔夫冈Schwanghart 在2019年4月3日
嗨乍得,
下面是一些代码使用nlfilter该做的伎俩。为了更有效率,我创建了一组有限的滑动窗口的查询表。
%变量的标准偏差
ST = 1:100;
滑动窗口的大小%
%应该是一个奇数
M = 101;
kcenter =小区(M / 2);
%的过滤器单元阵列
ST = cellfun(@(X)fspecial(“高斯”,[M M],x)时,num2cell(ST),“互可操作性框架”,假);
%的图像进行平滑
A =兰特(200);
%图像的变量的标准偏差
STSIZE =兰迪(20,尺寸(A))+ 5;
%图像的线性指数
IX =重塑(1:numel(A),大小(A));
B = nlfilter(IX,[M M],...
@(IX)的乐趣(Ⅸ,A,STSIZE,ST,kcenter));
于imagesc(B)
功能OUT =乐趣(Ⅸ,A,STSIZE,ST,kcenter)
如果任何(IX(:) == 0)
%的图像是零填充
%的回报楠
OUT =南;
其他
%GET窗口
IXC = IX(kcenter,kcenter);
stsize = STSIZE(IXC);
F = {ST} stsize;
A = A(ⅸ);
出= F(:)'*一个(:);
结束
结束

3条评论

乍得格林
乍得格林 在2019年4月3日
呵呵,有意思,我不知道的 nlfilter 。然而,对于高斯滤波器中,窗口的大小应当根据滤波器的西格玛变化。有没有办法做到这一点不保持m和n固定的吗?
沃尔夫冈Schwanghart
沃尔夫冈Schwanghart 在2019年4月3日
诚然,窗口的大小是固定的,但高斯核的标准偏差变化。现在我已经更新了代码。而m和n保持固定(由需要 nlfilter ),内核的标准偏差自由变化,但它从来没有扩展内核的大小。
图像分析
图像分析 在2019年4月4日
我第二个这个答案 - 我要()也建议nlfilter,直到我看到沃尔夫冈打我给它。

登录发表评论。