将以下代码的运行修改为将一个文件夹下所有图片的所有71个值计算并保存在表格里,每一个图片一行
import numpy as np
# from skimage.feature import greycomatrix, greycoprops
# from skimage.feature import greycomatrix, greycoprops
# from skimage.feature import graycomatrix, graycoprops
import cv2
from skimage import io
import matplotlib.pyplot as plt
from skimage.feature.texture import graycomatrix, graycoprops
import pywt
from skimage.feature import local_binary_pattern
from skimage.color import rgb2gray
def extract_glcm_features(image):
# 将图像转换为灰度
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 计算灰度共生矩阵,设置距离为1,角度为0度,使用4个方向(0°, 45°, 90°, 135°)
glcm = graycomatrix(gray_image, distances=[1], angles=[0, np.pi / 4, np.pi / 2, 3 * np.pi / 4], symmetric=True,
normed=True)
# 提取GLCM特征,比如对比度、同质性、能量、相关性
contrast = graycoprops(glcm, 'contrast')
homogeneity = graycoprops(glcm, 'homogeneity')
energy = graycoprops(glcm, 'energy')
correlation = graycoprops(glcm, 'correlation')
# print(contrast,homogeneity,energy,correlation)
# 返回特征向量
# glcm_features = np.hstack([contrast, homogeneity, energy, correlation])
# entropy = -np.sum(glcm * np.log2(glcm + (glcm == 0)))
# correlation = skf.greycoprops(glcm, 'correlation')[0, 0]
# variance = np.var(gray_image)
glcm_features = np.hstack([contrast, homogeneity, energy, correlation])
return np.squeeze(glcm_features)
# 提取灰度差分统计法纹理特征
def extract_gray_diff_stats(image):
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 计算水平、垂直、对角线上的灰度差分
horizontal_diff = np.diff(gray_image, axis=1)
vertical_diff = np.diff(gray_image, axis=0)
diagonal_diff = np.diff(gray_image[:-1, :-1], axis=1)
# 计算差分统计特征
mean_horizontal = np.mean(horizontal_diff)
std_horizontal = np.std(horizontal_diff)
mean_vertical = np.mean(vertical_diff)
std_vertical = np.std(vertical_diff)
mean_diagonal = np.mean(diagonal_diff)
std_diagonal = np.std(diagonal_diff)
features = np.array([mean_horizontal,std_horizontal,mean_vertical,std_vertical,mean_diagonal,std_diagonal])
# features = {
# 'mean_horizontal_diff': mean_horizontal,
# 'std_horizontal_diff': std_horizontal,
# 'mean_vertical_diff': mean_vertical,
# 'std_vertical_diff': std_vertical,
# 'mean_diagonal_diff': mean_diagonal,
# 'std_diagonal_diff': std_diagonal
# }
return features
# 提取一阶统计特征
def extract_first_order_stats(image):
# 灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化处理(如需要可调整阈值)
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
# 前景像素占比
foreground_ratio = np.sum(binary_image == 255) / binary_image.size
# 灰度均值、标准差、均方根
mean_gray = np.mean(gray_image)
std_gray = np.std(gray_image)
rms_gray = np.sqrt(np.mean(np.square(gray_image)))
# features = {
# 'foreground_ratio': foreground_ratio,
# 'mean_gray': mean_gray,
# 'std_gray': std_gray,
# 'rms_gray': rms_gray
# }
features = np.array([mean_gray, std_gray, rms_gray])
return features
def extract_tamura_features(image):
# 将图像转换为灰度
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 粗糙度(coarseness):可以基于像素值的变化来计算
coarseness = np.var(gray_image) # 方差表示粗糙度的一个近似
# 对比度(contrast):标准差
contrast = np.std(gray_image)
# 方向性(directionality):可以通过梯度方向直方图来近似
gx = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=3)
gy = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=3)
magnitude, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)
directionality = np.histogram(angle, bins=30, range=(0, 360))[0]
# 将这些特征组合成一个向量
# print(coarseness, contrast, directionality)
tamura_features = np.hstack([coarseness, contrast, directionality])
# print(tamura_features)
# print(coarseness.shape, contrast.shape, directionality.shape)
# tamura_features = np.hstack([coarseness, contrast, directionality])
return tamura_features
def extract_wavelet_features(image):
# 使用小波变换分解图像
coeffs = pywt.wavedec2(image, 'bior1.3', level=1)
cA, (cH, cV, cD) = coeffs[0], coeffs[1]
# 提取各个子带的统计特征(均值、标准差)
wavelet_features = np.array([
np.mean(cA), np.std(cA),
np.mean(cH), np.std(cH),
# np.mean(cV), np.std(cV),
# np.mean(cD), np.std(cD)
])
return wavelet_features
def extract_lbp_features(image, num_points=8, radius=1):
if len(image.shape) == 3: # 如果是 RGB 图像
image = rgb2gray(image) # 转换为灰度图像
# 计算 LBP 图像
lbp_image = local_binary_pattern(image, num_points, radius, method='uniform')
# 提取直方图特征
hist, _ = np.histogram(lbp_image, bins=np.arange(0, num_points + 3), range=(0, num_points + 2))
hist = hist.astype("float")
hist /= (hist.sum() + 1e-7) # 归一化
return hist
def extract_fourier_features(image):
# 对图像进行傅里叶变换
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))
# 提取频域特征(均值、标准差)
fourier_features = np.array([
np.mean(magnitude_spectrum),
np.std(magnitude_spectrum)
])
return fourier_features
# 主函数:提取所有特征
def extract_all_features(image):
glcm_features = extract_glcm_features(image)
# print(glcm_features.shape)
diff_features = extract_gray_diff_stats(image)
# print(diff_features.shape)
first_features = extract_first_order_stats(image)
# print(first_features.shape)
tamura_features = extract_tamura_features(image)
# print(tamura_features.shape)
# 合并所有特征
# features = np.array([contrast,homogeneity,energy,correlation,entropy,mean_horizontal,std_horizontal,mean_vertical,std_vertical,mean_diagonal,\
# mean_gray, std_gray, rms_gray])
features_all = np.hstack([glcm_features, diff_features, first_features, tamura_features])
# all_features = {**glcm_features, **gray_diff_features, **first_order_features}
return features_all
def extract_all_features_V2(image):
glcm_features = extract_glcm_features(image)
diff_features = extract_gray_diff_stats(image)
first_features = extract_first_order_stats(image)
tamura_features = extract_tamura_features(image)
# 新增的小波变换特征
wavelet_features = extract_wavelet_features(image)
# 新增的 LBP 特征
lbp_features = extract_lbp_features(image)
# 新增的傅里叶变换特征
fourier_features = extract_fourier_features(image)
# 合并所有特征
features_all = np.hstack([
glcm_features,
diff_features,
first_features,
tamura_features,
wavelet_features,
lbp_features
])
# features_all = np.hstack([glcm_features, diff_features, first_features, tamura_features,
# wavelet_features, lbp_features, fourier_features])
return features_all
# 示例用法
# 读取图像
image = cv2.imread('0/grind_2_CCD_bottom_image_1.png')
print(image.shape) # "/home/liuhuaxin/surface_roughness_V2/dataset/Dataset_multimodal_V3/train/image_ccd/grind_12_CCD_bottom_image_1.png"
# image = cv2.imread('image_path.jpg')
features = extract_all_features_V2(image)
print(features.shape)
print(features)
# for key, value in features.item():
# print(f'{key}: {value}')