均方根高度(RMS Height)和相关性长度(Correlation Length)是描述土壤粗糙度的两个主要参数。因此,试验目标就是通过实地测量土壤表层的高度起伏,来求取以上两个参数。本次试验采用直接接触法测量土壤剖面起伏,直接接触式测量的优点是仪器制作材料易得,制作过程简单,测量结果可达到较高的精度(1~2mm)。
clear, clc
% 图片所在文件夹路径,可修改
dir = 'E:\土壤粗糙度\20171014_1st_selected\';
filename = uigetfile('*.JPG','Pick a file',dir);
roughness_picture = importdata([dir filename]); % 导入数据
%% 选出画图区域,并放大至该区域
% 获取屏幕分辨率
screensize = get(0,'ScreenSize');
% 最大化图片
figure('position',screensize)
imagesc(roughness_picture);
% 输入两点确定画图区域
uiwait(msgbox('请选择输入两个点,以确定画图区域'));
p = ginput(2);
% 放大区域的四个角
sp(1) = min(floor(p(1)), floor(p(2))); %xmin
sp(2) = min(floor(p(3)), floor(p(4))); %ymin
sp(3) = max(ceil(p(1)), ceil(p(2))); %xmax
%% 1. 读取图片
sp(4) = max(ceil(p(3)), ceil(p(4))); %ymax
% 获取该区域数据并显示图像
MM = roughness_picture(sp(2):sp(4), sp(1): sp(3),:);
imagesc(MM);
%% 确定照片倾斜度
uiwait(msgbox('请沿土壤轮廓上方的横线画点,以描述图片变形!'));
% 第一个点从0点起,最后一个点在87结束,中间可以任意n个点
[x_pix1,y_pix1] = ginput();
% 插值为88个点(0-87),方法为样条函数
x_intp = x_pix1(1):(x_pix1(end)-x_pix1(1))/87:(x_pix1(end));
y_intp = interp1(x_pix1,y_pix1,x_intp,'spline');
%% 请输入两点以确定,每厘米代表的高度值
uiwait(msgbox('请输入两点,以确定每厘米高度代表的像素值'))
[x_pix3,y_pix3] = ginput(1); % 起点(0,N)
[x_pix4,y_pix4] = ginput(1); % 终点(87,N)
% 每厘米高度代表的像素数
pixs_perH = abs((y_pix4 - y_pix3));
%% 输入土壤剖面:第一个点为0,最后一个点为87
% 数字化土壤剖面,可任意间隔画点,建议每厘米画一个点
uiwait(msgbox('输入土壤剖面:从第一行,最后一行结束'))
[x_pixs,y_pixs] = ginput;
%% 调整照片倾斜度,并转化为高度值,注意:高度值计算以地上剖面最低点为0点,而非刻度板的0点
% 计算每厘米长度代表的像素数,板子长为87厘米
pixs_perL = (x_pixs(end) - x_pixs(1))/87;
% x轴像素换算为长度
x_lengths = (x_pixs - x_pixs(1))/pixs_perL;
% 调整像素高度变形
y_intp2 = interp1(x_intp,y_intp,x_pixs,'spline'); % 获取输入点对应的y轴变形
y_dif = y_intp2(1:end) - y_intp2(1); % 不同点处的变形(相对0点)
y_pixs_ad = y_pixs - y_dif; % 修正变形后的像素高度值
% y轴像素换算为高度值(cm),以土壤剖面最低点为0点
y_heights = -(y_pixs_ad - max(y_pixs_ad))/pixs_perH;
figure('position',screensize)
plot(x_lengths,y_heights)
%% 保存数字化结果
dir_result = [dir,'20171014_results\']; % 结果保存文件
if ~isdir(dir_result)
mkdir(dir_result)
end
save([dir_result filename(1:end-4),'.mat'],'x_lengths','y_heights')