数字图像处理(四:图像如果当作矩阵,那加减乘除处理了矩阵,那图像咋变):从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.pswp.cn/news/915914.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot航空订票系统的设计与实现

文章目录前言详细视频演示具体实现截图后端框架SpringBoot持久层框架Hibernate成功系统案例:代码参考数据库源码获取前言 博主介绍:CSDN特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续输出高质…

2025年PostgreSQL 详细安装教程(windows)

前言 PostgreSQL 是一个功能强大的开源关系型数据库管理系统(ORDBMS),以下是对它的全面介绍: 基本概况 名称:通常简称为 "Postgres" 类型:对象-关系型数据库管理系统 许可:开源,采用类MIT许可…

Java日志按天切分方法

使用 Logrotate(推荐)Logrotate 是 Linux 系统自带的日志管理工具,支持自动切割、压缩和删除旧日志。步骤:创建 Logrotate 配置文件在 /etc/logrotate.d/ 下新建配置文件(如 java-app):sudo nan…

进阶向:基于Python的本地文件内容搜索工具

概述 大家好!今天我们将一起学习如何用Python创建一个简单但强大的本地文件内容搜索工具。这个工具特别适合处理大量文本文件时的快速检索需求。 为什么要学习这个工具 如果你刚接触编程,完全不用担心!我会从零开始讲解,确保每…

多模态AI的可解释性

多模态AI的可解释性挑战 在深入探讨解决方案之前,首先需要精确地定义问题。多模态模型因其固有的复杂性,其内部决策过程对于人类观察者而言是不透明的。 模态融合机制 (Modal Fusion Mechanism):模型必须将来自不同来源(如图像和文…

MySQL深度理解-MySQL事务优化

1.什么是事务事务就是进行多个操作,要么同时执行成功,要么同时执行失败。2.事务的特性 - ACID特性2.1原子性Atomicity原子性(Atomicity):当前事务的操作要么同时成功,要么同时失败。原子性由undo log日志来…

2025小学所有学习科目的全部版本电子教材

2025春小学最新课本-新版电子教材【文末自行获取全部资料~】 小学语文: 小学数学: 小学英语: 小学科学: 小学道德与法治: 小学劳动技术: 小学美术: 小学书法练习指导: 小学体育与健康…

华为视觉算法面试30问全景精解

华为视觉算法面试30问全景精解 ——技术引领 工程极致 智能未来:华为视觉算法面试核心考点全览 前言 华为作为全球领先的ICT(信息与通信技术)解决方案供应商,在智能终端、云计算、智慧城市、自动驾驶、工业互联网等领域持续推动视觉AI的创新与产业落地。华为视觉算法岗…

【Anaconda】Conda 虚拟环境打包迁移教程

Conda 虚拟环境打包迁移教程本文介绍如何使用 conda-pack 将 Conda 虚拟环境打包,并在另一台电脑上快速迁移、部署。0. 安装 conda-pack conda-pack 并非 Conda 默认自带工具,首次使用前必须手动安装。以下两种安装方式任选其一即可: ✅ 方法…

matrix-breakout-2-morpheus靶机通关教程

目录 一、信息搜集 二、尝试GetShell 三、反弹Shell 一、信息搜集 首先搜集信息,观察页面。 发现什么都没有,我们先来发现一下它的IP以及开放的端口。首先我们观察一下它的网络模式是怎么样的,来确定IP段。 可以发现他是NAT模式&#xff0…

深入思考【九九八十一难】的意义,试用歌曲能否解释

1. 《平凡之路》- 朴树契合点:前半生追求明白:“我曾经失落失望失掉所有方向,直到看见平凡才是唯一的答案”。后半生修行糊涂:“时间无言,如此这般,明天已在眼前”。对过去的释然与对未来的随缘&#xff0c…

SSM之表现层数据封装-统一响应格式全局异常处理

SSM之表现层数据封装-统一响应格式&全局异常处理一、为什么需要表现层数据封装?二、表现层数据封装的通用格式成功响应示例失败响应示例三、SSM中实现统一响应对象3.1 定义响应对象类(Result.java)四、全局异常处理4.1 实现全局异常处理器…

微软Fabric重塑数据管理:Forrester报告揭示高ROI

在数字化转型加速的今天,微软公司推出的Microsoft Fabric数据管理平台正以其卓越的经济效益和全面的技术能力引领行业变革。根据Forrester Consulting最新发布的总体经济影响(TEI)研究报告,该平台展现出令人瞩目的商业价值:实现379%的投资回报…

基于Qt和OpenCV的图片与视频编辑器

应用技术:Qt C、OpenCV、多线程、单例模式,qss样式表、OpenGL、ffmpeg。 本项目为Qt mingw6.5.3版本,QtCreator编写运行。 void XVideoWidget::do_setImage(cv::Mat mat) {QImage::Format fmt QImage::Format_RGB888;int pixSize 3;//处理…

NOTEPAD!NPCommand函数分析之comdlg32!GetSaveFileNameW--windows记事本源代码分析

第一部分:kd> kcUSER32!InternalCallWinProc USER32!UserCallDlgProcCheckWow USER32!DefDlgProcWorker USER32!SendMessageWorker USER32!InternalCreateDialog USER32!InternalDialogBox USER32!DialogBoxIndirectParamAorW USER32!DialogBoxIndirectParamW US…

【Qt开发】信号与槽(一)

目录 1 -> 信号和槽概述 1.1 -> 信号的本质 1.2 -> 槽的本质 2 -> 信号与槽的连接方式 2.1 -> 一对一 2.2 -> 一对多 2.3 -> 多对一 3 -> 小结 1 -> 信号和槽概述 在 Qt 中,用户和控件的每次交互过程称为一个事件。比如 “用户…

目标检测中的标签分配算法总结

目标检测中的标签分配算法是训练过程中的一个核心环节,它决定了如何将标注好的真实目标框分配给模型预测出来的候选框(Anchor Boxes或Points),从而为这些候选框提供监督信号(正样本、负样本、忽略样本)。它…

图片转 PDF三个免费方法总结

📌 为什么需要图片转 PDF? 在工作和生活中,我们经常需要将多张图片整理成 PDF 文档,例如:工作资料归档, 学习笔记整理,作品集展示,便捷分享。 方法一、iLoveOFD在线工具 提供图片…

Kafka 在分布式系统中的关键特性与机制深度解析

在分布式系统架构中,消息中间件扮演着 "数据枢纽" 的核心角色,而 Kafka 凭借其卓越的性能和可靠性,成为众多企业的首选。本文将深入剖析 Kafka 在分布式环境中的核心特性与底层机制,揭示其高吞吐、高可用的底层逻辑。一…

Python实战:基于Streamlit的股票筛选系统,实时K线图+数据缓存优化

基于 Streamlit 构建的股票筛选分析工具,整合了 Tushare 接口获取股票数据,并通过交互式界面实现股票筛选、信息展示和 K 线图分析。以下是深度解读:一、代码结构概览依赖库导入import streamlit as st import tushare as ts import pandas a…