任务说明
使用富士感压纸(压力测试纸)测量压力,感压纸受压时会显现颜色,根据峰值应力呈现不同的颜色深度。感压制提供了标准比色卡,给出不同颜色深度对应的压力值。
要求使用matlab,对照标准比色卡,对实验中使用的比色卡进行计算,得出压力分布情况。
上图的测压纸使用了14次,每次得到一个小区域,分别计算每个小区域的压力分布情况。
解决思路
-
将所有图像转换为灰度图像处理,根据比色卡中的离散的(压力值,图像灰度)数据对,拟合出函数,自变量为颜色灰度,因变量为压力值。
-
将感压纸中的区域分别裁剪出来,对每个小区域划分网格,计算每个小格中的平均灰度值。
-
根据平均灰度值计算每个小格中的平均应力,将网格和应力值一起绘制在图像上,显示出来。
具体实现
%%手动分割各区域,对图像使用鼠标划方框圈出小区域,双击左键,对结果保存为.fig格式
%读入图片
X = rgb2gray(imread('14_press_paper.jpg'));
Area1 = imcrop(X);
imshow(Area1);
%%将.fig图片读入为二维矩阵形式
open('C:\Users\77607\Desktop\感压纸在matlab上的程序标定\AREA\area_total.fig');h = get(gca,'Children');Area1 = get(h,'Cdata');%图像不足的部分全部补为0。
%图像以cell单元的方式输出,其排列顺序与原图的排向顺序相同。N = 50; %指定小格的Size[Area1_hang , Area1_lie] = size(Area1);
Integer_hang = floor(Area1_hang/N);
Integer_lie = floor(Area1_lie/N);%使用二维矩阵保存小格的总灰度和平均灰度
sum = zeros(Integer_hang, Integer_lie);
avg = zeros(Integer_hang, Integer_lie);for i = 1 : Integer_hangfor j = 1 : Integer_lieDivided_image(i,j) = {Area1((i-1)*N+1 : i*N , (j-1)*N+1 : j * N)};temp = Divided_image{i, j}; %I()指的是单元数组中的某一单元,而I{}指的是单元数组中某一单元的内容 [m,n] = size(temp);for k=1:mfor l=1:nsum(i, j) = sum(i, j) + double(temp(k, l));endend avg(i, j) = sum(i, j)/(m*n);end
end%%根据标准比色卡拟合出函数
I1 = rgb2gray(imread('1.5Mpa.jpg'));
I2 = rgb2gray(imread('1.3Mpa.jpg'));
I3 = rgb2gray(imread('1.1Mpa.jpg'));
I4 = rgb2gray(imread('0.9Mpa.jpg'));
I5 = rgb2gray(imread('0.7Mpa.jpg'));
I6 = rgb2gray(imread('0.5Mpa.jpg'));
I7 = rgb2gray(imread('0.3Mpa.jpg'));
I8 = rgb2gray(imread('0.1Mpa.jpg'));
%单元数组,每一个单元可以有不同的尺寸,使用花括号创建
I = {I1, I2, I3, I4, I5, I6, I7, I8};
sum_stand = [0 0 0 0 0 0 0 0];
avg_stand = [0 0 0 0 0 0 0 0];
for i = 1:8temp = I{i}; [m,n] = size(temp);for j=1:1:mfor k=1:1:nsum_stand(i) = sum_stand(i) + double(temp(j, k));endend avg_stand(i) = sum_stand(i)/(m*n);
end
%%
%拟合曲线
Y = [1.5 1.3 1.1 0.9 0.7 0.5 0.3 0.1];
p2 = polyfit(avg_stand, Y, 2); %2阶多项式拟合
%根据拟合函数计算各小格平均压力
press_val = polyval(p2, avg); %在截取的区域图像上画分割线
for i = 1 : Integer_hangArea1 = insertShape(Area1,'Line',[0 N*i N*Integer_lie N*i],'LineWidth',2,'Color','blue');
endfor i = 1 : Integer_lieArea1 = insertShape(Area1,'Line',[N*i 0 N*i N*Integer_hang ],'LineWidth',2,'Color','blue');
end
figure;
imshow(Area1);
%text(3,4,'0.001','horiz','left','color','r','fontsize',7)
hold on;
%在每个区域上标记上对应的应力值
for i = 1:Integer_hangfor j = 1:Integer_lietemp = press_val(i, j);text(50*j-45,50*i-25,num2str(temp),'horiz','left','color','r','fontsize',8)end
end