The following code was used to train the GA. After that, I use file compression ratio to generate most of the images.
def glcm_features(self, tensor, distances=[1], angles=[0, 45, 90, 135]):
“””Calculate Gray-Level Co-occurrence Matrix features”””
# Convert to uint8 with reduced levels for GLCM
img = (tensor.cpu().numpy() * 63).astype(np.uint8) # 64 gray levels
contrast_values = []
homogeneity_values = []
energy_values = []
for distance in distances:
for angle in angles:
# Calculate GLCM manually (simplified version)
glcm = self._calculate_glcm(img, distance, angle)
# Normalize GLCM
glcm = glcm / (glcm.sum() + 1e-10)
# Calculate features
contrast = self._glcm_contrast(glcm)
homogeneity = self._glcm_homogeneity(glcm)
energy = self._glcm_energy(glcm)
contrast_values.append(contrast)
homogeneity_values.append(homogeneity)
energy_values.append(energy)
return {
‘glcm_contrast’: np.mean(contrast_values),
‘glcm_homogeneity’: np.mean(homogeneity_values),
‘glcm_energy’: np.mean(energy_values)
}
def _calculate_glcm(self, img, distance, angle):
“””Simplified GLCM calculation”””
rows, cols = img.shape
max_gray = 64 # Reduced gray levels
glcm = np.zeros((max_gray, max_gray))
# Direction vectors for different angles
if angle == 0:
di, dj = 0, distance
elif angle == 45:
di, dj = -distance, distance
elif angle == 90:
di, dj = -distance, 0
else: # 135
di, dj = -distance, -distance
for i in range(rows):
for j in range(cols):
ni, nj = i + di, j + dj
if 0 <= ni < rows and 0 <= nj < cols:
glcm[img[i, j], img[ni, nj]] += 1
return glcm
def _glcm_contrast(self, glcm):
“””Calculate contrast from GLCM”””
contrast = 0
for i in range(glcm.shape[0]):
for j in range(glcm.shape[1]):
contrast += glcm[i, j] * (i – j) ** 2
return contrast
def _glcm_homogeneity(self, glcm):
“””Calculate homogeneity from GLCM”””
homogeneity = 0
for i in range(glcm.shape[0]):
for j in range(glcm.shape[1]):
homogeneity += glcm[i, j] / (1 + abs(i – j))
return homogeneity
def _glcm_energy(self, glcm):
“””Calculate energy from GLCM”””
return np.sum(glcm ** 2)