import cv2
import math
import numpy as np
##############################灰度共生矩阵##############################
gray_level = 12#定义最大灰度级数
def maxGrayLevel(img):#寻找像素灰度最大值
max_gray_level = 0
(height, width) = img.shape
for y in range(height):
for x in range(width):
if img[y][x] > max_gray_level:
max_gray_level = img[y][x]
return max_gray_level + 1#像素灰度最大值加1即为该矩阵所拥有的灰度级数
def getGlcm(input, d_x, d_y):#定义灰度共生矩阵
srcdata = input.copy()
ret = [[0.0 for i in range(gray_level)] for j in range(gray_level)]#生成一个长宽都由gray_level个0.0组成的二维列表
(height, width) = input.shape
max_gray_level = maxGrayLevel(input)
# 若灰度级数大于gray_level,则将图像的灰度级缩小至gray_level以内,减小灰度共生矩阵的大小
if max_gray_level > gray_level:
for j in range(height):
for i in range(width):
srcdata[j][i] = srcdata[j][i] * gray_level / max_gray_level
for j in range(height - d_y):
for i in range(width - d_x):
if j<101 and i<101:
rows = int(srcdata[j][i])
cols = int(srcdata[j + d_y][i + d_x])
ret[rows][cols] += 1.0
for i in range(gray_level):
for j in range(gray_level):
ret[i][j] /= float(height * width)
return ret
def feature_computer(p):#求取特征向量
Con = 0.0
Eng = 0.0
Asm = 0.0
Idm = 0.0
for i in range(gray_level):
for j in range(gray_level):
Con += abs(i - j) * p[i][j]#con--对比度
Asm += p[i][j] * p[i][j]#asm--角二阶矩/能量
Idm += p[i][j] / (1 + abs(i - j))#idm---反差分矩阵/均衡性
if p[i][j] > 0.0:
Eng += p[i][j] * math.log(p[i][j])#eng--熵
return Asm, Con, -Eng, Idm#asm--角二阶矩/能量,con--对比度,eng--熵,idm---反差分矩阵
img = cv2.imread("C:/Users/tc/Desktop/picture/scratches_295.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
glcm_0 = getGlcm(img, 1, 0)#水平方向
glcm_1 = getGlcm(img, 0,1)#45°方向
glcm_2 = getGlcm(img, 1,1)#垂直方向
glcm_3 = getGlcm(img, -1,1)#135°方向
asm0, con0, eng0, idm0 = feature_computer(glcm_0)
asm1, con1, eng1, idm1 = feature_computer(glcm_1)
asm2, con2, eng2, idm2 = feature_computer(glcm_2)
asm3, con3, eng3, idm3 = feature_computer(glcm_3)
num_list = [asm0, con0, eng0, idm0,
asm1, con1, eng1, idm1,
asm2, con2, eng2, idm2,
asm3, con3, eng3, idm3]
print(num_list)
"""
def test():
img = cv2.imread("C:/Users/tc/Desktop/picture/scratches_295.jpg")
try:
img_shape = img.shape
except:
print('imread error')
return -1
fea1=np.mean(img)/(img.shape[0]*img.shape[1]);#灰度均值
fea2=np.var(img)/(img.shape[0]*img.shape[1]);#灰度方差
fea3=np.max(img)/(img.shape[0]*img.shape[1])#最大值
fea4=np.min(img)/(img.shape[0]*img.shape[1])#最小值
fea5=fea3-fea4#幅值
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print("img_gray_type",type(img_gray))#打印数组数据类型 <class,'numpy.ndarray'>
print("img_gray_dtype",img_gray.dtype)#打印数组元素数据类型 uint8
print("img_gray_size",img_gray.size)#打印数组尺寸,即数组元素总数 40000
print("img_gray_shape",img_gray.shape)#打印数组形状 (200,200)
print("img_gray_ndim",img_gray.ndim)#打印数组的维度数目 2
# glcm_0 = getGlcm(img_gray, 1, 0)#水平方向
# glcm_1=getGlcm(img_gray, 0,1)#45°方向
# glcm_2=getGlcm(img_gray, 1,1)#垂直方向
glcm_3=getGlcm(img_gray, -1,1)#135°方向
Asm, Con, Eng, Idm = feature_computer(glcm_3)
name_list = ['均值', '方差', '最大值', '最小值','幅值','能量','对比度','熵','相关度']
num_list = [fea1,fea2,fea3,fea4,fea5, Asm, Con, Eng, Idm]
print(name_list)
print(num_list)
if __name__ == '__main__':
test()
mean(im);%灰度平均值
var(im);%灰度方差
max(im);%最大灰度值
min(im);%最小灰度值
max(im)-min(im);%灰度幅值
sum(le.*le.*le.*p_b)/(fea(2)^(3/2));%歪度
sum(le.*le.*le.*le.*p_b)/(fea(2)^2)-3;%峭度
sum(p_b.*p_b);%能量
-sum(log(p_b).*p_b);%熵
先算出每个图片的灰度共生矩阵,再依据此共生矩阵构建四条统计性描述子作为新的特征描述:
1.ASM(能量\角二阶矩):
是灰度共生矩阵元素值的平方和,所以也称能量,反映了图像灰度分布均匀程度和纹理粗细度。
2.CON(对比度):
其中 。反映了图像的清晰度和纹理沟纹深浅的程度。纹理沟纹越深,其对比度越大,视觉效果越清晰;
反之,对比度小,则沟纹浅,效果模糊。灰度差即对比度大的象素对越多,这个值越大。
灰度公生矩阵中远离对角线的元素值越大,CON越大。
3.IDM(相关度\反差分矩阵)(inverse different moment):
度量空间灰度共生矩阵元素在行或列方向上的相似程度,因此,相关值大小反映了图像中局部灰度相关性。
当矩阵元素值均匀相等时,相关值就大;相反,如果矩阵像元值相差很大则相关值小。
4.Eng熵(entropy):
此处熵同样表示图像的信息量,当共生矩阵中所有元素有最大的随机性、空间共生矩阵中所有值几乎相等时,
共生矩阵中元素分散分布时,熵较大。它表示了图像中纹理的非均匀程度或复杂程度。
"""
- 1
- 2
前往页