如何使matlab中曲线平滑?

如何使matlab中曲线平滑?,第1张

有两种方法可以画平滑曲线,第一罩备种是拟合的方法,第二种是用spcrv。

其实原理应该都一样就是插值。下面是源程序,大家可以根据需要自行选择,更改拟合的参数。

clc,clear

a = 1:1:6  %横坐标

b = [8.0 9.0 10.0 15.0 35.0 40.0]%纵坐标

plot(a, b, 'b')   %自然状态的画图效果

hold on

%第一种,画平滑曲线的方法

c = polyfit(a, b, 2)  %进行拟合,c为2次拟物前毁合后的系数

d = polyval(c, a, 1)  %拟合后,每一个横坐悔颂标对应的值即为d

plot(a, d, 'r')       %拟合后的曲线

plot(a, b, '*')       %将每个点 用*画出来

hold on

%第二种,画平滑曲线的方法

values = spcrv([[a(1) a a(end)][b(1) b b(end)]],3)

plot(values(1,:),values(2,:), 'g')

本质上是数据插值,把粗分辨率数据插樱裂高值成细网格

记录一个例子:

B3.m程序:

clear

clc

%% 读取数据

Lon_Data=ncread('2020-Jan-(1-31)-(0-24)-(150-450)-RH.nc','longitude')

Lat_Data=ncread('2020-Jan-(1-31)-(0-24)-(150-450)-RH.nc','latitude')

RH_Data=ncread('2020-Jan-(1-31)-(0-24)-(150-450)-RH.nc','r')

level=ncread('2020-Jan-(1-31)-(0-24)-(150-450)-RH.nc','level')

%% 计算250,300hPa平均湿度,6点和12点脊尺平均

r250=squeeze(RH_Data(:,:,find(level==250),:))

r300=squeeze(RH_Data(:,:,find(level==300),:))

r250_mean=nanmean(r250,3)%平均函数

r300_mean=nanmean(r300,3)

%% 读.shp 地区边源闹界

map=shaperead('广西.shp')

bou_x=[map(:).X]%提取经度

bou_y=[map(:).Y]%提取纬度

%% 掩摸,抠数据

latlim_GX = [21 26.5]

lonlim_GX = [104 112.5]

lat_GX=21:0.02:26.5

lon_GX=104:0.02:112.5

M=length(lat_GX)

N=length(lon_GX)

R = georasterref('RasterSize',[M N],'ColumnsStartFrom','south','LatitudeLimits',latlim_GX,'LongitudeLimits',lonlim_GX)

Z = zeros(R.RasterSize)

Z = vec2mtx(bou_y,bou_x,Z,R,'filled')

Z(Z>1)=nan

Z(Z==1)=0

%% 湿度插值

[X,Y]=meshgrid(lon_GX,lat_GX)

[plon,plat]=meshgrid(Lon_Data,Lat_Data)

r_250=griddata(double(plon),double(plat),r250_mean',X,Y)

r_250(isnan(Z))=nan

r_300=griddata(double(plon),double(plat),r300_mean',X,Y)

r_300(isnan(Z))=nan

%% 272.6hpa高度插值

l=[250 300]

r_272=nan(276,426)

for m=1:276

for n=1:426

y=[r_250(m,n),r_300(m,n)]

r_272(m,n)= interp1(l,y,272.6)%线性插值

clear y

end

end

%% 绘图

subplot(2,2,1)

contourf(X,Y,r_272,100,'LineStyle','none')

hold on

plot(bou_x,bou_y,'r','LineWidth',1.5)

hold off

box on

hc = colorbar

set(gca,'Clim',[16 26])

set(hc,'linewi',1)

set(hc,'YTick',[16:1:26])

set(get(hc,'Title'),'string','(%)','fontsize',16,'fontweight','Bold')

set(gcf,'color','white')

set(gca,'Xlim',[104 113])

set(gca,'Ylim',[21 27])

set(gca,'XMinorTick','on','TickDir','out')

set(gca,'fontweight','Bold','fontsize',16,'linewi',1)

xlabel('经度','FontSize',16)

ylabel('纬度','Fontsize',16)

set(gca,'fontweight','Bold','fontsize',15,'linewidth',2)

title('272.6 hPa','fontweight','Bold','fontsize',18)

效果图:

你好,首先读取文件到一个变量枯消A

A = imread(文件)就是读入文件

然后你吧A的一部分取出来,然后记住坐标

比如说 b = A(1:100,40:100) 括号里是x和y的范围

然后你可以用gaussian做平滑处理

先设置一个过滤器,用来处理图像 你可以用help fspecial来看介绍,有不同的过滤器。

gaussianFilter = fspecial('gaussian', [7, 7], 5)

然后你用

imfilter(b, gaussianFilter, 'symmetric', 'conv')

处理以后

你在把b放回A里面

A(1:100,40:100) = b 不知道行不行,羡行只要你放回原位就可以没派知了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12507442.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存