9

渐变图像

蓝色情节是原始情节(红色)的嘈杂情节。有没有办法将蓝色图近似为红色图?

4

4 回答 4

14

让我们定义一个波浪函数:

x = 0:.1:20;
y1 = 5*sin(x) + 2*x - x.^2 +.3*x.^3 - .2*(x-15).^4 - 10*x.^2.*cos(x./3+12).^3 + .5*(x-12).^4;

并添加大量噪音:

r = randi(1000,1,201) - 500;
y2 = y1+r;

现在制作一个一维高斯滤波器,对其进行归一化并与我们的函数进行卷积:

g = gausswin(20); % <-- this value determines the width of the smoothing window
g = g/sum(g);
y3 = conv(y2, g, 'same')

让我们看看结果

figure;
hold on; 
plot(y1, 'r', 'linewidth', 3); 
plot(y2, 'b'); 
plot(y3, 'g', 'linewidth', 3);

红色是原始函数,蓝色是嘈杂版本,绿色是平滑的“恢复”函数。

平滑函数的折线图

于 2012-10-20T12:38:12.157 回答
11

另一种选择是使用“平滑”。我喜欢使用它,因为它是单行函数。使用@Junuxx 上一个答案的代码:

x = 0:.1:20;
y1 = 5*sin(x) + 2*x - x.^2 +.3*x.^3 - .2*(x-15).^4 - 10*x.^2.*cos(x./3+12).^3 + .5*(x-12).^4;
r = randi(1000,1,201) - 500;
y2 = y1+r;

现在应用平滑:

ys = smooth(x,y2,0.25,'rloess');
plot(x,y2,x,ys)

在此处输入图像描述

欲了解更多信息:

doc smooth
于 2012-10-20T16:27:57.053 回答
3

gausswin()需要信号处理工具箱

smooth()需要曲线拟合工具箱

如果你没有这些工具箱,这里有一个简单的smooth()实现:

平滑.m:

function yy = smooth(y, span)
    yy = y;
    l = length(y);

    for i = 1 : l
        if i < span
            d = i;
        else
            d = span;
        end

        w = d - 1;
        p2 = floor(w / 2);

        if i > (l - p2)
           p2 = l - i; 
        end

        p1 = w - p2;

        yy(i) = sum(y(i - p1 : i + p2)) / d;
    end
end

的结果y3 = smooth(y2, 15),使用@Junuxx 代码:

在此处输入图像描述

于 2015-09-03T14:53:44.337 回答
2

只是添加一个额外的选项:

cftool在matlab的提示符下使用:

在此处输入图像描述

于 2012-10-20T14:04:35.020 回答