up目录
一、理论基础
形态学是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。
形态学的基本思想是利用一种特殊的结构元来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。
在经阈值处理提取出目标区域的二值图像之后,区域边缘可能并不理想,这时可以使用腐蚀或膨胀操作对区域进行“收缩”或“扩张”。腐蚀和膨胀是两种最基本也是最重要的形态学运算, 它们是很多高级形态学处理的基础, 很多其他的形态学算法都是由这两种基本运算复合而成。
1.1面积
Matlab函数bwarea简介 函数功能:计算二值图像中对象的总面积. 调用格式: total = bwarea(BW) 估算二值图像BW中对象的总面积. 返回的total是一个标量, 它的值大致地反映了和图像中on像素的个数.由于对于不同像素类型, 度量标准不同, 因此结果可能并不十分精确.BW可以是数值类型(整型.浮点型)或者逻辑类型.对于数值类型, 像素值不为0被视为on.返回值total是double类型的.
bwarea通过对图像中每个像素的面积求和来估计图像中所有 on
像素的面积。单个像素的面积是通过观察其 2×2 邻域来确定的。有六种不同的情形,每种情形表示一个不同面积:
-
具有零个
on
像素的情形(面积 = 0) -
具有一个
on
像素的情形(面积 = 1/4) -
具有两个相邻
on
像素的情形(面积 = 1/2) -
具有两个对角
on
像素的情形(面积 = 3/4) -
具有三个
on
像素的情形(面积 = 7/8) -
具有所有四个
on
像素的情形(面积 = 1)
每个像素是四个不同 2×2 邻域的一部分。例如,被 off
像素包围的单个 on
像素的总面积为 1。
1.2周长
链码(又称为freeman码)是用曲线起始点的坐标和边界点方向代码来描述曲线或边界的方法,常被用来在图像处理、计算机图形学、模式识别等领域中表示曲线和区域边界。
1、原链码
从边界(曲线)起点S开始,按顺时针方向观察每一线段走向,并用相应的指向符表示,结果就形成表示该边界(曲线)的数码序列,称为原链码。
2、归一化链码
原链码具有平移不变性(平移时不改变指向符),但当改变起点S时,会得到不同的链码表示,即不具备唯一性。为此可引入归一化链码,其方法是:对于闭合边界,任选一起点S得到原链码,将链码看作由各方向数构成的n位自然数,将该码按一个方向循环,使其构成的n位自然数最小,此时就形成起点唯一的链码,称为归一化链码,也称为规格化链码。
给定一个从任意点开始得到的链码,把它看作一个由各方向数构成的自然数。将这些方向数依一个方向循环,以使它们所构成的自然数的值最小。我们将这样转换后所对应的链码起点作为这个边界的归—化链码的起点。
在matlab中,利用bwperim来查找二值图像的边缘。
BW2 = bwperim(BW1)
BW2 = bwperim(BW1,conn)
BW2 = bwperim(BW1,conn)表示从输入图像BW1中返回只包括对象边缘像素点的图像。
BW = bwperim(I,8); % 检测目标的边缘跟踪,用于计算周长
for i=1:x
for j=1:y
if (BW(i,j)>0)
P2=j;
if ((P2-P1)==1) % 判断是否为垂直方向连续的周长像素点
Ny=Ny+1;
end
P1=P2;
end
end
end
%检测水平方向连读的周长像素点%
P1=0;
P2=0;
Nx=0; % 记录水平方向连续周长像素点的个数
for j=1:y
for i=1:x
if (BW(i,j)>0)
P2=i;
if ((P2-P1)==1) % 判断是否为水平方向连续的周长像素点
Nx=Nx+1;
end
P1=P2;
end
end
end
1.3圆度
目前在生产实践中,圆度的测量仪器主要有圆度仪、三坐标测量机等,而圆度的评定和计算则是通过圆度仪、三坐标测量机等精密仪器自带的计算程序来完成。由于设计者对程序严格保密且这些程序大都价格不菲,因此,使用者希望开发更多、更方便的圆度评定方法。实际上,圆度评定和计算的过程就是一个按照圆度评定标准构造函数原型进行优化求解的过程。
1.4矩形度
矩形度体现物体对其外接矩形的充满程度,反映一个物体与矩形相似程度的一个参数
是矩形拟合因子。
其中,S0是该物体的面积,而SMER是其最小外接矩形的曲积。R反映了一个物体对其的充满程度。对于矩形物体R取得最大值1,对于圆形物体R取值为 ,对于纤细、弯曲的物体R取值变小。
1.5伸长度
伸长度,指材料因为外力的作用产生变形后延长了程度。
二、核心程序
I=imread('1.jpg');
I2=rgb2gray(I);
Threshold=graythresh(I2);
BW=im2bw(I2,Threshold);
imshow(BW);
[M1,N1]=size(BW);
i1=M1;change=0;
for i =1:M1
if change==0&sum(BW(i,:))~=0
change=1;
if i<i1
i1=i;
end
elseif change==1&sum(BW(i,:))==0
i2=i;change=0;
end
end
j1=N1;change=0;
for j =1:N1
if change==0&sum(BW(:,j))~=0
change=1;
if j<j1
j1=j;
end
elseif change==1&sum(BW(:,j))==0
j2=j;change=0;
end
end
BW1=BW(i1:i2,j1:j2);
[M,N]=size(BW1);
BW=imresize(BW1,[50 ceil(50*N/M)]);
figure,imshow(BW);
%标记面积最大的区域
L = bwlabel(BW);
stats = regionprops(L);
Ar = cat(1, stats.Area);
ind = find(Ar ==max(Ar));
BW2= ismember(L,ind);
function phi = ACSE(I)
%F is input binary image
% ~0 region denotes the target region
%output:A:面积;C:周长;S:紧密度;E:离心度
[x,y]=size(I);
BW = bwperim(I,8); % 检测目标的边缘跟踪,用于计算周长
%检测垂直方向连读的周长像素点%
P1=0;
P2=0;
Ny=0; % 记录垂直方向连续周长像素点的个数
for i=1:x
for j=1:y
if (BW(i,j)>0)
P2=j;
if ((P2-P1)==1) % 判断是否为垂直方向连续的周长像素点
Ny=Ny+1;
end
P1=P2;
end
end
end
%检测水平方向连读的周长像素点%
P1=0;
P2=0;
Nx=0; % 记录水平方向连续周长像素点的个数
for j=1:y
for i=1:x
if (BW(i,j)>0)
P2=i;
if ((P2-P1)==1) % 判断是否为水平方向连续的周长像素点
Nx=Nx+1;
end
P1=P2;
end
end
end
SN=sum(sum(BW)); % 计算周长像素点的总数
Nd=SN-Nx-Ny; % 计算奇数码的链码数目
H=max(sum(I)); % 计算目标的高度
W=max(sum(I')); % 图象I经矩阵转置后,计算宽度
C=sqrt(2)*Nd+Nx+Ny; % 计算周长
%====形态特征值计算===%
A=bwarea(I);% 计算目标的面积
S=A/C;
[M N]=size(I);
[x, y] = meshgrid(1:N, 1:M);
x = x(:);
y = y(:);
I=I(:);
m20 = sum(x.^2 .* I);
m02 = sum(y.^2 .* I);
m11 = sum(x .* y .* I);
e=(m20-m02)^2+4*m11;
E=e/A+1;
phi(1)=A;
phi(2)=C;
phi(3)=S;
phi(4)=E;
三、测试结果
matlab2022a测试结果如下
面积
ans =
2401
周长
ans =
191.1716
圆度
ans =
1.2113
矩形度
ans =
1
伸长度
ans =
1
面积
ans =
1.6199e+03
周长
ans =
219
圆度
ans =
2.3561
矩形度
ans =
0.7199
伸长度
ans =
0.9000