《从像素到智慧:深度学习图像处理入门全攻略》
·
《从像素到智慧:深度学习图像处理入门全攻略》
数字图像基础概念
1. 数字图像坐标系
在数字图像中,坐标系与我们常见的数学坐标系有所不同:
- 原点(0,0) 位于图像的左上角
- x轴 水平向右延伸
- y轴 垂直向下延伸
import numpy as np
import matplotlib.pyplot as plt
import cv2
# 创建一个简单的图像来演示坐标系
image = np.zeros((100, 100), dtype=np.uint8)
# 在特定坐标位置绘制点
coordinates = [
(10, 10), # 左上区域
(50, 50), # 中心
(90, 10), # 右上区域
(10, 90), # 左下区域
(90, 90) # 右下区域
]
for x, y in coordinates:
image[y, x] = 255 # 注意:这里y在前,x在后!
plt.figure(figsize=(10, 8))
plt.imshow(image, cmap='gray')
plt.title('数字图像坐标系演示')
for i, (x, y) in enumerate(coordinates):
plt.text(x, y, f'({x},{y})', color='red', fontsize=8)
plt.show()
2. 矩阵表示与分辨率
数字图像本质上就是一个矩阵:
# 创建一个3x3的小图像来理解矩阵表示
small_image = np.array([
[100, 150, 200],
[50, 180, 90],
[210, 30, 120]
], dtype=np.uint8)
print("图像矩阵:")
print(small_image)
print(f"图像形状(高度, 宽度): {small_image.shape}")
print(f"图像分辨率: {small_image.shape[1]} × {small_image.shape[0]} 像素")
# 实际图像示例
real_image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE) # 读取为灰度图
if real_image is not None:
print(f"实际图像分辨率: {real_image.shape[1]} × {real_image.shape[0]}")
print(f"矩阵数据类型: {real_image.dtype}")
3. 灰度值与颜色空间
# 灰度值范围:0(黑) ~ 255(白)
def demonstrate_grayscale():
# 创建灰度渐变图像
gradient = np.linspace(0, 255, 256, dtype=np.uint8)
gradient_image = np.tile(gradient, (100, 1))
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(gradient_image, cmap='gray')
plt.title('灰度渐变')
plt.colorbar()
# 颜色空间转换:RGB -> HSV
color_image = np.random.randint(0, 255, (50, 50, 3), dtype=np.uint8)
plt.subplot(1, 3, 2)
plt.imshow(color_image)
plt.title('RGB颜色空间')
# 转换为HSV颜色空间
hsv_image = cv2.cvtColor(color_image, cv2.COLOR_RGB2HSV)
plt.subplot(1, 3, 3)
plt.imshow(hsv_image)
plt.title('HSV颜色空间')
plt.tight_layout()
plt.show()
demonstrate_grayscale()
点运算与空域处理
1. 点运算(像素级操作)
点运算是对图像的每个像素独立进行变换的操作。
class PointOperations:
def __init__(self, image):
self.image = image
def adjust_brightness(self, value):
"""调整亮度"""
result = cv2.add(self.image, value)
return np.clip(result, 0, 255)
def adjust_contrast(self, alpha):
"""调整对比度: new_pixel = alpha * pixel"""
result = cv2.multiply(self.image, alpha)
return np.clip(result, 0, 255)
def gamma_correction(self, gamma):
"""伽马校正"""
# 归一化
normalized = self.image / 255.0
# 伽马变换
corrected = np.power(normalized, gamma)
# 恢复范围
return (corrected * 255).astype(np.uint8)
def histogram_equalization(self):
"""直方图均衡化"""
return cv2.equalizeHist(self.image)
def threshold(self, threshold_value):
"""阈值处理"""
_, binary = cv2.threshold(self.image, threshold_value, 255, cv2.THRESH_BINARY)
return binary
# 演示点运算
def demo_point_operations():
# 创建测试图像
test_image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
if test_image is None:
# 如果没有图像,创建一个测试图像
test_image = np.random.randint(0, 255, (200, 200), dtype=np.uint8)
po = PointOperations(test_image)
# 应用各种点运算
brightened = po.adjust_brightness(50)
contrasted = po.adjust_contrast(1.5)
gamma_corrected = po.gamma_correction(2.2)
equalized = po.histogram_equalization()
thresholded = po.threshold(128)
# 显示结果
plt.figure(figsize=(15, 10))
operations = [
(test_image, '原图'),
(brightened, '亮度增强'),
(contrasted, '对比度增强'),
(gamma_corrected, '伽马校正'),
(equalized, '直方图均衡化'),
(thresholded, '二值化')
]
for i, (img, title) in enumerate(operations, 1):
plt.subplot(2, 3, i)
plt.imshow(img, cmap='gray')
plt.title(title)
plt.axis('off')
plt.tight_layout()
plt.show()
demo_point_operations()
2. 空域处理(邻域操作)
空域处理考虑像素的邻域信息来进行计算。
class SpatialOperations:
def __init__(self, image):
self.image = image
def mean_filter(self, kernel_size=3):
"""均值滤波"""
kernel = np.ones((kernel_size, kernel_size), np.float32) / (kernel_size * kernel_size)
return cv2.filter2D(self.image, -1, kernel)
def gaussian_filter(self, kernel_size=5, sigma=1.0):
"""高斯滤波"""
return cv2.GaussianBlur(self.image, (kernel_size, kernel_size), sigma)
def median_filter(self, kernel_size=3):
"""中值滤波"""
return cv2.medianBlur(self.image, kernel_size)
def sobel_edge_detection(self):
"""Sobel边缘检测"""
sobelx = cv2.Sobel(self.image, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(self.image, cv2.CV_64F, 0, 1, ksize=3)
magnitude = np.sqrt(sobelx**2 + sobely**2)
return (magnitude * 255 / magnitude.max()).astype(np.uint8)
def custom_convolution(self, kernel):
"""自定义卷积操作"""
return cv2.filter2D(self.image, -1, kernel)
# 演示空域处理
def demo_spatial_operations():
# 创建测试图像(添加一些噪声)
test_image = np.random.randint(0, 255, (200, 200), dtype=np.uint8)
# 添加椒盐噪声
def add_salt_pepper_noise(image, salt_prob, pepper_prob):
noisy = image.copy()
# 盐噪声(白点)
salt_mask = np.random.random(image.shape) < salt_prob
noisy[salt_mask] = 255
# 椒噪声(黑点)
pepper_mask = np.random.random(image.shape) < pepper_prob
noisy[pepper_mask] = 0
return noisy
noisy_image = add_salt_pepper_noise(test_image, 0.01, 0.01)
so = SpatialOperations(noisy_image)
# 应用各种空域处理
mean_filtered = so.mean_filter(5)
gaussian_filtered = so.gaussian_filter(5, 1.0)
median_filtered = so.median_filter(5)
edges = so.sobel_edge_detection()
# 自定义卷积核:锐化
sharpen_kernel = np.array([
[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]
])
sharpened = so.custom_convolution(sharpen_kernel)
# 显示结果
plt.figure(figsize=(15, 10))
operations = [
(test_image, '原图'),
(noisy_image, '添加噪声'),
(mean_filtered, '均值滤波'),
(gaussian_filtered, '高斯滤波'),
(median_filtered, '中值滤波'),
(sharpened, '图像锐化'),
(edges, '边缘检测')
]
for i, (img, title) in enumerate(operations, 1):
plt.subplot(3, 3, i)
plt.imshow(img, cmap='gray')
plt.title(title)
plt.axis('off')
plt.tight_layout()
plt.show()
demo_spatial_operations()
3. 综合应用示例
def complete_image_processing_pipeline():
"""完整的图像处理流程示例"""
# 模拟一个图像处理任务
image = np.random.randint(0, 255, (300, 300), dtype=np.uint8)
# 步骤1: 点运算 - 对比度增强
po = PointOperations(image)
enhanced = po.adjust_contrast(1.3)
enhanced = po.adjust_brightness(10)
# 步骤2: 空域处理 - 降噪
so = SpatialOperations(enhanced)
denoised = so.median_filter(3)
# 步骤3: 边缘检测
edges = so.sobel_edge_detection()
# 步骤4: 二值化
binary = po.threshold(128)
# 显示处理流程
plt.figure(figsize=(15, 8))
steps = [
(image, '1. 原始图像'),
(enhanced, '2. 对比度亮度增强'),
(denoised, '3. 中值滤波降噪'),
(edges, '4. 边缘检测'),
(binary, '5. 二值化结果')
]
for i, (img, title) in enumerate(steps, 1):
plt.subplot(2, 3, i)
plt.imshow(img, cmap='gray')
plt.title(title, fontsize=12, fontweight='bold')
plt.axis('off')
plt.tight_layout()
plt.show()
# 打印处理前后的统计信息
print("图像处理统计信息:")
print(f"原始图像 - 均值: {image.mean():.2f}, 标准差: {image.std():.2f}")
print(f"最终结果 - 均值: {binary.mean():.2f}, 标准差: {binary.std():.2f}")
complete_image_processing_pipeline()
关键知识点总结
- 数字图像本质:图像就是矩阵,理解坐标系是基础
- 点运算特点:独立处理每个像素,适合全局调整
- 空域处理优势:利用邻域信息,适合特征提取和降噪
- 实际应用:结合两种方法构建完整的图像处理流程
这些基础知识是深度学习计算机视觉的基石,掌握了它们,你就能更好地理解卷积神经网络(CNN)的工作原理,为后续的深度学习之旅打下坚实基础!
# 快速回顾要点
def key_points_summary():
points = {
"坐标系": "原点在左上角,先行后列(y,x)",
"矩阵表示": "灰度图是2D矩阵,彩色图是3D矩阵",
"点运算": "像素独立操作:亮度、对比度、二值化等",
"空域处理": "邻域相关操作:滤波、边缘检测等",
"颜色空间": "RGB、HSV等不同表示方法各有用途"
}
print("🚀 深度学习图像处理核心要点:")
for key, value in points.items():
print(f"✓ {key}: {value}")
key_points_summary()
开始你的图像处理之旅吧!这些基础概念将在后续的深度学习模型中反复出现,扎实的基础会让你在AI道路上走得更远。
更多推荐
所有评论(0)