描述纹理最简单的方法之一就是利用图像或区域的灰度直方图的统计矩。令 z是一个表示灰度的随机变量并令 p(zi ),i=0,1,2,… ,L-1是对应的归一化直方图,其 中L是不同灰度级的数量。z相对于平均值的n阶矩是:
m 是z的均值 (即 图像或区域的平均灰度 ):
基于直方图的其他一些有用的纹理测度包括一致性测度,它定义为:
以下是python代码:
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 7 15:07:36 2021
@author: Chen
"""
import cv2 as cv
import numpy as np
img = cv.imread('',cv.IMREAD_UNCHANGED)
#print(img)
pi=[]
std=[]
std3=[]
con = []
ent = []
hist,bins = np.histogram(img.flatten(),256,[0,256])#计算灰度直方图
cdf = hist.cumsum()
cdf_normalized = hist / cdf.max()#归一化
#计算均值
for i in range(256):
p = cdf_normalized[i]*i
pi.append(p)
mean = sum((pi))
#计算方差(二阶矩)
for i in range(256):
s = (i-mean)**2*cdf_normalized[i]
std.append(s)
standard = sum(std)
#计算三阶矩
for i in range(256):
s3 = (i-mean)**3*cdf_normalized[i]
std3.append(s3)
standard3 = sum(std3)
#计算一致性
for i in range(256):
c = cdf_normalized[i]**2
con.append(c)
consistency = sum(con)
#计算熵
for i in range(256):
e = -(cdf_normalized[i]*np.log2(cdf_normalized[i]+0.00001))
ent.append(e)
entropy = sum(ent)
print(mean)
print(standard)
print(standard3)
print(consistency)
print(entropy)
#print(cdf.max())
#print(np.apply_over_axes(np.sum, img, [0,1])/cdf.max())
#print(sum(cdf_normalized))