当前位置: 首页 > news >正文

数字图像处理(四:图像如果当作矩阵,那加减乘除处理了矩阵,那图像咋变):从LED冬奥会、奥运会及春晚等等大屏,到手机小屏,快来挖一挖里面都有什么

数字图像处理(四)

  • 三、(准备工作:玩具咋玩)图像以矩阵形式存储,那矩阵一变、图像立刻跟着变?
    • 原图
    • 发挥了钞能力之后的图
      • 上述代码包含 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 边缘检测的图像,还有梯度矩阵原理说明图 。

三、(准备工作:玩具咋玩)图像以矩阵形式存储,那矩阵一变、图像立刻跟着变?

你好! 从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 + betaadjusted = 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_lowreturn 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 = 1for 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 += 1plt.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
    • 认准一个头像,保你不迷路:
      在这里插入图片描述
http://www.dtcms.com/a/289051.html

相关文章:

  • 41.FeignClient整合Sentinel
  • 7-20 关于mysql
  • C#.NET EFCore.BulkExtensions 扩展详解
  • 【机器学习工具】Weights Biases
  • C++string类用法
  • gradle微服务依赖模版
  • OpenTelemetry学习笔记(九):Elastic 对 OTLP 的原生支持
  • 【成品设计】基于STM32的宠物检测系统
  • 状态管理与团队协作 - SRE 的核心关切
  • Flink2.0学习笔记:Table API SQL
  • Ubuntu 24.04 设置静态 IP 的方法
  • XILINX JESD204B/C IP的AXI配置
  • leetCode——1492. n的第k个因子
  • ps2025下载与安装教程(附安装包) 2025最新版photoshop安装教程
  • 进阶向:基于Python的局域网文件传输工具
  • 初识软件测试
  • Redis 详解:从入门到进阶
  • Hiredis 构建 Redis 命令实战指南
  • 基于pi/4-QPSK扩频解扩和gardner环定时同步的通信系统matlab性能仿真
  • 绝对定位 vs 浮动:CSS布局核心差异解析
  • Spring 源码阅读(二) 核心概念解析 ApplicationContext、类型转化
  • 企业安全防护:堡垒机技术解析
  • 数据结构与算法汇总
  • spring-cloud使用
  • 再谈文件-ext2文件系统
  • NISP-PTE基础实操——XSS
  • PPT科研画图插件
  • 力扣-55.跳跃游戏
  • 【C语言】内存函数介绍(上)
  • axios二次封装-单个、特定的实例的拦截器、所有实例的拦截器。