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

OpenCV 进阶实战与技巧——图像处理的全面解析

在上篇文章中,我们一起迈入了 Python OpenCV 的奇妙世界,学习了图像的读取、显示和保存等基本操作:用Python和OpenCV开启图像处理魔法之旅-CSDN博客。今天,我们将继续深入,探索图像的各种变换、滤波、边缘检测以及更深入地理解图像的数据表示和属性。准备好进一步驾驭你手中的像素了吗?Let's go!

 

 

目录

一、图像数据基础

像素与数组表示

颜色空间

图像属性

二、几何变换与插值

平移

旋转

缩放

三、图像锐化与直方图处理

图像锐化

直方图处理

四、图像滤波与平滑

均值滤波

中值滤波

高斯滤波

 效果示意​编辑

含椒盐噪声的图像

均值滤波后的图像

中值滤波后的图像

高斯滤波后的图像

五、综合应用案例

结语:探索无止境的图像世界


一、图像数据基础

像素与数组表示

在 OpenCV 中,图像是以多维数组的形式存储的,其中每个元素即为图像的一个像素。对于彩色图像,默认采用 BGR 颜色顺序表示。例如,以下代码展示如何读取图像并访问其中某个像素的 B、G、R 值:

import cv2# 读取图像(确保路径正确)
img = cv2.imread("sample.jpg")# 获取图像的尺寸:高度、宽度、通道数
height, width, channels = img.shape
print("图像尺寸:", height, width, channels)# 访问图像的某个像素,例如 (x=100, y=50)
b, g, r = img[50, 100]
print("像素 (100,50) 的 BGR 值:", b, g, r)

颜色空间

除了默认的 BGR,OpenCV 支持多种颜色空间转换,如灰度、HSV、LAB 等。以下代码展示如何将彩色图像转换为灰度和 HSV 图像:

import cv2img = cv2.imread("sample.jpg")# 将 BGR 转换为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 将 BGR 转换为 HSV 图像
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)cv2.imshow("灰度图", gray_img)
cv2.imshow("HSV图", hsv_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像属性

图像属性包括尺寸、坐标以及数据类型,这些信息有助于我们了解图像内部结构。例如,img.shape 返回一个元组表示图像尺寸,而 img.dtype 则表示数据类型:

import cv2img = cv2.imread("sample.jpg")print("尺寸 (height, width, channels):", img.shape)
print("图像数据类型:", img.dtype)

 

二、几何变换与插值

几何变换主要用于对图像进行平移、旋转、缩放等操作。在这些变换过程中,插值方法决定了变换后图像的平滑程度,常用的插值方法有最近邻插值、双线性插值和立方插值等。

OpenCV图像坐标与常规的数学坐标有区别,左上角位置为坐标原点,X轴向左为正,Y轴向下为正

平移

利用仿射变换矩阵实现图像平移。下面代码将图像向右平移 100 像素,向下平移 50 像素:

import cv2
import numpy as npimg = cv2.imread("sample.jpg")
rows, cols = img.shape[:2]# 平移矩阵:tx 为 x 方向平移,ty 为 y 方向平移
M_translate = np.float32([[1, 0, 100], [0, 1, 50]])
translated_img = cv2.warpAffine(img, M_translate, (cols, rows),flags=cv2.INTER_LINEAR)  # INTER_LINEAR 为双线性插值cv2.imshow("平移效果", translated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • img.shape[:2]img.shape 返回一个元组,包含图像的行数、列数和通道数(对于彩色图像)。[:2] 表示取前两个元素,即行数和列数,并分别赋值给变量 rows 和 cols
  • np.float32([[1, 0, 100], [0, 1, 50]]):使用 numpy 的 float32 数据类型创建一个 2x3 的矩阵 M_translate,其中 t_x = 100 表示在 x 方向向右平移 100 个像素,t_y = 50 表示在 y 方向向下平移 50 个像素。
  • cv2.warpAffine 是 OpenCV 中用于进行仿射变换的函数。
  • 参数解释
    • img:输入的原始图像。
    • M_translate:前面创建的 2x3 仿射变换矩阵,用于描述平移操作。
    • (cols, rows):输出图像的大小,这里指定为与原始图像相同的大小。
    • flags=cv2.INTER_LINEAR:插值方法,cv2.INTER_LINEAR 表示使用双线性插值。在进行图像变换时,可能会出现新的像素位置不是整数的情况,需要通过插值方法来计算这些新位置的像素值。双线性插值是一种常用的插值方法,它通过对周围四个像素的值进行加权平均来计算新像素的值,能够得到较好的平滑效果。

旋转

利用 cv2.getRotationMatrix2D 得到旋转矩阵进行旋转操作,同时也可指定插值方法:

 

import cv2
import numpy as npimg = cv2.imread("sample.jpg")
rows, cols = img.shape[:2]center = (cols / 2, rows / 2)
angle = 45     # 旋转角度
scale = 1      # 缩放比例M_rotate = cv2.getRotationMatrix2D(center, angle, scale)
rotated_img = cv2.warpAffine(img, M_rotate, (cols, rows), flags=cv2.INTER_CUBIC)  # INTER_CUBIC 为立方插值cv2.imshow("旋转效果", rotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • center:这是旋转的中心点。(cols / 2, rows / 2) 代表以图像的中心作为旋转点。cols 是图像的列数,rows 是图像的行数,将它们各自除以 2 就能得到图像的中心坐标。
  • angle:表示旋转的角度,这里设定为 45 度,意味着图像会逆时针旋转 45 度。若角度为负数,则图像会顺时针旋转。
  • scale:是缩放比例,值为 1 时表示不进行缩放,图像在旋转过程中大小保持不变。若 scale 大于 1,图像会放大;若小于 1,图像则会缩小。
  • cv2.getRotationMatrix2D 是 OpenCV 提供的一个函数,其作用是根据给定的旋转中心、旋转角度和缩放比例来生成一个 2x3 的仿射变换矩阵。
  • cv2.warpAffine 同样是 OpenCV 中用于进行仿射变换的函数,在前面图像平移的代码里也有使用。

缩放

利用 cv2.resize 进行图像缩放,同时指定不同的插值方法,以获得更高的缩放质量。

import cv2img = cv2.imread("sample.jpg")# 缩小图像(双线性插值)
scaled_down = cv2.resize(img, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)# 放大图像(立方插值效果更好)
scaled_up = cv2.resize(img, (0, 0), fx=1.5, fy=1.5, interpolation=cv2.INTER_CUBIC)cv2.imshow("缩小图像", scaled_down)
cv2.imshow("放大图像", scaled_up)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

三、图像锐化与直方图处理

图像锐化

图像锐化是通过卷积核加强图像细节,常用方法是利用拉普拉斯增强或自定义卷积核。如下代码展示如何对图像进行锐化操作:

import cv2
import numpy as npimg = cv2.imread("sample.jpg")
kernel_sharpen = np.array([[-1, -1, -1],[-1, 9, -1],[-1, -1, -1]])sharpened_img = cv2.filter2D(img, -1, kernel_sharpen)cv2.imshow("锐化图像", sharpened_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 卷积核的作用:在图像处理中,卷积核(也叫滤波器)是一个小的矩阵,通过卷积操作可以对图像进行各种处理,像模糊、锐化等。锐化操作的目的是增强图像中物体的边缘和细节,让图像看起来更清晰。
  • 核元素的意义:这个 3x3 的卷积核 kernel_sharpen 中,中心元素为 9,周围元素为 -1。其原理是增强中心像素的权重,同时抑制周围像素的影响,这样就能增强图像中的高频部分(边缘和细节),从而达到锐化的效果。
  • cv2.filter2D 是 OpenCV 里用于进行二维卷积操作的函数。参数 -1 表示输出图像的数据类型和输入图像相同。如果指定为一个具体的数据类型,那么输出图像的数据类型就会按照指定的类型进行转换。

 

直方图处理

直方图可以反映图像灰度级分布,直方图均衡化能够改善图像对比度。以下代码展示如何计算直方图并进行均衡化处理:

import cv2
from matplotlib import pyplot as pltimg = cv2.imread("example.png", 0) 
# 读取灰度图,参数 0 表示以灰度模式读取图像,即图像的每个像素只有一个灰度值,取值范围是 0 到 255# 计算直方图
hist = cv2.calcHist([img], [0], None, [256], [0, 256])# 显示直方图
plt.figure()
plt.title("直方图")
plt.xlabel("灰度级")
plt.ylabel("像素数")
plt.plot(hist)
plt.xlim([0, 256])
plt.show()# 直方图均衡化
equalized_img = cv2.equalizeHist(img)
cv2.imshow("junhen", equalized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.calcHist 是 OpenCV 中用于计算图像直方图的函数。
  • 参数解释
    • [img]:表示输入的图像列表,这里只有一个图像 img,所以用列表形式传入。
    • [0]:表示要计算直方图的通道索引。因为图像是灰度图,只有一个通道,所以索引为 0。如果是彩色图像(有 BGR 三个通道),可以分别传入 [0][1][2] 来计算蓝色、绿色、红色通道的直方图。
    • None:表示没有掩码图像。掩码图像可以用于指定只计算图像的一部分区域的直方图,这里不使用掩码,所以为 None
    • [256]:表示直方图的 bins(区间)数量。这里将灰度值范围 0 到 255 划分为 256 个区间,每个区间代表一个灰度级。
    • [0, 256]:表示灰度值的范围,即从 0 到 255。
  • 计算结果 hist 是一个包含 256 个元素的一维数组,每个元素对应一个灰度级的像素数量。

cv2.equalizeHist 是 OpenCV 中用于直方图均衡化的函数。直方图均衡化是一种图像增强技术,它通过重新分布图像的像素值,使图像的直方图尽可能地均匀分布,从而增强图像的对比度。 

 

 


四、图像滤波与平滑

图像滤波技术主要用于去除噪声和改善图像质量,常用方法有均值滤波、中值滤波和高斯滤波。

均值滤波

均值滤波通过求解窗口内像素的平均值来平滑图像,适用于低噪声场景

import cv2img = cv2.imread("sample.jpg")
mean_filtered = cv2.blur(img, (5, 5))cv2.imshow("均值滤波", mean_filtered)
cv2.waitKey(0)
cv2.destroyAllWindows()

中值滤波

中值滤波特别适合处理椒盐噪声,它通过窗口中位数替换中心像素值。

import cv2img = cv2.imread("sample.jpg")
median_filtered = cv2.medianBlur(img, 5)  # 注意窗口尺寸必须为奇数cv2.imshow("中值滤波", median_filtered)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

高斯滤波

高斯滤波以高斯分布权重对图像进行平滑处理,在去除噪声的同时较好地保留边缘信息

import cv2img = cv2.imread("sample.jpg")
gaussian_filtered = cv2.GaussianBlur(img, (5, 5), 0)cv2.imshow("高斯滤波", gaussian_filtered)
cv2.waitKey(0)
cv2.destroyAllWindows()

 效果示意

含椒盐噪声的图像

椒盐噪声表现为图像上随机分布的黑白噪点 ,这些噪点破坏了图像原本的像素分布,使图像看起来杂乱,掩盖了图像原本的特征和细节。

均值滤波后的图像

  • 噪声处理效果:相比含椒盐噪声的图像,噪声有一定程度的减少。均值滤波通过计算滤波核内像素的平均值来替代中心像素值,将噪点的灰度值分散到周围像素中,从而在一定程度上平滑了噪声。
  • 图像细节变化:但同时图像整体变得模糊,边缘也不够清晰。这是因为均值滤波对滤波核内所有像素一视同仁地平均,在去除噪声的同时,也使图像中原本清晰的边缘和细节被平均化,导致细节损失。

中值滤波后的图像

  • 噪声处理效果:能明显看出中值滤波对椒盐噪声有很好的抑制作用,大部分噪点被去除。中值滤波是将滤波核内像素灰度值排序后取中间值,椒盐噪声这种离散的极端灰度值(黑或白)很容易被周围正常像素值替代。
  • 图像细节变化:与均值滤波相比,图像的边缘等细节保留得更好,图像相对更清晰。因为中值滤波不是简单的平均,它更倾向于保留与周围像素相似的值,所以能较好地保护图像边缘。

高斯滤波后的图像

  • 噪声处理效果:对噪声有一定的平滑作用,能减少部分噪声干扰 。高斯滤波根据高斯分布对滤波核内像素进行加权平均,距离中心像素越近的像素权重越大。
  • 图像细节变化:但对于椒盐噪声的去除效果不如中值滤波明显,图像仍然存在较多噪点。同时,图像也有一定程度的模糊,这是由于高斯滤波的加权平均特性,会使图像的细节和边缘在一定程度上被平滑 。

 

 

五、综合应用案例

下面是一个综合示例,将几何变换、锐化、直方图处理、滤波和边缘检测组合在一起进行展示。可以根据需要调整各个步骤的参数,以观察不同的处理效果。

 

import cv2
import numpy as np# 1. 读取图像,获取图像属性
img = cv2.imread("sample.jpg")
height, width, channels = img.shape
print("图像尺寸:", height, width, channels)# 2. 几何变换:平移、旋转、缩放
M_translate = np.float32([[1, 0, 50], [0, 1, 30]])
img_translated = cv2.warpAffine(img, M_translate, (width, height), flags=cv2.INTER_LINEAR)center = (width / 2, height / 2)
M_rotate = cv2.getRotationMatrix2D(center, 30, 1)
img_rotated = cv2.warpAffine(img_translated, M_rotate, (width, height), flags=cv2.INTER_CUBIC)img_scaled = cv2.resize(img_rotated, (0, 0), fx=1.2, fy=1.2, interpolation=cv2.INTER_LINEAR)# 3. 图像锐化
kernel_sharpen = np.array([[-1, -1, -1],[-1, 9, -1],[-1, -1, -1]])
img_sharpened = cv2.filter2D(img_scaled, -1, kernel_sharpen)# 4. 直方图均衡化(先转换为灰度再处理)
gray_img = cv2.cvtColor(img_sharpened, cv2.COLOR_BGR2GRAY)
equalized_img = cv2.equalizeHist(gray_img)# 5. 图像滤波(以高斯滤波平滑为例)
smoothed_img = cv2.GaussianBlur(equalized_img, (5, 5), 0)# 6. 边缘检测——Sobel 与 Scharr
sobelx = cv2.Sobel(smoothed_img, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(smoothed_img, cv2.CV_64F, 0, 1, ksize=3)
sobel_combined = cv2.addWeighted(cv2.convertScaleAbs(sobelx), 0.5,cv2.convertScaleAbs(sobely), 0.5, 0)scharrx = cv2.Scharr(smoothed_img, cv2.CV_64F, 1, 0)
schartry = cv2.Scharr(smoothed_img, cv2.CV_64F, 0, 1)
scharr_combined = cv2.addWeighted(cv2.convertScaleAbs(scharrx), 0.5,cv2.convertScaleAbs(schartry), 0.5, 0)# 7. 显示各阶段结果
cv2.imshow("原始图像", img)
cv2.imshow("几何变换后图像", img_scaled)
cv2.imshow("锐化图像", img_sharpened)
cv2.imshow("直方图均衡化", equalized_img)
cv2.imshow("平滑图像", smoothed_img)
cv2.imshow("Sobel 边缘", sobel_combined)
cv2.imshow("Scharr 边缘", scharr_combined)cv2.waitKey(0)
cv2.destroyAllWindows()

 

结语:探索无止境的图像世界

通过这第二篇博客,我们深入学习了 Python OpenCV 中更多关于图像处理和分析的技术,包括图像数据的表示、几何变换、锐化、滤波以及直方图处理。这些技能将为你进一步探索计算机视觉的更高级应用打下坚实的基础。

记住,学习是一个循序渐进的过程,动手实践至关重要。尝试使用不同的图像、不同的参数来运行这些代码,观察结果的变化,并思考为什么会产生这样的效果。在未来的文章中,我们将继续探索 OpenCV 的其他强大功能,例如目标检测、特征匹配等等。敬请期待!

如果这篇文章对你有所启发,期待你的点赞关注!

相关文章:

OpenCV 进阶实战与技巧——图像处理的全面解析

在上篇文章中,我们一起迈入了 Python OpenCV 的奇妙世界,学习了图像的读取、显示和保存等基本操作:用Python和OpenCV开启图像处理魔法之旅-CSDN博客。今天,我们将继续深入,探索图像的各种变换、滤波、边缘检测以及更深…...

单细胞转录组-生物标志物篇 | 从异质性描绘到筛查应用

宫颈癌(Cervical cancer, CC)是一种常见的妇科恶性肿瘤。尽管目前的筛查方法已被证明有效并显著降低了CC的发病率和死亡率,但仍然存在缺陷。单细胞RNA测序可以在单细胞分辨率下鉴定复杂和稀有的细胞群。通过scRNA-seq,已经绘制和描…...

MQTT:深入剖析 paho.mqtt.embedded - c - master 目录结构

引言 在嵌入式开发领域,消息队列遥测传输(MQTT)协议因其轻量级、低带宽消耗等特性被广泛应用。Eclipse Paho 项目提供了多种语言的 MQTT 客户端实现,其中paho.mqtt.embedded - c - master是针对 C 语言在嵌入式环境下的 MQTT 客户…...

minio命令行客户端mc常见用法

安装minio命令行客户端mc https://min-io.cn/docs/minio/linux/reference/minio-mc-admin.html # Windows安装minio命令行客户端 choco install minio-client -y# Linux安装mc客户端 wget -c -P /usr/local/bin/ https://dl.min.io/client/mc/release/linux-amd64/mc # 赋予可…...

Mac提示无法打开应用程序DBeaver

问题:安装好后,打开DBeaver时候提示“无法打开应用程序DBeaver” (1)首先,进入到/Applications/DBeaver.app/Contents/MacOS目录查看可执行程序的权限是否为-rwxr-xr-x,如果不是执行chmod x DBeaver的命令 …...

Dart逆向之函数调用

我们从Blutter恢复的部分IL中可以看到Dart调用函数的逻辑 // 0x180490: r16 <int> // 0x180490: ldr x16, [PP, #0x8a0] ; [pp0x8a0] TypeArguments: <int> // 0x180494: r30 Instance_MethodChannel // 0x180494: ldr lr, [P…...

Word / WPS 页面顶部标题 段前间距 失效 / 不起作用 / 不显示,标题紧贴页眉 问题及解决

问题描述&#xff1a; 在 Word 或者 WPS 里面&#xff0c;如果不是新的一节&#xff0c;而是位于新的一页首行时&#xff0c;不管怎么设置段前间距&#xff0c;始终是失效的&#xff0c;实际段前间距一直是零。 解决方案&#xff1a; 查询了很多方案均无法解决问题&#xff…...

在 ASP.NET Web 应用中解析 JSON 数据实例

在 ASP.NET Web 应用中解析 JSON 数据有多种方法&#xff0c;取决于你使用的是传统的 Web Forms、MVC 还是现代的 Web API。以下是几种常见的解析方法&#xff1a; 1. 使用 Newtonsoft.Json (Json.NET) 这是最常用的 JSON 处理库&#xff0c;需要先安装 NuGet 包&#xff1a;…...

vSphere 8.x Advanced Design(3V0-21.23)题库

最新版vSphere 8.x Advanced Design(3V0-21.23)题库&#xff0c;完整版见上方二维码。 Following a review of security requirements, an architect has confirmed the following requirements: REQ001- A clustered firewall solution must be placed at the perimeter of t…...

vba讲excel转换为word

VBA将excel转换为word Sub ExportToWordFormatted() 声明变量Dim ws As Worksheet 用于存储当前活动的工作表Dim rng As Range 用于存储工作表的使用范围&#xff08;即所有有数据的单元格&#xff09;Dim rowCount As Long, colCount As Long 用于存储数据范围的行数和列数…...

【BUG】远程连接阿里云服务器上的redis报错

出现 Redis Client On Error: Error: connect ECONNREFUSED 47.100.XXX.XX:6379 错误&#xff0c;表明 Redis 客户端无法连接到指定的 Redis 服务器&#xff0c;可按以下步骤排查解决&#xff1a; 1. 检查 Redis 服务器是否运行 操作&#xff1a;在 Redis 服务器所在终端执行…...

数据中台、BI业务访谈(二):组织架构梳理的坑

这是数据中台、BI业务访谈系列的第二篇文章&#xff0c;在上一篇文章中&#xff0c;我重点介绍了在给企业的业务部门、高层管理做业务访谈之前我们要做好行业、业务知识的功课。做好这些功课之后&#xff0c;就到了实际的访谈环节了。 业务访谈关键点 那么在具体业务访谈的时…...

集成学习+泰坦尼克号案例+红酒品质预测

集成学习简介 学习目标&#xff1a; 1.知道集成学习是什么&#xff1f; 2.了解集成学习的分类 3.理解bagging集成的思想 4.理解boosting集成的思想 【知道】集成学习是什么&#xff1f; 集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度更高…...

SpringBoot 基础知识,HTTP 概述

1. 概述 1.1 Spring Spring 提供若干个子项目&#xff0c;每个项目用于完成特定功能 Spring 的若干个子项目都基于一个基础的框架&#xff1a;Spring Framework 框架类似于 房屋的地基 但 Spring Framework 配置繁琐&#xff0c;入门难度大 1.2 Spring Boot 于是&#xf…...

背包问题(java)实现

1、01背包 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scannew Scanner(System.in);int nscan.nextInt();int mscan.nextInt();int[][] dpnew int[n1][m1];int[] vnew int[n1];int[] wnew int[n1];for(int i1;i<n;i) {v…...

HDCP(一)

HDCP的核心目标解析 1. 数字内容版权保护 HDCP&#xff08;高带宽数字内容保护&#xff09;的核心目标是防止未经授权的设备对高清音视频内容进行非法复制或截取。它通过加密技术保护数字信号在传输链路&#xff08;如HDMI、DisplayPort、DVI等接口&#xff09;中的安全性&am…...

HTTP 1.0 时代,第一次优化

HTTP 是 “HyperText Transfer Protocol” 的缩写&#xff0c;即超文本传输协议。 相较于最初的设计&#xff0c;1.0增加了以下特性&#xff1a; 增加head&#xff0c;post等新方法。 引入新方法是为了扩充语义&#xff0c;其中 head 方法可以只拿元信息&#xff0c;不必传输…...

【吾爱出品】[Windows] 鼠标或键盘可自定义可同时多按键连点工具

[Windows] 鼠标或键盘连点工具 链接&#xff1a;https://pan.xunlei.com/s/VONSFKLNpyVDeYEmOCBY3WZJA1?pwduik5# [Windows] 鼠标或键盘可自定义可同时多按键连点工具 就是个连点工具&#xff0c;功能如图所示&#xff0c;本人系统win11其他系统未做测试&#xff0c;自己玩…...

计算机网络起源

互联网的起源和发展是一个充满创新、突破和变革的历程&#xff0c;从20世纪60年代到1989年&#xff0c;这段时期为互联网的诞生和普及奠定了坚实的基础。让我们详细回顾这一段激动人心的历史。 计算机的发展与ARPANET的建立&#xff08;20世纪60年代&#xff09; 互联网的诞生…...

Vue3 watch 与 watchEffect 深度解析

Vue3 watch 与 watchEffect 深度解析 一、响应式监听的基石作用 在Vue3的响应式系统中&#xff0c;watch和watchEffect是构建复杂状态逻辑的关键工具。它们实现了对响应式数据的精准监听&#xff0c;支撑着现代前端开发中的状态管理、副作用处理等核心功能。 1.1 演变 Optio…...

服务器信息收集

信息收集又叫打点&#xff0c;打仗也要侦探敌情&#xff0c;攻防更是如此。 但要获取哪些信息呢&#xff1f; 目录 一. 获取公网IP 如何知道一个网站用了CDN&#xff1f; 如何绕过CDN&#xff1f; 二. 旁站信息收集 三. C段主机查询 四. 子域名信息收集 五. 端口信息收…...

Java设计模式之装饰器模式:从入门到架构级实践

一、开篇&#xff1a;为什么需要装饰器模式&#xff1f; 在软件开发中&#xff0c;我们经常面临这样的困境&#xff1a;如何在不修改原有对象结构的情况下&#xff0c;动态地扩展对象的功能&#xff1f;当系统需要为对象添加多种可能的扩展功能时&#xff0c;如果直接使用继承…...

Vue3性能优化全攻略:从原理到极致性能实战

一、性能瓶颈深度诊断 1.1 关键性能指标分析 1.2 性能剖析工具矩阵 工具类型典型工具适用场景检测维度综合检测工具Lighthouse首屏加载性能分析加载评分/优化建议运行时监控工具Web Vitals页面交互性能监控FCP/LCP/TTI等框架专项工具Vue Devtools组件渲染性能分析渲染耗时/更…...

阿里云 AI 搜索开放平台:从算法到业务——AI 搜索驱动企业智能化升级

——已获知乎作者【GitHub Daily】授权转载 目前大模型的强大能力&#xff0c;使其成为一些企业和行业的主要创新驱动力&#xff0c;企业亟需重新审视和调整现有的创新机制&#xff0c;以适应AI技术和大数据的快速发展。目前很多企业已经开始尝试大模型在业务中进行赋能&#x…...

特权FPGA之AT24C02 IIC实现

0 简介 IIC的物理层 IIC一共有只有两个总线&#xff1a; 一条是双向的串行数据线&#xff33;&#xff24;&#xff21;&#xff0c;一条是串行时钟线&#xff33;&#xff23;&#xff2c;. SDA(Serial data)是数据线&#xff0c;D代表Data也就是数据&#xff0c;Send Data …...

Docker 容器内运行程序的性能开销

在 Docker 容器内运行程序通常会有一定的性能开销&#xff0c;但具体损失多少取决于多个因素。以下是详细分析&#xff1a; 1. CPU 性能 理论开销&#xff1a;容器直接共享宿主机的内核&#xff0c;CPU 调度由宿主机管理&#xff0c;因此 CPU 运算性能几乎与原生环境一致&…...

SpringBoot依赖冲突引发的 log4j 日志打印问题及解决方法

依赖冲突引发的 log4j 日志打印问题及解决方法 在软件开发过程中&#xff0c;依赖管理是至关重要的一环。然而&#xff0c;时常会遇到依赖冲突的情况&#xff0c;其中就包括影响日志框架正常使用&#xff0c;比如因依赖冲突导致无法正常打印 log4j 日志的问题。 问题描述 当…...

MacOS中的鼠标、触控板的设置研究

一、背景和写这篇文章的原因 想搞清楚和配置好鼠标&#xff0c;比如解决好为什么我的滚动那么难用&#xff1f;怎么设置滚轮的方向跟windows相同&#xff1f;调整双击速度&#xff0c;调整鼠标滚轮左右拨动的"冷却时间"。 二、各种设置之详细解释 1. MacOS设置 -&…...

Clickhouse试用单机版部署

问题 最近需要试用clklog数据收集的社区版&#xff0c;clklog用数据库是Clickhouse。这就需要我先单机部署一个Clickhouse数据库&#xff0c;先试用试用。 步骤 这里假设我们已经拥有一台Ubuntu的服务器了&#xff0c;现在我们需要在这台机器上面安装Clickhouse数据库。Clic…...

【运维 | 硬件】服务器中常见的存储插槽类型、对应的传输协议及其特性总结

Why&#xff1a;最近更换设备&#xff0c;具体了解一下。 传输协议对比 协议 底层接口 最大带宽 队列深度 典型延迟 适用场景 AHCI SATA 6 Gbps (~600 MB/s) 单队列&#xff08;32命令&#xff09; 较高 传统 HDD/SATA SSD SAS SAS 24 Gbps (~2.4 GB/s) 单队列&…...

本地laravel项目【dcat-admin】部署到liunx服务器

文章目录 前言一、部署流程1、数据库搬迁2、宝塔创建网站&#xff0c;配置php3、修改nginx配置4、在public目录设置软连接5、修改env配置、刷新缓存 二、其他问题1.后台登陆失败问题2.完美解决接口跨域问题 总结 前言 laravel新手记录 差不多一个月&#xff0c;总算用laravel…...

DeepSeek:AI如何重构搜索引擎时代的原创内容生态

一、当生成式AI遇上搜索引擎&#xff1a;一场效率与价值的博弈 2023年&#xff0c;全球搜索引擎处理了超过2万亿次查询&#xff0c;其中超40%涉及复杂问题解答。而与此同时&#xff0c;Google的"Helpful Content Update"算法升级直接淘汰了26%的低质AI生成页面。这场…...

在docker里装rocketmq-console

首先要到github下载&#xff08;这个一般是需要你有梯子&#xff09; GitHub - apache/rocketmq-externals at release-rocketmq-console-1.0.0 如果没有梯子&#xff0c;用下面这个百度网盘链接下 http://链接: https://pan.baidu.com/s/1x8WQVmaOBjTjss-3g01UPQ 提取码: fu…...

蓝桥杯C++组算法知识点整理 · 考前突击(上)【小白适用】

【背景说明】本文的作者是一名算法竞赛小白&#xff0c;在第一次参加蓝桥杯之前希望整理一下自己会了哪些算法&#xff0c;于是有了本文的诞生。分享在这里也希望与众多学子共勉。如果时间允许的话&#xff0c;这一系列会分为上中下三部分和大家见面&#xff0c;祝大家竞赛顺利…...

Docker 是什么? Docker 基本观念介绍与容器和虚拟机的比较

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;历代文学&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;高并发设计&#xf…...

Docker:安装与部署 Nacos 的技术指南

1、简述 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一个动态服务发现、配置管理和服务治理的综合解决方案,适用于微服务架构。 Nacos 主要功能: 服务发现与注册:支持 Dubbo、Spring Cloud 等主流微服务框架的服务发现与注册。动态配置管理:支持…...

UE5 RPC调用示例详解

文章目录 前言一、示例场景二、代码实现三、关键点解析3.1 RPC类型选择3.2 可靠性设置3.3 权限控制3.4 输入处理 四、测试与验证总结 前言 在UE5中&#xff0c;RPC&#xff08;远程过程调用&#xff09;是实现多人游戏逻辑同步的核心机制。以下通过一个玩家跳跃的示例&#xf…...

MATLAB在工程领域的实际应用案例

文章目录 前言自动驾驶汽车路径规划系统汽车先进驾驶辅助系统&#xff08;ADAS&#xff09;开发控制电气系统设计与优化桥梁结构分析与安全性评估 前言 MATLAB 在工程领域应用广泛&#xff0c;能解决复杂问题、优化系统设计。下面从不同工程领域选取了具有代表性的案例&#x…...

【完美解决】VSCode连接HPC节点,已配置密钥却还是提示需要输入密码

目录 问题描述软件版本原因分析错误逻辑链 解决方案总结 问题描述 本人在使用 ​​VSCode Remote-SSH 插件​​连接超算集群节点时&#xff0c;遇到以下问题&#xff1a;已正确配置 SSH 密钥&#xff0c;且 VSCode 能识别密钥文件&#xff08;如图1&#xff09;&#xff0c;但在…...

智能物联网网关策略部署

实训背景 某智慧工厂需部署物联网网关&#xff0c;实现以下工业级安全管控需求&#xff1a; 设备准入控制&#xff1a;仅允许注册MAC地址的传感器接入&#xff08;白名单&#xff1a;AA:BB:CC:DD:EE:FF&#xff09;。协议合规性&#xff1a;禁止非Modbus TCP&#xff08;端口…...

玩转代理 IP :实战爬虫案例

在现代互联网环境下&#xff0c;爬虫不仅是数据获取的利器&#xff0c;也成为应对网站反爬机制的技术博弈。而在这场博弈中&#xff0c;"代理 IP" 是核心武器之一。本文将以高匿名的代理ip为核心&#xff0c;结合 Python 实战、代理策略设计、高匿技巧与反封锁优化&a…...

Deepseek解锁科研绘图新方式

在科研领域&#xff0c;一张清晰、准确且美观的图片往往能比冗长的文字更有效地传达研究成果。从展示实验数据的图表&#xff0c;到阐述理论模型的示意图&#xff0c;科研绘图贯穿于研究的各个环节。然而&#xff0c;传统的科研绘图工具往往操作复杂&#xff0c;学习成本高&…...

【unity游戏开发入门到精通——动画篇】Animator反向动力学(IK)

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…...

【JavaScript】十八、页面加载事件和页面滚动事件

文章目录 1、页面加载事件1.1 load1.2 DOMContentLoaded 2、页面滚动事件2.1 语法2.2 获取滚动位置 3、案例&#xff1a;页面滚动显示隐藏侧边栏 1、页面加载事件 script标签在html中的位置一般在</body>标签上方&#xff0c;这是因为代码从上往下执行&#xff0c;在htm…...

Solana链开发全景指南:从环境搭建到生态实践

——2025年高性能区块链开发技术栈深度解析 一、Solana核心优势与技术特性 1. 突破性技术架构 历史证明&#xff08;PoH&#xff09;&#xff1a;通过时间戳序列化交易&#xff0c;实现并行处理能力&#xff0c;支持5万TPS的吞吐量 并行执行引擎&#xff08;Sealevel&#xf…...

这是一个文章标题

# Markdown 全语法示例手册本文档将全面演示 Markdown 的语法元素&#xff0c;包含 **标题**、**列表**、**代码块**、**表格**、**数学公式** 等 18 种核心功能。所有示例均附带实际应用场景说明。---## 一、基础文本格式### 1.1 标题层级 markdown # H1 (使用 #) ## H2 (使用…...

预言机与数据聚合器:DeFi的数据桥梁与风险博弈

一、核心机制与价值定位 预言机&#xff08;Oracle&#xff09;与数据聚合器是DeFi生态的“数据基建层”&#xff0c;解决链上-链下数据互通与链上数据可读性两大问题&#xff1a; 数据输入层&#xff08;预言机&#xff09;&#xff1a;将现实世界数据&#xff08;价格、天气…...

通过百度OCR在线API识别带水印扫描图片文字

目录 0 环境准备 1 百度OCR API申请 1.1 登录百度智能云 1.2 创建应用 1.3 获取API key和secret key 2 创建项目python环境 2.1 conda创建python环境 2.2 在pycharm中创建项目 2.3 激活python环境 2.4 安装项目依赖包 3 程序逻辑实现 3.1 导入依赖包 3.2 定义百度k…...

ocr python库

ocr python库 上手Git、Gitee和Github&#xff01;watt toolkit...

Node 处理 request 的过程中,都会更新哪些 metadata 和 property

什么是 Metadata&#xff1f; 用于描述帧状态、控制参数、处理结果等 是随 request 流动的结构&#xff0c;通常是 PerFrameMetaData&#xff0c;每一帧一份 属于 HAL3 metadata 树的组成部分 什么是 Property&#xff1f; 是 CamX 内部定义的一种帧级别的轻量信息块 不一…...