【图像分割python实现六】灰度共生矩阵

让人想犯罪 __ 提交于 2019-11-30 12:10:46
# -*- 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()




易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!