作者:香柏林茶业 | 来源:互联网 | 2024-12-04 15:17
灰度共生矩阵是一种用于纹理分析的方法,它通过统计图像中像素对的空间关系来描述纹理特性。该方法能够捕捉到不同纹理模式下灰度级结构的重复出现情况,对于精细和粗糙纹理具有不同的表现。
灰度共生矩阵(Gray-Level Co-occurrence Matrix, GLCM)是图像处理中一种重要的纹理分析工具,它通过计算图像中像素点与其邻近像素点之间的灰度值组合出现的概率来构建矩阵。这种矩阵能够反映图像中局部区域的纹理信息,从而帮助区分不同类型的纹理。
在精细纹理中,某一灰度级结构随距离变化较快;而在粗糙纹理中,则变化较慢。为了分析图像的纹理特征,我们通常选择一个M×N的矩形窗口作为分析单位。
下面是一个使用MATLAB实现的灰度共生矩阵计算示例代码,该代码首先定义了一个函数comatrix
来计算共生矩阵,并提取了包括方向、步长、能量、最大概率、熵、对比度、倒数差分矩以及相关性在内的八个特征值。
% 主程序
[m, n] = size(img);
k = 1;
for i = 1:10:m-10 % 假设每次取10x10的图像块
for j = 1:10:n-10
re{k} = comatrix(img(i:i+9, j:j+9), fai, d);
k = k + 1;
end
end
for j = 1:8
s = [];
for i = 1:k-1
s = [s re{i}(j)];
end
figure;
plot(s)
end
接下来是comatrix.m
函数的具体实现:
function re = comatrix(D, fai, d)
[m, n] = size(D);
ma = max(D(:));
mi = min(D(:));
D = D - mi + 1; % 将最小值调整为1
k = ma - mi + 1; % 确定共生矩阵的大小
P = zeros(k, k);
if fai == 0
h = 0; w = d;
elseif fai == 45
h = d; w = d;
elseif fai == 90
h = d; w = 0;
else
h = d; w = -d;
end
if fai ~= 135
for i = 1:m-h
for j = 1:n-w
P(D(i, j), D(i+h, j+w)) = P(D(i, j), D(i+h, j+w)) + 1;
end
end
else
for i = 1:m-h
for j = 1-w:n
P(D(i, j), D(i+h, j+w)) = P(D(i, j), D(i+h, j+w)) + 1;
end
end
end
if sum(P(:)) ~= 0
P = P / sum(P(:)); % 归一化矩阵
end
% 计算八个特征值
re = zeros(1, 8);
re(1) = fai; % 方向特征
re(2) = d; % 步长特征
re(3) = sum(P(:).^2); % 能量特征
re(4) = max(P(:)); % 最大概率特征
miux = sum(double(1:k) .* sum(P(1:k, :)));
miuy = sum(double(1:k) .* sum(P(:, 1:k)));
sigmax = sum((double(1:k) - miux).^2 .* sum(P(1:k, :)));
sigmay = sum((double(1:k) - miuy).^2 .* sum(P(:, 1:k)));
for i = 1:k
for j = 1:k
if P(i, j) ~= 0
re(5) = re(5) + P(i, j) * log2(P(i, j)); % 熵特征
end
re(6) = re(6) + (i - j)^2 * P(i, j); % 对比度特征
if i ~= j
re(7) = re(7) + P(i, j) / abs(i - j); % 倒数差分矩特征
end
re(8) = re(8) + i * j * P(i, j);
end
end
if sigmax * sigmay ~= 0
re(8) = (re(8) - miux * miuy) / (sigmax * sigmay); % 相关性特征
end
end
上述代码中的re
即为当前分析的纹理特征向量,包含了八个描述子。最终,这些特征值被绘制为曲线图,以直观展示纹理特征的变化趋势。
参考资料:
MATLAB 官方文档 - 灰度共生矩阵