使用SOM进行图像颜色量化
使用SOM进行图像颜色量化
前言
自组织映射(Self-Organizing Map, SOM)是一种人工神经网络,能够将高维数据映射到低维空间,同时保持数据的拓扑结构。在图像处理领域,SOM常被用于颜色量化,即减少图像中的颜色数量,同时尽量保持图像的视觉效果。
本文将介绍如何使用MiniSom库实现基于SOM的图像颜色量化,将一幅图像的颜色从数百万种减少到9种代表色,同时保持图像的主要视觉特征。
编码实现
from minisom import MiniSom
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning)# ---------------------- 1. PNG图像加载与预处理 ----------------------
def load_and_preprocess_image(image_path):"""加载PNG图像并进行预处理"""# 加载PNG图像img = plt.imread(image_path).astype(np.float32)# 处理RGBA通道(若存在):保留RGB三通道if img.ndim == 3 and img.shape[-1] == 4:img = img[..., :3]# 自动判断位深度并标准化(适配8位/16位PNG)max_val = img.max()if max_val > 1.0: # 非浮点型PNG(8位/16位)img = img / (65535 if max_val > 255 else 255)# 亮度增强(针对PNG可能的偏暗问题)img = np.clip(img * 1.5, 0, 1)return img# ---------------------- 2. SOM颜色量化 ----------------------
def som_color_quantization(img, grid_size=(3, 3), num_iterations=1000):"""使用SOM对图像进行颜色量化"""# 数据展平:将图像转为像素列表(每行一个RGB像素)pixels = img.reshape(-1, 3)# 初始化SOMsom = MiniSom(x=grid_size[0], y=grid_size[1], input_len=3, # RGB三通道sigma=1.0, learning_rate=0.3, random_seed=42)# 随机初始化权重并保存初始状态som.random_weights_init(pixels)initial_weights = som.get_weights().copy()# 训练SOMsom.train_random(pixels, num_iterations)# 颜色量化quantized_pixels = som.quantization(pixels)quantized_img = quantized_pixels.reshape(img.shape)return quantized_img, initial_weights, som.get_weights()# ---------------------- 3. 结果可视化 ----------------------
def plot_results(original_img, quantized_img, initial_weights, learned_weights):"""可视化处理结果"""plt.figure(figsize=(12, 10))# 原始图像plt.subplot(221)plt.imshow(original_img)plt.title('Original Image')plt.axis('off')# 量化后图像plt.subplot(222)plt.imshow(quantized_img)plt.title('Quantized Image (9 colors)')plt.axis('off')# 初始权重颜色plt.subplot(223)plt.imshow(initial_weights)plt.title('Initial SOM Weights')plt.axis('off')# 学习后权重颜色plt.subplot(224)plt.imshow(learned_weights)plt.title('Learned SOM Weights')plt.axis('off')plt.tight_layout()plt.show()# ---------------------- 4. 主函数 ----------------------
def main():# 加载并预处理图像image_path = 'car.png' # 请替换为您的图像路径img = load_and_preprocess_image(image_path)# 使用SOM进行颜色量化quantized_img, initial_weights, learned_weights = som_color_quantization(img)# 显示结果plot_results(img, quantized_img, initial_weights, learned_weights)if __name__ == "__main__":main()
原图片

结果

代码说明
-
图像预处理:
- 支持RGBA和RGB格式的PNG图像
- 自动适配8位和16位PNG图像的位深度
- 包含亮度增强功能,改善PNG图像可能的偏暗问题
-
SOM训练:
- 使用3x3的SOM网格,将颜色量化为9种代表色
- 训练1000次以确保充分拟合图像的颜色分布
- 保存初始权重和学习后的权重用于对比
-
结果可视化:
- 展示原始图像和量化后的图像
- 对比SOM初始权重和学习后的权重变化
- 清晰展示颜色量化的效果
使用方法
- 确保安装了必要的库:
pip install minisom numpy matplotlib
-
将代码中的
image_path替换为您的图像路径 -
运行代码,即可看到颜色量化的效果
这种基于SOM的颜色量化方法能够有效地减少图像中的颜色数量,同时保持图像的主要视觉特征,适用于图像压缩、色彩分析等应用场景。
