OpenCV图像增强实战教程:从理论到代码实现
OpenCV图像增强实战教程:从理论到代码实现 🔥🚀
📚 想要掌握图像增强的核心技术?本文手把手教你使用OpenCV实现多种图像增强技术,从基础的线性变换到高级的频域滤波,全方位提升你的图像处理能力!适合初学者和进阶开发者!
目录
- 1. 线性变换:调整图像亮度
- 2. 空间域滤波:均值滤波与中值滤波
- 3. 边缘检测:Sobel算子实现
- 4. 频域滤波:理想低通与高通滤波器
- 5. 高级应用:同态滤波处理光照不均
- 6. 直方图均衡化:提升图像对比度
- 7. 图像锐化:拉普拉斯算子应用
- 8. 最佳实践与常见问题
🌟 本教程所有代码已开源至GitHub: https://github.com/Despacito0o/opencv,欢迎Star和Fork!
1. 线性变换:调整图像亮度
线性变换是最基础的图像增强方法,通过简单的乘法运算就能调整图像的亮度。这种技术在图像预处理中非常常用,可以快速调整图像整体的明暗程度。
核心原理
图像亮度调整的公式:g(x,y) = α·f(x,y)
,其中α为增益系数。
- 当α > 1时,图像整体变亮
- 当α < 1时,图像整体变暗
- 当α = 1时,图像保持不变
除了乘法操作,还可以使用加法进行亮度调整:g(x,y) = f(x,y) + β
,其中β为亮度偏移量。
代码实现
import cv2
import numpy as np
# 读取图像
image_path = r'C:\Users\Administrator\Desktop\1.jpg'
image = cv2.imread(image_path)
# 检查图像是否成功读取
if image is None:print("无法读取图像,请检查图像路径。")
else:# 线性变换增强亮度enhanced_image = np.clip(image * 1.5, 0, 255).astype(np.uint8)# 显示原始图像和增强后的图像cv2.imshow('Original Image', image)cv2.imshow('Enhanced Image', enhanced_image)# 等待按键退出cv2.waitKey(0)cv2.destroyAllWindows()
💡 技巧:使用
np.clip()
函数防止像素值超出[0,255]范围,确保增强后的图像不会溢出或失真。当乘以较大系数时尤其重要!
扩展:对比度调整
除了简单的亮度调整,我们还可以同时调整亮度和对比度:
def adjust_brightness_contrast(image, alpha=1.0, beta=0):"""调整图像的亮度和对比度alpha: 对比度调整因子 (>1增加对比度,<1降低对比度)beta: 亮度调整因子 (>0增加亮度,<0降低亮度)"""adjusted = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)return adjusted# 使用示例
brightened = adjust_brightness_contrast(image, alpha=1.0, beta=50) # 只增加亮度
contrasted = adjust_brightness_contrast(image, alpha=1.5, beta=0) # 只增加对比度
both_adjusted = adjust_brightness_contrast(image, alpha=1.3, beta=30) # 同时调整
2. 空间域滤波:均值滤波与中值滤波
空间域滤波是通过像素邻域操作处理图像的方法,常用于去噪和平滑。空间域滤波使用卷积核在整个图像上进行操作,不同的卷积核可以实现不同的效果。
均值滤波 vs 中值滤波
- 均值滤波:取邻域像素的平均值,对高斯噪声效果较好,但会模糊边缘
- 中值滤波:取邻域像素的中值,对椒盐噪声效果显著,能更好地保留边缘
滤波核大小选择指南
- 3×3:轻微平滑,保留大部分细节
- 5×5:中等平滑,去除更多噪声但会丢失一些细节
- 7×7及以上:强烈平滑,适合噪声严重的情况
代码实现
import cv2
# 图片路径
image_path = r'C:\Users\Administrator\Desktop\1.jpg'
# 读取图片
image = cv2.imread(image_path)
# 检查图像是否成功读取
if image is None:print("无法读取图像,请检查图像路径。")
else:# 使用3x3和5x5的均值滤波器模糊图像blurred_3x3_mean = cv2.blur(image, (3, 3))blurred_5x5_mean = cv2.blur(image, (5, 5))# 使用核大小为3和5的中值滤波器模糊图像blurred_3_median = cv2.medianBlur(image, 3)blurred_5_median = cv2.medianBlur(image, 5)# 显示原始图像和模糊后的图像cv2.imshow('Original Image', image)cv2.imshow('3x3 Mean Blurred Image', blurred_3x3_mean)cv2.imshow('5x5 Mean Blurred Image', blurred_5x5_mean)cv2.imshow('3 Median Blurred Image', blurred_3_median)cv2.imshow('5 Median Blurred Image', blurred_5_median)# 等待按键退出cv2.waitKey(0)cv2.destroyAllWindows()
🔍 观察:滤波核尺寸越大,平滑效果越明显,但边缘保持能力越差。实际应用中需要权衡平滑度和细节保留。
扩展:高斯滤波
均值滤波给予窗口内每个像素相同的权重,而高斯滤波则给予中心像素更高的权重,边缘像素权重逐渐减小,这样可以获得更自然的平滑效果:
# 高斯滤波示例
blurred_gaussian_3 = cv2.GaussianBlur(image, (3, 3), 0)
blurred_gaussian_5 = cv2.GaussianBlur(image, (5, 5), 0)# 参数说明:
# - 第一个参数:输入图像
# - 第二个参数:高斯核大小,必须是奇数
# - 第三个参数:x方向的标准差,0表示根据核大小自动计算
3. 边缘检测:Sobel算子实现
边缘检测是提取图像中物体轮廓的重要技术,能够帮助我们识别图像中的物体边界和形状特征。Sobel算子是一种常用的一阶微分算子,可以有效地检测图像中的边缘。
Sobel算子原理
Sobel算子计算图像在水平方向(x)和垂直方向(y)的梯度,通过梯度的平方和的平方根得到边缘强度。
水平方向Sobel算子:
-1 0 1
-2 0 2
-1 0 1
垂直方向Sobel算子:
-1 -2 -10 0 01 2 1
代码实现
import cv2
import numpy as np
# 图片路径
image_path = r'C:\Users\Administrator\Desktop\1.jpg'
# 读取图片
image = cv2.imread(image_path)
# 检查图像是否成功读取
if image is None:print("无法读取图像,请检查图像路径。")
else:# 使用3x3和5x5的均值滤波器模糊图像blurred_3x3_mean = cv2.blur(image, (3, 3))blurred_5x5_mean = cv2.blur(image, (5, 5))# 使用核大小为3和5的中值滤波器模糊图像blurred_3_median = cv2.medianBlur(image, 3)blurred_5_median = cv2.medianBlur(image, 5)# 转换为灰度图像,因为Sobel算子通常在单通道图像上操作gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Sobel算子检测图像边缘sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)edges = np.sqrt(sobelx ** 2 + sobely ** 2)edges = np.uint8(edges / edges.max() * 255)# 显示原始图像、模糊后的图像和边缘检测后的图像cv2.imshow('Original Image', image)cv2.imshow('3x3 Mean Blurred Image', blurred_3x3_mean)cv2.imshow('5x5 Mean Blurred Image', blurred_5x5_mean)cv2.imshow('3 Median Blurred Image', blurred_3_median)cv2.imshow('5 Median Blurred Image', blurred_5_median)cv2.imshow('Sobel Edge Detection', edges)# 等待按键退出cv2.waitKey(0)cv2.destroyAllWindows()
⚠️ 注意:边缘检测前先转换为灰度图像,可以减少计算量并避免颜色通道间的干扰。图像噪声会导致边缘检测结果不理想,建议先进行适当的滤波处理。
扩展:Canny边缘检测
Canny边缘检测是更加高级的边缘检测算法,包含多个步骤:高斯滤波、梯度计算、非极大值抑制和双阈值检测。相比Sobel,它能提供更加清晰和完整的边缘:
# Canny边缘检测示例
edges_canny = cv2.Canny(gray, 100, 200) # 参数为低阈值和高阈值# 参数调优技巧:
# - 低阈值:高阈值比例通常为1:2或1:3
# - 较低的阈值会检测出更多边缘,但可能包含噪声
# - 较高的阈值会减少检测的边缘,但边缘会更加可靠
4. 频域滤波:理想低通与高通滤波器
频域滤波是通过傅里叶变换将图像从空间域转换到频域进行处理的方法。在频域中,不同频率成分代表图像中不同的信息:低频成分代表图像的整体结构和轮廓,高频成分代表图像的细节和边缘。
低通滤波 vs 高通滤波
- 低通滤波:保留低频信息(图像的轮廓和大的结构),去除高频部分(细节和噪声),结果是平滑的图像
- 高通滤波:保留高频信息(图像的边缘和细节),去除低频部分(平滑区域),结果是突出边缘的图像
频域滤波原理
- 使用傅里叶变换将图像从空间域转换到频域
- 在频域应用滤波器
- 使用逆傅里叶变换将处理后的图像变换回空间域
代码实现
import cv2
import numpy as np
import matplotlib.pyplot as plt
def create_filters(rows, cols, D0=60):ilpf = np.zeros((rows, cols))cv2.circle(ilpf, (cols // 2, rows // 2), D0, 1, -1)ihpf = 1 - ilpfreturn ilpf, ihpf
image_path = r'C:\Users\Administrator\Desktop\1.jpg'
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:print("无法读取图像,请检查图像路径。")
else:f = np.fft.fft2(image)fshift = np.fft.fftshift(f)rows, cols = image.shapeilpf, ihpf = create_filters(rows, cols)fshift_ilpf = fshift * ilpffshift_ihpf = fshift * ihpff_ilpf = np.fft.ifftshift(fshift_ilpf)img_back_ilpf = np.fft.ifft2(f_ilpf)img_back_ilpf = np.abs(img_back_ilpf)f_ihpf = np.fft.ifftshift(fshift_ihpf)img_back_ihpf = np.fft.ifft2(f_ihpf)img_back_ihpf = np.abs(img_back_ihpf)plt.subplot(131), plt.imshow(image, cmap='gray')plt.title('Original Image'), plt.xticks([]), plt.yticks([])plt.subplot(132), plt.imshow(img_back_ilpf, cmap='gray')plt.title('Ideal Low Pass Filtered'), plt.xticks([]), plt.yticks([])plt.subplot(133), plt.imshow(img_back_ihpf, cmap='gray')plt.title('Ideal High Pass Filtered'), plt.xticks([]), plt.yticks([])plt.show()
🚀 进阶技巧:理想低通/高通滤波器在频域边界会产生明显的振铃效应(边缘处出现波纹状伪影),实际应用中可以考虑使用高斯或巴特沃斯滤波器来获得更自然的效果。
扩展:可视化傅里叶频谱
频谱可视化能帮助我们理解图像的频域特性:
# 显示频谱
magnitude_spectrum = 20 * np.log(np.abs(fshift) + 1)
plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()# 频谱解读:
# - 中心点代表零频率(DC)分量
# - 亮度越高表示该频率分量越强
# - 图像的主要结构通常集中在中心区域(低频)
# - 噪声和细节通常分布在远离中心的区域(高频)
5. 高级应用:同态滤波处理光照不均
同态滤波是一种非线性滤波技术,可以同时增强图像细节和平衡光照不均。这种技术在医学图像处理、天文图像增强和不均匀光照条件下的图像处理中特别有用。
同态滤波原理
同态滤波基于照明-反射模型,将图像分解为照明成分(光照,低频)和反射成分(物体表面特性,高频):
- 通过对数变换将乘法关系转换为加法关系
- 对低频照明部分减弱,对高频反射部分增强
- 通过指数变换恢复原始域
代码实现
import cv2
import numpy as np
import matplotlib.pyplot as plt
def create_filters(rows, cols, D0=60):ilpf = np.zeros((rows, cols))cv2.circle(ilpf, (cols // 2, rows // 2), D0, 1, -1)ihpf = 1 - ilpfreturn ilpf, ihpf
image_path = r'C:\Users\Administrator\Desktop\1.jpg'
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:print("无法读取图像,请检查图像路径。")
else:f = np.fft.fft2(image)fshift = np.fft.fftshift(f)rows, cols = image.shapeilpf, ihpf = create_filters(rows, cols)fshift_ilpf = fshift * ilpffshift_ihpf = fshift * ihpff_ilpf = np.fft.ifftshift(fshift_ilpf)img_back_ilpf = np.fft.ifft2(f_ilpf)img_back_ilpf = np.abs(img_back_ilpf)f_ihpf = np.fft.ifftshift(fshift_ihpf)img_back_ihpf = np.fft.ifft2(f_ihpf)img_back_ihpf = np.abs(img_back_ihpf)gamma_l = 0.5 # 低频增益(控制光照)gamma_h = 1.5 # 高频增益(控制细节)D0 = 30 # 截止频率c = 1 # 斜率控制img_float = np.float32(image) + 1e-6log_img = np.log(img_float)dft = np.fft.fft2(log_img)dft_shift = np.fft.fftshift(dft)rows, cols = img_float.shapeu, v = np.mgrid[-rows // 2:rows // 2, -cols // 2:cols // 2]D = np.sqrt(u ** 2 + v ** 2)H = (gamma_h - gamma_l) * (1 - np.exp(-c * (D ** 2) / (D0 ** 2))) + gamma_lfiltered = dft_shift * Hf_ishift = np.fft.ifftshift(filtered)img_back = np.fft.ifft2(f_ishift)img_back = np.abs(img_back)img_back = np.exp(img_back)img_back = cv2.normalize(img_back, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)# 显示原始图像、理想低通滤波图像、理想高通滤波图像和同态滤波图像plt.subplot(221), plt.imshow(image, cmap='gray')plt.title('Original Image'), plt.xticks([]), plt.yticks([])plt.subplot(222), plt.imshow(img_back_ilpf, cmap='gray')plt.title('Ideal Low Pass Filtered'), plt.xticks([]), plt.yticks([])plt.subplot(223), plt.imshow(img_back_ihpf, cmap='gray')plt.title('Ideal High Pass Filtered'), plt.xticks([]), plt.yticks([])plt.subplot(224), plt.imshow(img_back, cmap='gray')plt.title('Homomorphic Filtered'), plt.xticks([]), plt.yticks([])plt.show()
🔧 参数调优:
gamma_l
:控制低频增益,值小于1可以压制光照变化,改善光照不均gamma_h
:控制高频增益,值大于1可以增强图像细节和边缘D0
:截止频率,控制低频和高频的分界点c
:滤波函数的陡峭度,值越大变化越剧烈
同态滤波的实际应用场景
- 医学图像增强:提高X光片、CT扫描和MRI图像的可读性
- 夜间或阴影下拍摄的照片修复
- 卫星和航空图像处理:平衡不同区域的光照差异
6. 直方图均衡化:提升图像对比度
直方图均衡化是一种简单但非常有效的图像增强技术,通过重新分配图像的灰度值分布,使图像具有更均匀的灰度分布,从而提高图像的对比度。这对于对比度较低、过亮或过暗的图像尤其有效。
直方图均衡化原理
- 计算图像的灰度直方图
- 计算累积分布函数(CDF)
- 将CDF值归一化到[0,255]范围,作为灰度映射函数
- 根据映射函数对原图像进行变换
代码实现
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image_path = r'C:\Users\Administrator\Desktop\1.jpg'
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)if image is None:print("无法读取图像,请检查图像路径。")
else:# 应用直方图均衡化equalized = cv2.equalizeHist(image)# 创建并绘制直方图hist_original = cv2.calcHist([image], [0], None, [256], [0, 256])hist_equalized = cv2.calcHist([equalized], [0], None, [256], [0, 256])# 显示结果plt.figure(figsize=(12, 8))plt.subplot(221), plt.imshow(image, cmap='gray')plt.title('原始图像'), plt.xticks([]), plt.yticks([])plt.subplot(222), plt.imshow(equalized, cmap='gray')plt.title('均衡化后图像'), plt.xticks([]), plt.yticks([])plt.subplot(223), plt.plot(hist_original)plt.title('原始直方图'), plt.xlim([0, 256])plt.subplot(224), plt.plot(hist_equalized)plt.title('均衡化后直方图'), plt.xlim([0, 256])plt.tight_layout()plt.show()
自适应直方图均衡化 (CLAHE)
标准直方图均衡化应用于整个图像,可能会导致某些区域的对比度过度增强。CLAHE方法通过在图像的小区域上应用直方图均衡化,然后使用双线性插值将相邻区域平滑地融合,可以获得更自然的增强效果:
# 应用CLAHE
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
clahe_image = clahe.apply(image)# 参数说明:
# - clipLimit: 对比度限制阈值,防止噪声放大
# - tileGridSize: 分块大小,较小的块会增强局部细节
7. 图像锐化:拉普拉斯算子应用
图像锐化是增强图像中边缘和细节的过程,能够使模糊的图像变得更加清晰。拉普拉斯算子是一种常用的图像锐化工具,它通过检测图像中的二阶导数来识别亮度快速变化的区域。
拉普拉斯算子原理
拉普拉斯算子是一种二阶微分算子,常用的3×3拉普拉斯卷积核有:
0 1 01 -4 10 1 0
或者:
1 1 11 -8 11 1 1
图像锐化的实现
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image_path = r'C:\Users\Administrator\Desktop\1.jpg'
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)if image is None:print("无法读取图像,请检查图像路径。")
else:# 使用拉普拉斯算子laplacian = cv2.Laplacian(image, cv2.CV_64F)# 转换为可显示的格式laplacian = np.uint8(np.absolute(laplacian))# 锐化图像 = 原图 + 拉普拉斯变换结果sharpened = cv2.addWeighted(image, 1.5, laplacian, -0.5, 0)# 显示结果plt.figure(figsize=(12, 4))plt.subplot(131), plt.imshow(image, cmap='gray')plt.title('原始图像'), plt.xticks([]), plt.yticks([])plt.subplot(132), plt.imshow(laplacian, cmap='gray')plt.title('拉普拉斯变换'), plt.xticks([]), plt.yticks([])plt.subplot(133), plt.imshow(sharpened, cmap='gray')plt.title('锐化后的图像'), plt.xticks([]), plt.yticks([])plt.tight_layout()plt.show()
USM锐化(Unsharp Masking)
USM是一种更高级的锐化技术,可以提供更自然的锐化效果:
# USM锐化
blurred = cv2.GaussianBlur(image, (5, 5), 0)
usm_sharpened = cv2.addWeighted(image, 1.5, blurred, -0.5, 0)# 原理:
# 1. 对原图进行高斯模糊
# 2. 从原图中减去模糊图像,得到边缘信息
# 3. 将边缘信息加回原图,增强边缘
8. 最佳实践与常见问题
选择合适的图像增强方法
图像问题 | 推荐方法 |
---|---|
亮度过低/过高 | 线性变换、直方图均衡化 |
对比度不足 | 直方图均衡化、伽马变换 |
噪声干扰 | 均值滤波(高斯噪声)、中值滤波(椒盐噪声) |
图像模糊 | 锐化滤波、USM锐化 |
光照不均 | 同态滤波 |
需要检测边缘 | Sobel算子、Canny边缘检测 |
图像增强的常见陷阱
- 过度增强:参数设置过高可能导致伪影和噪声放大
- 细节丢失:过度平滑会导致重要细节丢失
- 颜色失真:在彩色图像上直接应用某些增强方法可能导致颜色失真
性能优化技巧
- 图像尺寸:处理前先调整图像尺寸,可以显著提高处理速度
- 并行处理:使用NumPy的矢量化操作代替循环
- GPU加速:对于大规模图像处理,考虑使用OpenCV的CUDA模块
# 使用OpenCV的CUDA模块示例(需要CUDA支持)
import cv2# 检查CUDA是否可用
print("CUDA可用:", cv2.cuda.getCudaEnabledDeviceCount() > 0)# 使用GPU加速的高斯模糊
if cv2.cuda.getCudaEnabledDeviceCount() > 0:gpu_image = cv2.cuda_GpuMat()gpu_image.upload(image)gpu_result = cv2.cuda.createGaussianFilter(cv2.CV_8UC1, cv2.CV_8UC1, (5, 5), 0)gpu_blurred = gpu_result.apply(gpu_image)blurred = gpu_blurred.download()
更多资源
想要深入学习OpenCV和图像处理?以下资源将助你快速提升:
- 🌟 完整项目代码:GitHub - Despacito0o/opencv
- 📚 更多图像处理示例:
- 基础操作实验
- 几何变换与频域分析
- 📝 环境配置指南:
pip install opencv-python==4.11.0
pip install opencv-contrib-python==4.11.0 # 包含扩展模块
pip install matplotlib
pip install numpy
进阶学习路径
- 基础:图像IO、色彩空间转换、基本变换
- 中级:滤波器、形态学操作、特征检测
- 高级:频域分析、机器学习结合、深度学习结合
💼 实战建议:将不同的图像增强技术组合使用往往能获得更好的效果。例如,先进行噪声滤波,再进行锐化和对比度增强,最后进行色彩校正。
如果这篇教程对你有帮助,请在GitHub上给我的项目点个⭐Star吧!也欢迎通过Issues或PR分享你的想法和改进建议!
👉 前往GitHub仓库:https://github.com/Despacito0o/opencv
相关文章:
OpenCV图像增强实战教程:从理论到代码实现
OpenCV图像增强实战教程:从理论到代码实现 🔥🚀 📚 想要掌握图像增强的核心技术?本文手把手教你使用OpenCV实现多种图像增强技术,从基础的线性变换到高级的频域滤波,全方位提升你的图像处理能力…...
一文介绍关于多模态的基础知识 !!
文章目录 前言 一、机器学习 二、深度学习 三、应用领域 前言 多模态不再局限于单一类型的数据处理,它融合图像、文本和音频等多种信息源。其基础知识涵盖机器学习、深度学习及其在多模态领域的应用。机器学习部分包含分类、回归、聚类和降维等四类算法;…...
mysql DQL
一.基本查询 1.查询多个字段 2.查看所有字段 3.设置别名 4.去除重复记录 二.条件查询 1.大于小于等于 2.查询 身份证为空的 没有所以没有记录 3.在15到20这个区间范围内 4.or/in 或者 4.like 匹配 (_匹配单个字符 %匹配多个字符) 查询员工信…...
Android Studio 项目文件夹结构详解
文章目录 一、项目视图概览1. Android 视图(简化视图)2. Project 视图(完整物理结构) 二、核心目录详解1. 项目根目录文件2. app 模块目录(主模块)2.1 manifests/2.2 java/2.3 res/ - 资源目录2.4 assets/2…...
Linux系统常见磁盘扩容操作(Common Disk Expansion Operations in Linux Systems)
Linux系统常见磁盘扩容操作 目录说明 一、准备工作:获取目标磁盘信息 (1)确认分区表格式和文件系统 二、扩容已有MBR分区 (1)分区后扩容 ext为例 xfs为例 三、扩容已有GPT分区 (1)分区…...
【UE5 C++】“ProceduralMeshComponent”的使用记录
效果 如下所示,通过“ProceduralMeshComponent”创建了一个自定义形状的Mesh,并且该Mesh包含碰撞信息,然后2s后更新Mesh形状。 步骤 1. 在“xxx.Build.cs”中引入“ProceduralMeshComponent”模块 2. 新建一个Actor类,这里命名为…...
源代码加密之零日攻击
# SDC沙盒:有效防御零日攻击的多层防护体系 在当今复杂多变的网络安全环境中,零日攻击已成为企业面临的重大威胁之一。零日攻击利用尚未被公众发现或尚未被软件供应商修复的漏洞进行攻击,具有极高的隐蔽性和破坏性。SDC沙盒作为一种先进的数…...
Vue2 集成VTK.js 并显示3D影像
Vue2 集成VTK.js 并显示3D影像(核心代码) 作者:coder_fang vtk.js目前官网只有vue3的示例,对于已有vue2系统的集成,需要使用指定版本的vtk,itk等库并修改部分配置即可。 需要的主要库和版本: vue:2.3.4; vtk-v32.9.0.min.js,itk-wasm.min.…...
本地git操作
一、初始化与基础操作 1. 初始化仓库 git init # 当前目录新建仓库 git init <目录名> # 指定目录初始化 2. 查看状态 git status # 显示工作区和暂存区状态 git status -s # 简洁版状…...
AI的出现,是否能替代IT从业者?
*AI在IT领域中的应用已成趋势,IT 从业者们站在这风暴之眼,面临着一个尖锐问题:AI 是否会成为 “职业终结者”?有人担忧 AI 将取代 IT 行业的大部分工作,也有人坚信 IT 从业者的专业技能与创新思维无可替代。那么&#…...
3、组件:魔法傀儡的诞生——React 19 组件化开发全解析
一、开篇:魔法傀儡的觉醒 "每个React组件都像一具魔法傀儡,"邓布利多校长挥动魔杖,空中浮现出闪烁的代码字符,"它们能自主思考、协同工作,甚至能跨越时空(服务器与客户端)执行任…...
Vue 解决 Error: please transfer a valid prop path to form item!
在 Vue.js 中使用表单验证库(如 VeeValidate 或 Element UI 的表单组件时),遇到错误信息 "please transfer a valid prop path to form item!" 通常指的是在表单项的属性绑定中,路径(prop path)不…...
day29 第八章 贪心算法 part03
134. 加油站 “可以换一个思路,首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。 每个加油站的剩余量rest[i]为gas[i] - cost[i]。 i从0开始累加rest[i],和记为curSum…...
贪心算法(19)(java)重构字符串
题目:给定一个字符串 s ,检查是否能重新排布其中的字母,使得两相邻的字符不同。 返回 s 的任意可能的重新排列。若不可行,返回空字符串 "" 。 示例 1: 输入: s "aab" 输出: "aba"示例 2: 输入:…...
Linux下C语言与OpenGL游戏开发指南
1. 为什么选择 Linux C OpenGL? 跨平台兼容性:OpenGL 是跨平台的图形 API,编写的代码稍作修改即可在 Windows/macOS 上运行。 性能控制:C 语言提供底层内存管理和硬件访问能力,适合高性能游戏开发。 开源生态&…...
深入 Java 正则表达式源码:透视 Matcher.group(int) 的分组提取机制
在 Java 中,正则表达式无疑是文本处理的重要工具。而 Matcher.group(int group) 是其中非常关键的一个方法,它用于提取正则中的分组内容。今天我们不仅通过一个例子来看它的使用方法,还会结合底层源码,深入理解它背后的机制。 实…...
解决 Spring Boot 启动报错:数据源配置引发的启动失败
启动项目时,控制台输出了如下错误信息: Error starting ApplicationContext. To display the condition evaluation report re-run your application with debug enabled. 2025-04-14 21:13:33.005 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporte…...
【深度学习的骨架与脉搏】语义分割的卷积神经网络·U-Net
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 …...
ELK+Filebeat 深度部署指南与实战测试全解析
一、介绍 ELK: ELasticsearch ,Logstash,Kibana三大开源框架首字母简写,市面上也被称为Elastic Stack。 Elasticsearch 是一个基于 Lucene 的分布式搜索平台框架,通过 Restful 方式进行交互,具备近实时搜索能力。像百度、Google 这类大数据全…...
Java设计模式之中介者模式:从入门到架构级实践
一、什么是中介者模式? 中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过引入一个中介对象来封装多个对象之间的交互关系。这种模式将原本复杂的网状通信结构转换为星型结构,类似于现实生活中的机…...
L2TP通道基础实验
目录 实验拓扑: 一、需求配置LAC设置: 界面设置: 编辑LNS设置: 建立静态路由:编辑 策略配置: 二、测试 通讯测试: 实验拓扑: 一、需求配置 LAC设置: [LAC]l2…...
关于字节跳动旗下的豆包(DouBao)软件的详解、核心功能以及与同类产品的对比分析
以下是关于豆包(DouBao)软件的详解、核心功能以及与同类产品的对比分析: 一、豆包(DouBao)详解 豆包是字节跳动推出的一款多功能人工智能助手,主打“智能助手场景化工具”结合,覆盖日常生活、…...
如何在本地修改 Git 项目的远程仓库地址
✅ 场景说明 你当前的 Git 项目地址是: http://192.168.0.16/xxx.git你希望把它改成: http://192.168.0.22:8099/xxx.git🧩 操作步骤 步骤 ①:进入项目所在目录 你已经在正确路径下了: cd C:\Develop\xxx确认这个…...
Gitea 1.23.7 速配
复用容器内的postgresql CREATE USER gitea WITH PASSWORD gitea; CREATE DATABASE gitea; GRANT ALL PRIVILEGES ON DATABASE gitea TO gitea; docker-compose.yml 内容 gitea:image: gitea/gitea:latestcontainer_name: giteaenvironment:- GITEA__server__HTTP_ADDR0.0.0.…...
JavaScript — 函数定义
介绍 JavaScript函数是执行特定任务的代码块,可通过多种方式定义。传统函数声明使用function关键字,后接函数名和参数列表,这种声明会被提升至作用域顶部。函数表达式则将匿名或具名函数赋值给变量,遵循变量作用域规则࿰…...
Allure安装与使用【macOS】
安装: brew install allure 安装插件: pip install allure-pytest2.8.16 生成一个html格式的报告,步骤: 执行生成json,制定结果保存目录 pytest --alluredirreport test_demo.py 查看测试保报告方式 将json转成h…...
FireCrawl爬虫工具, Craw4ai
FireCrawl是一款开源的AI爬虫工具,专门用于Web数据提取,并将其转换为Markdown格式或其他结构化数据。FireCrawl特别适合处理使用JavaScript动态生成的网站,能够自动抓取网站及其所有可访问的子页面内容,并将其转换为适合大语言…...
【Python爬虫】详细入门指南
目录 一、简单介绍 二、详细工作流程以及组成部分 三、 简单案例实现 一、简单介绍 在当今数字化信息飞速发展的时代,数据的获取与分析变得愈发重要,而网络爬虫技术作为一种能够从互联网海量信息中自动抓取所需数据的有效手段,正逐渐走入…...
Cesium.Cesium3DTileset设置贴地,tileset.readyPromise.then报错
tileset.readyPromise.then(function(tileset) { }); 用的readyPromise函数,却报错了,通过参考别人的博客内容发现最终修改的是 modelMatrix这个参数的内容,所以直接舍弃使用readyPromise函数,在代码中等 viewer.scene.primitiv…...
卫星电话扬帆智慧海洋,构筑蓝海通信新生态
海洋,承载着全球90%的贸易运输量,更是我国“向海图强”战略的核心战场。但是,全球95%的海洋区域仍处于蜂窝网络覆盖的“真空地带”,近海信号不稳、远洋通信中断的难题长期制约着海洋经济的纵深发展。技术革新是推动发展的强大引擎…...
大模型不是在推理,只是在复述??
目的 看见一篇论文Recitation over Reasoning: How Cutting-Edge Language Models Can Fail on Elementary School-Level Reasoning Problems?,论文中建立了一个推理题库,通过将推理问题进行改写(通过只改写几个字,颠覆整个问题…...
安全编码课程 实验7 并发
实验项目:C 多线程中的数据竞争与同步机制 实验要求: 1. 编写基础代码:模拟账户余额取款 创建一个全局共享变量 int balance 100,表示初始余额; 创建两个线程 Thread A 和 Thread B,尝试各自取出 100 元&a…...
【vue】2.16简单案例
一、高亮显示点击文字 使用vue绑定页面 设置默认样式 使用for循环数组数据展示,并取得索引 创建点击事件并传承,创建num变量 方法中num传进来的参数, 在内容中使用:class和三元运算符,当numkey时是true显示,…...
多线程进阶知识篇(一)
文章目录 一、开启线程1. start()2. run() 二、单核/多核CPU1. 单核CPU2. 多核CPU3.烧水问题 三、操作线程的命令四、并发的本质五、线程上下文切换1. 定义2. 原因 一、开启线程 1. start() 调用 start() 方法会启动一个新的线程,每次调用 start(),线程…...
【benepar】benepar安装会自动更新pytorch
直接pip install benepar,安装benepar0.2.0时会自动更新torch的版本 解决方法:去https://pypi.org/project/benepar/0.1.3/找历史版本 我的适配版本:python3.9,torch1.11.0(cuda11.3),对应的ben…...
智能云图库-1-项目初始化
项目中的异常处理 自定义异常 在exception包下新建错误码枚举类: Getter public enum ErrorCode {SUCCESS(0, "ok"),PARAMS_ERROR(40000, "请求参数错误"),NOT_LOGIN_ERROR(40100, "未登录"),NO_AUTH_ERROR(40101, "无权限&q…...
每日算法-250414
每日算法学习记录 - 240414 记录今天学习和解决的两道 LeetCode 算法题,主要涉及二分查找的应用。 162. 寻找峰值 题目描述 思路分析 核心思想:二分查找 题目要求找到数组中的任意一个峰值。峰值定义为比其相邻元素都大的元素。题目还隐含了一个条件…...
鸿蒙NEXT开发格式化工具类(ArkTs)
import { i18n } from kit.LocalizationKit;/*** 格式化工具类* 提供电话号码格式化、归属地查询、字符转换等功能。* author: 鸿蒙布道师* since: 2025/04/14*/ export class FormatUtil {/*** 判断传入的电话号码格式是否正确。* param phone - 待验证的电话号码* param coun…...
HarmonyOS 第2章 Ability的开发,鸿蒙HarmonyOS 应用开发入门
第2章 Ability的开发 本章内容 本章介绍HarmonyOS的核心组件Ability的开发。 2.1 Ability概述 2.2 FA模型介绍 2.3 Stage模型介绍 2.4 Ability内页面的跳转和数据传递 2.5 Want概述 2.6 实战:显式Want启动Ability 2.7 实战:隐式Want打开应用管理 2.8 小结 2.9 习题 2.1 Abili…...
CS5346 - Interactivity in Visualization 可视化中的交互
文章目录 Visualization representation interactionInteraction (交互)Benefits (好处)Typical Interaction Techniques(交互技术)SelectFilteringAbstract / Elaborate几何放缩(Geometric zoom)语义放缩࿰…...
AI与我共创WEB界面
记录一次压测后的自我技术提升 这事儿得从机房停电说起。那天吭哧吭哧做完并发压测,正准备截Zabbix监控图写报告,突然发现监控曲线神秘失踪——系统组小哥挠着头说:“上次停电后,zabbix服务好像就没起来过…” 我盯着空荡荡的图表界面,大脑的CPU温度可能比服务器还高。 其…...
python蓝桥杯备赛常用算法模板
一、python基础 (一)集合操作 s1 {1,2,3} s2{3,4,5} print(s1|s2)#求并集 print(s1&s2)#求交集 #结果 #{1, 2, 3, 4, 5} #{3}(二)对多维列表排序 1.新建列表 list1[[1,2,3],[2,3,4],[0,3,2]] #提取每个小列表的下标为2的…...
代码随想录第17天:二叉树
一、二叉搜索树的最近公共祖先(Leetcode 235) 由于是二叉搜索树,节点的值有严格的顺序关系:左子树的节点值都小于父节点,右子树的节点值都大于父节点。利用这一点,可以在树中更高效地找到最低公共祖先。 c…...
第8篇:Linux程序访问控制FPGA端HEX<一>
Q:如何从DE1-SoC_Computer系统的ARM A9处理器访问FPGA端的七段数码管呢? A:DE1-SoC_Computer系统中有2个连接FPGA端HEX外设的并行端口HEX5_HEX4和HEX3_HEX0,每个端口有一个32位只读Data寄存器。地址为0xFF200020的寄存器驱动4个数…...
Android 添加一个自己的系统服务SystemService
Android 系统服务(System Services)是 Android 操作系统的核心组件,运行在系统层面,为应用程序提供底层硬件访问、系统资源管理以及跨应用功能支持。这些服务在后台持续运行,由系统进程(如 system_server&a…...
git安装(windows)
通过网盘分享的文件:资料(1) 链接: https://pan.baidu.com/s/1MAenYzcQ436MlKbIYQidoQ 提取码: evu6 点击next 可修改安装路径 默认就行 一般从命令行调用,所以不用创建。 用vscode,所以这么选择。...
C# visionpro联合编程中遇到的问题之 R6025 - pure virtual function call
C# visionpro联合编程中遇到的问题之 R6025 - pure virtual function call R6025 pure virtual function call解决方法步骤 1: 获取所有相机步骤 2: 遍历并关闭相机完整代码 R6025 pure virtual function call 如果错误 “R6025 - pure virtual function call” 发生在关闭窗体…...
OTA技术(一):原理与实现方案
目录 一.引言 二.核心原理 2.1 定义与分类 2.2 系统架构 2.3 典型的升级流程 三.嵌入式系统中的OTA实现方案 3.1 存储空间划分 3.2 关键技术 一.引言 在智能手机上点击系统更新、电动汽车解锁新功能、智能家居设备自动修复漏洞……这些场景背后都离不开一项关键技术——…...
strings.LastIndexAny 使用详解
目录 1. 官方包 2. 支持版本 3. 官方说明 4. 作用 5. 实现原理 6. 推荐使用场景和不推荐使用场景 推荐场景 不推荐场景 7. 使用场景示例 示例1:官方示例 示例2:日志清洗(去除末尾的乱码或非法字符) 8. 性能对比 性能…...
大型商场运营新变革:AcrelCloud - 3200 预付费系统应用全解析
一、方案概述 在现代商业运营和物业管理中,大型商场、商业小区以及大集团和大物业面临着复杂的费用收取和管理难题。安科瑞的 AcrelCloud - 3200 远程预付费管控云平台,借助先进的预付费电表等设备,为解决这些问题提供了高效的一体化解决方案…...