# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import cv2
"""
灰度共生矩阵 GLCM
1. 取 N*M 图像的任意一点(x, y),以及另外一点(x+a, y+b) 对应的灰度值为(g1, g2)
备注:这里g1对应(x,y)的灰度值,g2对应(x+a, x+b)的灰度值
2. 遍历图像则会有 N*M 个(g1, g2)的值, 根据这个值出现的频率计算P(g1, g2)
3. 这个概率分布就是灰度共生矩阵
备注:这里a和b取不同的值,就意味着图像从不同的方向进行扫描形成灰度共生矩阵,
例如 a = 1 b = 0,则是水平向左扫描
根据这个灰度共生矩阵,可以直接得出类似ASM能量(灰度共生矩阵的平方和)、对比度、逆差距等一些列图像特征;
"""
#path = '/XXXXX/'
#img = cv2.imread(path + 'wenli01.jpeg')
path = '/Volumes/项目/10.Deep Learning/06.Severstal Steel Defect Detection/00.data/train_images/'
img = cv2.imread(path + '0002cc93b.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img_gray_array = np.array(img_gray)
img_gray_array = cv2.resize(img_gray_array, (128, 128), interpolation=cv2.INTER_LINEAR)
w = img_gray_array.shape[0]
h = img_gray_array.shape[1]
glcm_tmp = [[(0, 0)] * w] * h
glcm_dict = {(0,0):0.0}
#水平方向
a = 1
b = 0
#1. 计算(g1, g2)
for i in range(w):
for j in range(h):
i_new = i + a
j_new = j + b
if i_new < 0 or i_new > w - 1\
or j_new < 0 or j_new > h - 1:
continue
glcm_tmp[i][j] = (img_gray_array[i][j], img_gray_array[i_new][j_new])
if glcm_tmp[i][j] in glcm_dict:
glcm_dict[glcm_tmp[i][j]] += 1
else:
glcm_dict[glcm_tmp[i][j]] = 1
#2. 计算(g1, g2) 的归一化概率
total = len(glcm_dict)
for (key,value) in glcm_dict.items():
#print(key, value, float(value/total))
glcm_dict[key] = float(value/total)
#3. 将该概率生成共生矩阵
glcm_array = [[0.0] * w] * h
for i in range(w):
for j in range(h):
glcm_array[i][j] = glcm_dict[glcm_tmp[i][j]]
plt.imshow(glcm_array, cmap='gray')
plt.show()
来源:https://blog.csdn.net/Fredric_2014/article/details/101358109