灰度共生矩阵,纹理特征,转

灰度共生矩阵
1matlab实现,来自网络转载
%**************************************************************************
% 图像检索——纹理特征
%基于共生矩阵纹理特征提取,d=1,θ=0°,45°,90°,135°共四个矩阵
%所用图像灰度级均为256
%参考《基于颜色空间和纹理特征的图像检索》
%function : T=Texture(Image)
%Image : 输入图像数据
%T : 返回八维纹理特征行向量
%**************************************************************************
function T = Texture(Image)
Gray = imread(‘E:/tupian/6.jpg’);
[M,N,O] = size(Gray);
M = 128;
N = 128;
%--------------------------------------------------------------------------
%1.将各颜色分量转化为灰度
%--------------------------------------------------------------------------
% Gray = double(0.3Image(:,:,1)+0.59Image(:,:,2)+0.11Image(:,:,3));
%--------------------------------------------------------------------------
%2.为了减少计算量,对原始图像灰度级压缩,将Gray量化成16级
%--------------------------------------------------------------------------
for i = 1:M
for j = 1:N
for n = 1:256/16
if (n-1)16<=Gray(i,j)&Gray(i,j)<=(n-1)16+15
Gray(i,j) = n-1;
end
end
end
end
%--------------------------------------------------------------------------
%3.计算四个共生矩阵P,取距离为1,角度分别为0,45,90,135
%--------------------------------------------------------------------------
P = zeros(16,16,4);
for m = 1:16
for n = 1:16
for i = 1:M
for j = 1:N
if j<N&Gray(i,j)==m-1&Gray(i,j+1)==n-1
P(m,n,1) = P(m,n,1)+1;
P(n,m,1) = P(m,n,1);
end
if i>1&j<N&Gray(i,j)==m-1&Gray(i-1,j+1)==n-1
P(m,n,2) = P(m,n,2)+1;
P(n,m,2) = P(m,n,2);
end
if i<M&Gray(i,j)==m-1&Gray(i+1,j)==n-1
P(m,n,3) = P(m,n,3)+1;
P(n,m,3) = P(m,n,3);
end
if i<M&j<N&Gray(i,j)==m-1&Gray(i+1,j+1)n-1
P(m,n,4) = P(m,n,4)+1;
P(n,m,4) = P(m,n,4);
end
end
end
if m
n
P(m,n,:) = P(m,n,:)2;
end
end
end
%%---------------------------------------------------------
% 对共生矩阵归一化
%%---------------------------------------------------------
for n = 1:4
P(:,:,n) = P(:,:,n)/sum(sum(P(:,:,n)));
end
%--------------------------------------------------------------------------
%4.对共生矩阵计算能量、熵、惯性矩、相关4个纹理参数
%--------------------------------------------------------------------------
H = zeros(1,4);
I = H;
Ux = H; Uy = H;
deltaX= H; deltaY = H;
C =H;
for n = 1:4
E(n) = sum(sum(P(:,:,n).^2)); %%能量
for i = 1:16
for j = 1:16
if P(i,j,n)~=0
H(n) = -P(i,j,n)log(P(i,j,n))+H(n); %%熵
end
I(n) = (i-j)^2
P(i,j,n)+I(n); %%惯性矩
Ux(n) = i
P(i,j,n)+Ux(n); %相关性中μx
Uy(n) = j
P(i,j,n)+Uy(n); %相关性中μy
end
end
end
for n = 1:4
for i = 1:16
for j = 1:16
deltaX(n) = (i-Ux(n))^2
P(i,j,n)+deltaX(n); %相关性中σx
deltaY(n) = (j-Uy(n))^2
P(i,j,n)+deltaY(n); %相关性中σy
C(n) = ijP(i,j,n)+C(n);
end
end
C(n) = (C(n)-Ux(n)*Uy(n))/deltaX(n)/deltaY(n); %相关性
end
%--------------------------------------------------------------------------
%求能量、熵、惯性矩、相关的均值和标准差作为最终8维纹理特征
%--------------------------------------------------------------------------
a1 = mean(E)
b1 = sqrt(cov(E))
a2 = mean(H)
b2 = sqrt(cov(H))
a3 = mean(I)
b3 = sqrt(cov(I))
a4 = mean©
b4 = sqrt(cov©)
sprintf(‘0,45,90,135方向上的能量依次为: %f, %f, %f, %f’,E(1),E(2),E(3),E(4)) % 输出数据;
sprintf(‘0,45,90,135方向上的熵依次为: %f, %f, %f, %f’,H(1),H(2),H(3),H(4)) % 输出数据;
sprintf(‘0,45,90,135方向上的惯性矩依次为: %f, %f, %f, %f’,I(1),I(2),I(3),I(4)) % 输出数据;
sprintf(‘0,45,90,135方向上的相关性依次为: %f, %f, %f, %f’,C(1),C(2),C(3),C(4)) % 输出数据;

2 灰度梯度共生矩阵 转载
https://blog.csdn.net/qq_23926575/article/details/80599323
import cv2 #灰度梯度共生矩阵,注意这个是梯度
import numpy as np
from numba import jit
np.set_printoptions(suppress=True) # 输出时禁止科学表示法,直接输出小数值

def glgcm(img_gray, ngrad=16, ngray=16):
‘’‘Gray Level-Gradient Co-occurrence Matrix,取归一化后的灰度值、梯度值分别为16、16’’’
# 利用sobel算子分别计算x-y方向上的梯度值
gsx = cv2.Sobel(img_gray, cv2.CV_64F, 1, 0, ksize=3)
gsy = cv2.Sobel(img_gray, cv2.CV_64F, 0, 1, ksize=3)
height, width = img_gray.shape
grad = (gsx ** 2 + gsy ** 2) ** 0.5 # 计算梯度值
grad = np.asarray(1.0 * grad * (ngrad-1) / grad.max(), dtype=np.int16)
gray = np.asarray(1.0 * img_gray * (ngray-1) / img_gray.max(), dtype=np.int16) # 0-255变换为0-15
gray_grad = np.zeros([ngray, ngrad]) # 灰度梯度共生矩阵
for i in range(height):
for j in range(width):
gray_value = gray[i][j]
grad_value = grad[i][j]
gray_grad[gray_value][grad_value] += 1
gray_grad = 1.0 * gray_grad / (height * width) # 归一化灰度梯度矩阵,减少计算量
glgcm_features = get_glgcm_features(gray_grad)
return glgcm_features
@jit
def get_glgcm_features(mat):
‘’‘根据灰度梯度共生矩阵计算纹理特征量,包括小梯度优势,大梯度优势,灰度分布不均匀性,梯度分布不均匀性,能量,灰度平均,梯度平均,
灰度方差,梯度方差,相关,灰度熵,梯度熵,混合熵,惯性,逆差矩’’’
sum_mat = mat.sum()
small_grads_dominance = big_grads_dominance = gray_asymmetry = grads_asymmetry = energy = gray_mean = grads_mean = 0
gray_variance = grads_variance = corelation = gray_entropy = grads_entropy = entropy = inertia = differ_moment = 0
for i in range(mat.shape[0]):
gray_variance_temp = 0
for j in range(mat.shape[1]):
small_grads_dominance += mat[i][j] / ((j + 1) ** 2)
big_grads_dominance += mat[i][j] * j ** 2
energy += mat[i][j] ** 2
if mat[i].sum() != 0:
gray_entropy -= mat[i][j] * np.log(mat[i].sum())
if mat[:, j].sum() != 0:
grads_entropy -= mat[i][j] * np.log(mat[:, j].sum())
if mat[i][j] != 0:
entropy -= mat[i][j] * np.log(mat[i][j])
inertia += (i - j) ** 2 * np.log(mat[i][j])
differ_moment += mat[i][j] / (1 + (i - j) ** 2)
gray_variance_temp += mat[i][j] ** 0.5

    gray_asymmetry += mat[i].sum() ** 2
    gray_mean += i * mat[i].sum() ** 2
    gray_variance += (i - gray_mean) ** 2 * gray_variance_temp
for j in range(mat.shape[1]):
    grads_variance_temp = 0
    for i in range(mat.shape[0]):
        grads_variance_temp += mat[i][j] ** 0.5
    grads_asymmetry += mat[:, j].sum() ** 2
    grads_mean += j * mat[:, j].sum() ** 2
    grads_variance += (j - grads_mean) ** 2 * grads_variance_temp
small_grads_dominance /= sum_mat
big_grads_dominance /= sum_mat
gray_asymmetry /= sum_mat
grads_asymmetry /= sum_mat
gray_variance = gray_variance ** 0.5
grads_variance = grads_variance ** 0.5
for i in range(mat.shape[0]):
    for j in range(mat.shape[1]):
        corelation += (i - gray_mean) * (j - grads_mean) * mat[i][j]
glgcm_features = [small_grads_dominance, big_grads_dominance, gray_asymmetry, grads_asymmetry, energy, gray_mean, grads_mean,
    gray_variance, grads_variance, corelation, gray_entropy, grads_entropy, entropy, inertia, differ_moment]
return np.round(glgcm_features, 4)

if name==‘main’:
fp = ‘E:/tupian/6.jpg’
img = cv2.imread(fp)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
glgcm_features = glgcm(img_gray, 15, 15)
print (glgcm_features)

---------------------

作者:MoonBreeze_Ma

来源:CSDN

原文:https://blog.csdn.net/qq_23926575/article/details/80599323

版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值