数字图像处理(四)
- 三、(准备工作:玩具咋玩)图像以矩阵形式存储,那矩阵一变、图像立刻跟着变?
-
- 原图
- 发挥了钞能力之后的图
-
- [上述代码包含 10 个图像处理实验,每个实验会生成对应处理后的图像,以下为各实验对应生成图像的大致情况:](#上述代码包含 10 个图像处理实验,每个实验会生成对应处理后的图像,以下为各实验对应生成图像的大致情况:)
-
- [实验 1:生成原始彩色图像和灰度图像,还会展示彩色与灰度图像的矩阵切片信息。](#实验 1:生成原始彩色图像和灰度图像,还会展示彩色与灰度图像的矩阵切片信息。)
- [实验 2:生成原始图像、仅红色通道、仅绿色通道、仅蓝色通道、通道交换(BGR→RGB )、自定义通道组合(B + R + G )的图像。](#实验 2:生成原始图像、仅红色通道、仅绿色通道、仅蓝色通道、通道交换(BGR→RGB )、自定义通道组合(B + R + G )的图像。)
- [实验 3:生成原始灰度图像,以及阈值为 50、100、150 的二值化图像 。](#实验 3:生成原始灰度图像,以及阈值为 50、100、150 的二值化图像 。)
- [实验 4:生成变暗(alpha = 0.7,beta = -20 )、原始、变亮(alpha = 1.3,beta = 30 )、高对比度(alpha = 1.8,beta = -50 )调整后的图像。](#实验 4:生成变暗(alpha = 0.7,beta = -20 )、原始、变亮(alpha = 1.3,beta = 30 )、高对比度(alpha = 1.8,beta = -50 )调整后的图像。)
- [实验 5:生成原始对比度、增强中间调(输入范围 [50,200]→输出 [0,255] )、压暗高光(输入范围 [0,200]→输出 [0,255] )、提高阴影(输入范围 [50,255]→输出 [0,255] )调整后的图像。](#实验 5:生成原始对比度、增强中间调(输入范围 [50,200]→输出 [0,255] )、压暗高光(输入范围 [0,200]→输出 [0,255] )、提高阴影(输入范围 [50,255]→输出 [0,255] )调整后的图像。)
- [实验 6:生成原始图像、水平翻转、垂直翻转、对角线翻转后的图像。](#实验 6:生成原始图像、水平翻转、垂直翻转、对角线翻转后的图像。)
- [实验 7:生成原始图像、顺时针 90° 旋转、180° 旋转、逆时针 90° 旋转、45° 旋转后的图像,还有旋转矩阵可视化图。](#实验 7:生成原始图像、顺时针 90° 旋转、180° 旋转、逆时针 90° 旋转、45° 旋转后的图像,还有旋转矩阵可视化图。)
- [实验 8:以不同插值方法(最近邻、双线性、区域重采样 ),对图像进行 0.5 倍、1.5 倍、2.0 倍缩放,会生成对应缩放后的多组图像。](#实验 8:以不同插值方法(最近邻、双线性、区域重采样 ),对图像进行 0.5 倍、1.5 倍、2.0 倍缩放,会生成对应缩放后的多组图像。)
- [实验 9:生成原始图像,以及经模糊、锐化、边缘检测、浮雕卷积滤波后的图像。](#实验 9:生成原始图像,以及经模糊、锐化、边缘检测、浮雕卷积滤波后的图像。)
- [实验 10:生成原始灰度图像、Sobel X 方向梯度、Sobel Y 方向梯度、Sobel 梯度幅值、Canny 边缘检测的图像,还有梯度矩阵原理说明图 。](#实验 10:生成原始灰度图像、Sobel X 方向梯度、Sobel Y 方向梯度、Sobel 梯度幅值、Canny 边缘检测的图像,还有梯度矩阵原理说明图 。)
三、(准备工作:玩具咋玩)图像以矩阵形式存储,那矩阵一变、图像立刻跟着变?
你好! 从LED冬奥会、奥运会及春晚等等大屏,到手机小屏,快来挖一挖里面都有什么。
废话不多说,上图,上代码,再上新图
原图

# %% [markdown]
# # 系统性图像矩阵处理实验
# **参考教材**:冈萨雷斯《数字图像处理》、现代颜色技术原理、图像画质算法
#
# 实验顺序:
# 1. 图像加载与矩阵表示
# 2. 颜色通道分离与重组
# 3. 图像二值化(阈值处理)
# 4. 亮度调整(矩阵标量乘法)
# 5. 对比度调整(矩阵线性变换)
# 6. 图像翻转(矩阵索引操作)
# 7. 图像旋转(矩阵转置与重排)
# 8. 图像缩放(矩阵重采样)
# 9. 卷积滤波(矩阵卷积运算)
# 10. 边缘检测(梯度矩阵计算)
# %% [code]
# 安装必要库
!pip install opencv-python matplotlib numpy scikit-image
# %% [code]
import cv2
import numpy as np
import matplotlib.pyplot as plt
from google.colab import files
from skimage import transform
# 上传图像到Colab
uploaded = files.upload()
image_path = list(uploaded.keys())[0]
# %% [markdown]
# ## 实验1:图像加载与矩阵表示
# **核心原理**:图像本质是三维矩阵 [高度, 宽度, 通道]
# - 彩色图像:3通道 (B, G, R)
# - 灰度图像:单通道
# %% [code]
# 实验1:图像加载与矩阵表示
def experiment1(img_path):
# 读取图像为NumPy矩阵
img = cv2.imread(img_path)
print("✅ 图像已加载为三维矩阵")
print(f"矩阵形状: {img.shape} (高度, 宽度, 通道)")
print(f"矩阵数据类型: {img.dtype}")
print(f"像素值范围: {img.min()} ~ {img.max()}")
# 显示原始图像
plt.figure(figsize=(12, 6))
# 彩色图像显示
plt.subplot(121)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('原始彩色图像')
plt.axis('off')
# 转换为灰度图像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print(f"\n灰度矩阵形状: {gray_img.shape} (高度, 宽度)")
# 灰度图像显示
plt.subplot(122)
plt.imshow(gray_img, cmap='gray')
plt.title('灰度图像矩阵')
plt.axis('off')
plt.tight_layout()
plt.show()
# 显示矩阵切片(左上角10x10区域)
print("\n🔍 彩色图像左上角10x10x3矩阵切片:")
print(img[:10, :10])
print("\n🔍 灰度图像左上角10x10矩阵切片:")
print(gray_img[:10, :10])
return img, gray_img
# 执行实验1
original_img, gray_img = experiment1(image_path)
# %% [markdown]
# ## 实验2:颜色通道分离与重组
# **核心原理**:彩色图像由BGR三个通道矩阵组成
# - 分离通道:提取单通道矩阵
# - 重组通道:改变通道组合顺序
# %% [code]
# 实验2:颜色通道分离与重组
def experiment2(img):
# 分离BGR三个通道
b, g, r = cv2.split(img)
# 创建纯色通道矩阵
zero_channel = np.zeros_like(b)
# 重组不同通道组合
red_only = cv2.merge([zero_channel, zero_channel, r])
green_only = cv2.merge([zero_channel, g, zero_channel])
blue_only = cv2.merge([b, zero_channel, zero_channel])
swapped_channels = cv2.merge([r, g, b]) # RGB顺序
# 可视化
plt.figure(figsize=(15, 10))
# 原始图像
plt.subplot(231)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('原始图像')
plt.axis('off')
# 红色通道
plt.subplot(232)
plt.imshow(cv2.cvtColor(red_only, cv2.COLOR_BGR2RGB))
plt.title('仅红色通道')
plt.axis('off')
# 绿色通道
plt.subplot(233)
plt.imshow(cv2.cvtColor(green_only, cv2.COLOR_BGR2RGB))
plt.title('仅绿色通道')
plt.axis('off')
# 蓝色通道
plt.subplot(234)
plt.imshow(cv2.cvtColor(blue_only, cv2.COLOR_BGR2RGB))
plt.title('仅蓝色通道')
plt.axis('off')
# 通道交换 (BGR → RGB)
plt.subplot(235)
plt.imshow(cv2.cvtColor(swapped_channels, cv2.COLOR_BGR2RGB))
plt.title('通道交换 (BGR→RGB)')
plt.axis('off')
# 创建特殊通道组合
custom_channels = cv2.merge([b, r, g]) # 蓝+红+绿
plt.subplot(236)
plt.imshow(cv2.cvtColor(custom_channels, cv2.COLOR_BGR2RGB))
plt.title('自定义通道组合 (B+R+G)')
plt.axis('off')
plt.tight_layout()
plt.show()
# 矩阵变化说明
print("\n🎨 通道分离与重组矩阵操作说明:")
print("1. 分离通道: b, g, r = cv2.split(img)")
print("2. 创建零矩阵: zero_channel = np.zeros_like(b)")
print("3. 重组通道: cv2.merge([ch1, ch2, ch3])")
print("4. 通道交换改变了颜色信息的排列顺序")
# 执行实验2
experiment2(original_img)
# %% [markdown]
# ## 实验3:图像二值化(阈值处理)
# **核心原理**:通过阈值将灰度矩阵转换为二值矩阵
# - 矩阵元素值:0(黑) 或 255(白)
# - 公式:dst(x,y) = { 255 if src(x,y) > thresh else 0 }
# %% [code]
# 实验3:图像二值化
def experiment3(gray_img):
# 设置不同阈值
thresholds = [50, 100, 150]
plt.figure(figsize=(15, 8))
# 原始灰度图像
plt.subplot(141)
plt.imshow(gray_img, cmap='gray')
plt.title('原始灰度图像')
plt.axis('off')
# 不同阈值二值化
for i, thresh in enumerate(thresholds):
# 二值化矩阵操作
_, binary_img = cv2.threshold(gray_img, thresh, 255, cv2.THRESH_BINARY)
plt.subplot(1, 4, i+2)
plt.imshow(binary_img, cmap='gray')
plt.title(f'阈值={thresh}')
plt.axis('off')
# 打印矩阵变化信息
print(f"\n🔲 阈值={thresh}时矩阵变化:")
print(f"像素值>={thresh}的像素比例: {np.mean(binary_img == 255)*100:.1f}%")
plt.tight_layout()
plt.show()
# 矩阵操作说明
print("\n⚙️ 二值化矩阵操作:")
print("_, binary = cv2.threshold(gray_img, threshold_value, 255, cv2.THRESH_BINARY)")
print("本质是: binary_matrix = np.where(gray_matrix >= threshold, 255, 0)")
# 执行实验3
experiment3(gray_img)
# %% [markdown]
# ## 实验4:亮度调整(矩阵标量乘法)
# **核心原理**:通过标量乘法调整整个矩阵值
# - 公式:dst = src * alpha + beta
# - alpha: 增益(控制对比度)
# - beta: 偏置(控制亮度)
# %% [code]
# 实验4:亮度调整
def experiment4(img):
# 创建调整参数
adjustments = [
("变暗", 0.7, -20),
("原始", 1.0, 0),
("变亮", 1.3, 30),
("高对比度", 1.8, -50)
]
plt.figure(figsize=(15, 10))
for i, (title, alpha, beta) in enumerate(adjustments):
# 矩阵运算: dst = img * alpha + beta
adjusted = cv2.convertScaleAbs(img, alpha=alpha, beta=beta)
# 可视化
plt.subplot(2, 2, i+1)
plt.imshow(cv2.cvtColor(adjusted, cv2.COLOR_BGR2RGB))
plt.title(f'{title}\n(alpha={alpha}, beta={beta})')
plt.axis('off')
# 计算矩阵变化
diff = adjusted.astype(np.float32) - img.astype(np.float32)
print(f"\n💡 {title}矩阵变化统计:")
print(f"平均亮度变化: {np.mean(diff):.1f}")
print(f"最大亮度变化: {np.max(diff):.1f}")
plt.tight_layout()
plt.show()
# 矩阵操作说明
print("\n🔧 亮度调整矩阵操作:")
print("adjusted = cv2.convertScaleAbs(img, alpha=alpha, beta=beta)")
print("等效于: adjusted_matrix = np.clip(img_matrix * alpha + beta, 0, 255).astype(np.uint8)")
# 执行实验4
experiment4(original_img)
# %% [markdown]
# ## 实验5:对比度调整(矩阵线性变换)
# **核心原理**:通过分段线性变换调整对比度
# - 增强特定亮度范围的对比度
# - 压缩其他范围的对比度
# %% [code]
# 实验5:对比度调整
def experiment5(img):
# 创建对比度调整矩阵操作
def adjust_contrast(matrix, low=0, high=255, new_low=0, new_high=255):
# 线性变换公式
slope = (new_high - new_low) / (high - low)
adjusted = matrix.astype(np.float32)
adjusted = (adjusted - low) * slope + new_low
return np.clip(adjusted, 0, 255).astype(np.uint8)
# 创建调整参数
adjustments = [
("原始对比度", 0, 255, 0, 255),
("增强中间调", 50, 200, 0, 255),
("压暗高光", 0, 200, 0, 255),
("提高阴影", 50, 255, 0, 255)
]
plt.figure(figsize=(15, 10))
for i, (title, low, high, new_low, new_high) in enumerate(adjustments):
adjusted = adjust_contrast(img, low, high, new_low, new_high)
# 可视化
plt.subplot(2, 2, i+1)
plt.imshow(cv2.cvtColor(adjusted, cv2.COLOR_BGR2RGB))
plt.title(f'{title}\n输入范围:[{low},{high}]→输出:[{new_low},{new_high}]')
plt.axis('off')
# 打印变换函数
print(f"\n📊 {title}变换函数:")
print(f"y = (x - {low}) * {(new_high-new_low)/(high-low):.2f} + {new_low}")
plt.tight_layout()
plt.show()
# 执行实验5
experiment5(original_img)
# %% [markdown]
# ## 实验6:图像翻转(矩阵索引操作)
# **核心原理**:通过矩阵索引重排实现图像翻转
# - 水平翻转:matrix[:, ::-1, :]
# - 垂直翻转:matrix[::-1, :, :]
# - 对角线翻转:matrix[::-1, ::-1, :]
# %% [code]
# 实验6:图像翻转
def experiment6(img):
# 矩阵翻转操作
flip_horizontal = img[:, ::-1, :] # 水平翻转
flip_vertical = img[::-1, :, :] # 垂直翻转
flip_both = img[::-1, ::-1, :] # 对角线翻转
plt.figure(figsize=(15, 10))
# 原始图像
plt.subplot(221)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('原始图像')
plt.axis('off')
# 水平翻转
plt.subplot(222)
plt.imshow(cv2.cvtColor(flip_horizontal, cv2.COLOR_BGR2RGB))
plt.title('水平翻转 (矩阵列索引反转)')
plt.axis('off')
# 垂直翻转
plt.subplot(223)
plt.imshow(cv2.cvtColor(flip_vertical, cv2.COLOR_BGR2RGB))
plt.title('垂直翻转 (矩阵行索引反转)')
plt.axis('off')
# 对角线翻转
plt.subplot(224)
plt.imshow(cv2.cvtColor(flip_both, cv2.COLOR_BGR2RGB))
plt.title('对角线翻转 (行列索引同时反转)')
plt.axis('off')
plt.tight_layout()
plt.show()
# 矩阵操作说明
print("\n🔄 翻转矩阵操作说明:")
print("水平翻转: flipped = img[:, ::-1, :]")
print("垂直翻转: flipped = img[::-1, :, :]")
print("对角线翻转: flipped = img[::-1, ::-1, :]")
print("原理:通过NumPy索引操作重新排列像素位置")
# 执行实验6
experiment6(original_img)
# %% [markdown]
# ## 实验7:图像旋转(矩阵转置与重排)
# **核心原理**:通过旋转矩阵进行坐标变换
# - 90°旋转:矩阵转置 + 翻转
# - 任意角度:仿射变换矩阵
# %% [code]
# 实验7:图像旋转
def experiment7(img):
# 90°倍数旋转
rotate_90 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 顺时针90°
rotate_180 = cv2.rotate(img, cv2.ROTATE_180) # 180°
rotate_270 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) # 逆时针90°
# 任意角度旋转(45°)
h, w = img.shape[:2]
center = (w//2, h//2)
M = cv2.getRotationMatrix2D(center, 45, 1.0) # 旋转矩阵
rotate_45 = cv2.warpAffine(img, M, (w, h))
plt.figure(figsize=(15, 12))
# 原始图像
plt.subplot(231)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('原始图像')
plt.axis('off')
# 90°旋转
plt.subplot(232)
plt.imshow(cv2.cvtColor(rotate_90, cv2.COLOR_BGR2RGB))
plt.title('顺时针90°旋转')
plt.axis('off')
# 180°旋转
plt.subplot(233)
plt.imshow(cv2.cvtColor(rotate_180, cv2.COLOR_BGR2RGB))
plt.title('180°旋转')
plt.axis('off')
# 270°旋转
plt.subplot(234)
plt.imshow(cv2.cvtColor(rotate_270, cv2.COLOR_BGR2RGB))
plt.title('逆时针90°旋转')
plt.axis('off')
# 任意角度旋转
plt.subplot(235)
plt.imshow(cv2.cvtColor(rotate_45, cv2.COLOR_BGR2RGB))
plt.title('45°旋转')
plt.axis('off')
# 旋转矩阵可视化
plt.subplot(236)
plt.text(0.1, 0.5, f"旋转矩阵(45°):\n{M}", fontsize=12)
plt.axis('off')
plt.tight_layout()
plt.show()
# 矩阵操作说明
print("\n🔄 旋转矩阵操作说明:")
print("90°旋转: 使用cv2.rotate()函数")
print("任意角度: 创建旋转矩阵 + cv2.warpAffine()")
print("旋转矩阵本质是坐标变换: x' = a*x + b*y + c, y' = d*x + e*y + f")
# 执行实验7
experiment7(original_img)
# %% [markdown]
# ## 实验8:图像缩放(矩阵重采样)
# **核心原理**:通过插值算法重新采样矩阵
# - 最近邻插值:快速,有锯齿
# - 双线性插值:平滑,质量较好
# - 区域重采样:保持纹理特征
# %% [code]
# 实验8:图像缩放
def experiment8(img):
# 设置缩放比例
scale_factors = [0.5, 1.5, 2.0]
methods = [
("最近邻", cv2.INTER_NEAREST),
("双线性", cv2.INTER_LINEAR),
("区域重采样", cv2.INTER_AREA)
]
plt.figure(figsize=(15, 12))
# 原始图像
plt.subplot(331)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('原始图像')
plt.axis('off')
# 不同缩放方法
row = 1
for scale in scale_factors:
for col, (name, interp) in enumerate(methods):
# 计算新尺寸
new_size = (int(img.shape[1] * scale), int(img.shape[0] * scale)
# 执行缩放
resized = cv2.resize(img, new_size, interpolation=interp)
# 可视化
plt.subplot(3, 3, row)
plt.imshow(cv2.cvtColor(resized, cv2.COLOR_BGR2RGB))
plt.title(f'{name}缩放 {scale}x')
plt.axis('off')
# 显示矩阵信息
print(f"\n🖼️ {name}缩放 {scale}x: 新矩阵形状 {resized.shape}")
row += 1
plt.tight_layout()
plt.show()
# 矩阵操作说明
print("\n📐 缩放矩阵操作说明:")
print("缩放本质是重采样: 根据新尺寸重新计算每个像素值")
print("不同插值方法影响重采样质量:")
print("1. 最近邻: 取最近像素值,速度快但质量低")
print("2. 双线性: 4个最近像素加权平均,平衡速度质量")
print("3. 区域重采样: 考虑像素区域关系,适合缩小图像")
# 执行实验8
experiment8(original_img)
# %% [markdown]
# ## 实验9:卷积滤波(矩阵卷积运算)
# **核心原理**:使用核矩阵与图像进行卷积运算
# - 滤波核:3x3或5x5矩阵
# - 卷积操作:核矩阵与图像局部区域点乘后求和
# %% [code]
# 实验9:卷积滤波
def experiment9(img):
# 定义滤波核
kernels = {
"模糊": np.ones((5,5), np.float32)/25,
"锐化": np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32),
"边缘检测": np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], np.float32),
"浮雕": np.array([[-2, -1, 0], [-1, 1, 1], [0, 1, 2]], np.float32)
}
plt.figure(figsize=(15, 10))
# 原始图像
plt.subplot(231)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('原始图像')
plt.axis('off')
# 应用不同滤波器
for i, (name, kernel) in enumerate(kernels.items()):
# 执行卷积
filtered = cv2.filter2D(img, -1, kernel)
# 可视化
plt.subplot(2, 3, i+2)
plt.imshow(cv2.cvtColor(filtered, cv2.COLOR_BGR2RGB))
plt.title(f'{name}滤波')
plt.axis('off')
# 显示核矩阵
print(f"\n🔶 {name}滤波核:")
print(kernel)
plt.tight_layout()
plt.show()
# 矩阵操作说明
print("\n🌀 卷积滤波矩阵操作说明:")
print("卷积公式: dst(x,y) = Σ(kernel(i,j) * src(x+i, y+j))")
print("本质:核矩阵在图像上滑动,计算局部区域的加权和")
# 执行实验9
experiment9(original_img)
# %% [markdown]
# ## 实验10:边缘检测(梯度矩阵计算)
# **核心原理**:通过计算图像梯度矩阵检测边缘
# - Sobel算子:计算x/y方向梯度
# - Canny算法:多阶段边缘检测
# %% [code]
# 实验10:边缘检测
def experiment10(gray_img):
# Sobel边缘检测
sobel_x = cv2.Sobel(gray_img, cv2.CV_64F, 1, 0, ksize=5)
sobel_y = cv2.Sobel(gray_img, cv2.CV_64F, 0, 1, ksize=5)
sobel_combined = np.sqrt(sobel_x**2 + sobel_y**2)
# Canny边缘检测
edges = cv2.Canny(gray_img, 100, 200)
plt.figure(figsize=(15, 10))
# 原始灰度图像
plt.subplot(231)
plt.imshow(gray_img, cmap='gray')
plt.title('原始灰度图像')
plt.axis('off')
# Sobel X方向
plt.subplot(232)
plt.imshow(np.abs(sobel_x), cmap='gray')
plt.title('Sobel X方向梯度')
plt.axis('off')
# Sobel Y方向
plt.subplot(233)
plt.imshow(np.abs(sobel_y), cmap='gray')
plt.title('Sobel Y方向梯度')
plt.axis('off')
# Sobel组合
plt.subplot(234)
plt.imshow(sobel_combined, cmap='gray')
plt.title('Sobel梯度幅值')
plt.axis('off')
# Canny边缘检测
plt.subplot(235)
plt.imshow(edges, cmap='gray')
plt.title('Canny边缘检测')
plt.axis('off')
# 梯度矩阵说明
plt.subplot(236)
plt.text(0.1, 0.4,
"梯度矩阵计算原理:\n"
"Gx = Sobel_x * I (水平变化率)\n"
"Gy = Sobel_y * I (垂直变化率)\n"
"|G| = √(Gx² + Gy²)\n"
"Canny算法使用双阈值检测边缘",
fontsize=12)
plt.axis('off')
plt.tight_layout()
plt.show()
# 矩阵操作说明
print("\n📈 边缘检测矩阵操作说明:")
print("Sobel算子:计算图像在x/y方向的导数")
print("Canny算法:高斯滤波 → 梯度计算 → 非极大值抑制 → 双阈值检测")
# 执行实验10
experiment10(gray_img)
# %% [markdown]
# ## 知识体系总结
# 通过以上10个实验,我们系统性地学习了:
#
# 1. **图像本质**:图像即矩阵(三维:高度×宽度×通道)
# 2. **基础操作**:通道分离、二值化、亮度/对比度调整
# 3. **几何变换**:翻转、旋转、缩放(矩阵索引与重采样)
# 4. **图像增强**:线性变换、卷积滤波
# 5. **特征提取**:边缘检测(梯度计算)
#
# > 掌握这些核心矩阵操作后,您可以自由组合创造更复杂的图像处理效果!
# %% [code]
# 保存所有实验代码到文件
with open('image_matrix_experiments.py', 'w') as f:
f.write("""
# 图像矩阵处理实验完整代码
# 包含10个核心实验,可直接运行
import cv2
import numpy as np
import matplotlib.pyplot as plt
# ...(此处包含上面所有实验函数)""")
# 下载代码文件
files.download('image_matrix_experiments.py')
发挥了钞能力之后的图

上述代码包含 10 个图像处理实验,每个实验会生成对应处理后的图像,以下为各实验对应生成图像的大致情况:
实验 1:生成原始彩色图像和灰度图像,还会展示彩色与灰度图像的矩阵切片信息。
实验 2:生成原始图像、仅红色通道、仅绿色通道、仅蓝色通道、通道交换(BGR→RGB )、自定义通道组合(B + R + G )的图像。
实验 3:生成原始灰度图像,以及阈值为 50、100、150 的二值化图像 。
实验 4:生成变暗(alpha = 0.7,beta = -20 )、原始、变亮(alpha = 1.3,beta = 30 )、高对比度(alpha = 1.8,beta = -50 )调整后的图像。
实验 5:生成原始对比度、增强中间调(输入范围 [50,200]→输出 [0,255] )、压暗高光(输入范围 [0,200]→输出 [0,255] )、提高阴影(输入范围 [50,255]→输出 [0,255] )调整后的图像。
实验 6:生成原始图像、水平翻转、垂直翻转、对角线翻转后的图像。
实验 7:生成原始图像、顺时针 90° 旋转、180° 旋转、逆时针 90° 旋转、45° 旋转后的图像,还有旋转矩阵可视化图。
实验 8:以不同插值方法(最近邻、双线性、区域重采样 ),对图像进行 0.5 倍、1.5 倍、2.0 倍缩放,会生成对应缩放后的多组图像。
实验 9:生成原始图像,以及经模糊、锐化、边缘检测、浮雕卷积滤波后的图像。
实验 10:生成原始灰度图像、Sobel X 方向梯度、Sobel Y 方向梯度、Sobel 梯度幅值、Canny 边缘检测的图像,还有梯度矩阵原理说明图 。
邓爷爷也说过,理论和实际相结合嘛。咱们做了一波实验,然后再学点理论,再做实验...反反复复,这快慢慢随着我的老年斑的增长,经验值是不是就上来了
如果想了解一些成像系统、图像、人眼、颜色等等的小知识,快去看看视频吧 :
- GodWarrior、抖音号:59412983611
- B站:宇宙第一AIYWM
- 认准一个头像,保你不迷路:
- 认准一个头像,保你不迷路: