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

cv2库的使用及图像预处理02

目录

八,图像缩放

1. 图像缩放操作

2. 插值方法

(1)最邻近插值(cv2.INTER_NEAREST)

(2)双线性插值(cv2.INTER_LINEAR)

3. 显示缩放结果

4. 目标尺寸

5. 总结

九,线性灰度变化

1. 线性灰度变换函数 linear_trans

2. 图像处理与显示

3. 灰度变换操作

(1)灰度反转

(2)灰度拉伸

(3)灰度压缩

4. 显示结果

5. 总结

十,伽马变换

1. 直方图均衡化

OpenCV 的 cv2.equalizeHist

2. 代码解析

(1)读取图像并显示

(2)直方图均衡化

(3)显示原始图像的直方图

(4)显示均衡化图像的直方图

3. 显示结果

4. 对比分析

5. 总结

十一,直方图均衡化

1. 代码解析

(1)读取图像

(2)显示原始图像

(3)直方图均衡化

(4)显示原始图像的直方图

(5)显示均衡化图像的直方图

(6)显示结果

2. 运行结果

3. 直方图均衡化的原理

4. 总结

十二,分割阈值

1. 代码解析

(1)读取灰度图像

(2)简单阈值分割

(3)Otsu 阈值分割

(4)打印阈值

(5)显示结果

2. 运行结果

3. Otsu 方法的优势

4. 总结

十三,图像的腐蚀与膨胀

1.定义结构元素

2. 腐蚀操作

3. 膨胀操作

4. 总结

十四,图像的模糊处理

1. 中值模糊(Median Blur)

2. 均值模糊(Mean Blur)

3. 高斯模糊(Gaussian Blur)

4. 总结

十五,图像锐化

1. 锐化算子的定义

(1)锐化算子 1

(2)锐化算子 2

2. 锐化操作

3. 显示结果

4. 运行结果

5. 总结


前言

cv库-python第一篇的链接:
cv2库的使用及图像预处理01-CSDN博客

八,图像缩放

im = cv2.imread('lenna.png') 
im_RBG = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) 
plt.figure(figsize=(8,8)) 
plt.subplot(2,2,1),plt.title('original'),plt.imshow(im_RBG) # 获取图像尺寸
(h, w) = im_RBG.shape[:2] # 缩放的目标尺寸
dst_size = (2000,3000) # 最邻近插值 
method = cv2.INTER_NEAREST # 进行缩放 
resized = cv2.resize(im_RBG, dst_size, interpolation = method)
plt.subplot(2,2,2),plt.title('INTER_NEAREST'),plt.imshow(resized) # 缩放的目标尺寸
dst_size = (5000,5000) # 双线性插值 
method = cv2.INTER_LINEAR # 进行缩放 
resized_linear = cv2.resize(im_RBG, dst_size, interpolation = method) 
plt.subplot(2,2,3),plt.title('INTER_LINEAR'),plt.imshow(resized_linear)

使用 OpenCV 的 cv2.resize 函数对图像进行缩放操作,并对比了两种不同的插值方法:最邻近插值(INTER_NEAREST)双线性插值(INTER_LINEAR)

1. 图像缩放操作
resized = cv2.resize(im_RBG, dst_size, interpolation=method)

  • cv2.resize:用于对图像进行缩放操作。
    • im_RBG:输入图像。
    • dst_size:目标尺寸,格式为 (width, height)。
    • interpolation:插值方法,用于决定缩放时如何计算新像素值。
2. 插值方法
(1)最邻近插值(cv2.INTER_NEAREST)
method = cv2.INTER_NEAREST
resized = cv2.resize(im_RBG, dst_size, interpolation=method)

  • 特点
    • 最简单的插值方法,直接取最近的像素值。
    • 速度快,但缩放后的图像质量较差,可能有明显的锯齿感。
  • 适用场景
    • 对图像质量要求不高,但需要快速处理的场景。
(2)双线性插值(cv2.INTER_LINEAR)
method = cv2.INTER_LINEAR
resized_linear = cv2.resize(im_RBG, dst_size, interpolation=method)

  • 特点
    • 使用周围四个像素的线性组合来计算新像素值。
    • 缩放后的图像质量较好,但计算速度比最邻近插值慢。
  • 适用场景
    • 对图像质量有一定要求的场景,例如图像放大或缩小后需要保持较好的视觉效果。
3. 显示缩放结果
plt.subplot(2, 2, 2), plt.title('INTER_NEAREST'), plt.imshow(resized)
plt.subplot(2, 2, 3), plt.title('INTER_LINEAR'), plt.imshow(resized_linear)

  • 使用 Matplotlib 的 plt.subplot 和 plt.imshow 显示缩放后的图像。
  • 对比两种插值方法的效果:
    • INTER_NEAREST:图像可能有明显的锯齿感,尤其是在放大时。
    • INTER_LINEAR:图像质量更好,过渡更平滑。
4. 目标尺寸
  • 第一次缩放:
dst_size = (2000, 3000)

将图像缩放到宽度为 2000 像素,高度为 3000 像素。

  • 第二次缩放:
dst_size = (5000, 5000)

将图像缩放到宽度和高度均为 5000 像素。

5. 总结
  • cv2.resize:用于对图像进行缩放操作,支持多种插值方法。
  • 插值方法对比
    • cv2.INTER_NEAREST:速度快,但图像质量较差。
    • cv2.INTER_LINEAR:图像质量较好,但计算速度稍慢。
  • 适用场景
    • 如果对图像质量要求不高,可以选择最邻近插值。
    • 如果需要较好的视觉效果,建议使用双线性插值。

九,线性灰度变化

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 
%matplotlib inline # 定义线性灰度变化函数
# k>1 时 实现灰度数值的拉伸 
# 0<k<1 时 实现灰度数值的压缩
# k=-1 b=255 实现灰度反转 def linear_trans(img, k, b=0): 
    # 计算灰度线性变化的映射表 
    trans_list = [(np.float32(x)*k+b) for x in range(256)] 
    # 将列表转换为np.array 
    trans_table =np.array(trans_list) 
    # 将超过[0,255]灰度范围的数值进行调整,并指定数据类型为uint8 
    trans_table[trans_table>255] = 255 
    trans_table[trans_table<0] = 0 
    trans_table = np.round(trans_table).astype(np.uint8) 
    # 使用OpenCV 的look up table 函数修改图像的灰度值 
    return cv2.LUT(img, trans_table) im = cv2.imread(r'lenna.png',0) 
plt.figure(figsize=(8,8)) 
plt.subplot(2,2,1),plt.title('original'),plt.imshow(im,'gray') # 反转 
im_inversion = linear_trans(im, -1, 255) 
plt.subplot(2,2,2),plt.title('reversed'),plt.imshow(im_inversion,'gray') # 灰度拉伸 
im_stretch = linear_trans(im, 1.2) 
plt.subplot(2,2,3),plt.title('stretch'),plt.imshow(im_stretch,'gray') # 灰度压缩 
im_compress = linear_trans(im, 0.4) 
plt.subplot(2,2,4),plt.title('compress'),plt.imshow(im_compress,'gray')

这段代码定义了一个线性灰度变换函数 linear_trans,用于对灰度图像进行灰度拉伸、压缩和反转操作,并展示了不同变换的效果。

1. 线性灰度变换函数 linear_trans
def linear_trans(img, k, b=0):# 计算灰度线性变化的映射表
    trans_list = [(np.float32(x) * k + b) for x in range(256)]# 将列表转换为np.array
    trans_table = np.array(trans_list)# 将超过[0, 255]灰度范围的数值进行调整,并指定数据类型为uint8
    trans_table[trans_table > 255] = 255
    trans_table[trans_table < 0] = 0
    trans_table = np.round(trans_table).astype(np.uint8)# 使用OpenCV的look up table函数修改图像的灰度值return cv2.LUT(img, trans_table)

灰度线性变换公式

线性灰度变换公式为:y = k * x + b,其中:

      1. x 是原始灰度值(范围为 [0, 256))。
      2. y 是变换后的灰度值。
      3. k 是斜率,控制灰度的拉伸或压缩。
      4. b 是偏移量,用于调整灰度值的范围。

当 k > 1 时,灰度值被拉伸,对比度增加。

当 0 < k < 1 时,灰度值被压缩,对比度降低。

当 k = -1 且 b = 255 时,实现灰度反转。

映射表的构建

使用列表推导式生成灰度值的映射表 trans_list。

将映射表转换为 NumPy 数组 trans_table。

灰度值范围调整

将超出 [0, 255] 范围的灰度值调整为边界值(0 或 255)。

使用 np.round 将浮点数四舍五入为整数,并将数据类型转换为 uint8。

应用变换

使用 OpenCV 的 cv2.LUT 函数(Look-Up Table)将映射表应用到图像上,完成灰度变换。

2. 图像处理与显示
im = cv2.imread(r'lenna.png', 0)  # 以灰度模式读取图像
plt.figure(figsize=(8, 8))
plt.subplot(2, 2, 1), plt.title('original'), plt.imshow(im, 'gray')

图像以灰度模式读取(cv2.imread(r'lenna.png', 0)),返回的是单通道的灰度图像。

使用 Matplotlib 显示原始图像。

3. 灰度变换操作
(1)灰度反转
im_inversion = linear_trans(im, -1, 255)
plt.subplot(2, 2, 2), plt.title('reversed'), plt.imshow(im_inversion, 'gray')

灰度反转公式:y = -x + 255,将图像的灰度值反转,亮部变暗,暗部变亮。

(2)灰度拉伸
im_stretch = linear_trans(im, 1.2)
plt.subplot(2, 2, 3), plt.title('stretch'), plt.imshow(im_stretch, 'gray')

灰度拉伸公式:y = 1.2 * x,将灰度值拉伸,增强图像对比度。

(3)灰度压缩
im_compress = linear_trans(im, 0.4)
plt.subplot(2, 2, 4), plt.title('compress'), plt.imshow(im_compress, 'gray')

灰度压缩公式:y = 0.4 * x,将灰度值压缩,降低图像对比度。

4. 显示结果
  • 使用 Matplotlib 的 plt.subplot 和 plt.imshow 显示原始图像和变换后的图像:
    • 原始图像:位于第 1 个子图。
    • 灰度反转:位于第 2 个子图。
    • 灰度拉伸:位于第 3 个子图。
    • 灰度压缩:位于第 4 个子图。
5. 总结
  • 线性灰度变换:通过调整参数 k 和 b,可以实现灰度的拉伸、压缩和反转。
  • 映射表的构建:通过计算每个灰度值的映射关系,并将其应用到图像上。
  • cv2.LUT:OpenCV 提供的查找表函数,用于高效地应用灰度变换。
  • 应用场景
    • 灰度反转:用于增强图像对比度或突出特征。
    • 灰度拉伸:用于提高图像的动态范围。
    • 灰度压缩:用于降低图像的动态范围,便于后续处理。

十,伽马变换

def gamma_trans(img, gamma): 
    # 先归一化到1,做伽马计算,再还原到[0,255] 
    gamma_list = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)] 
    # 将列表转换为np.array,并指定数据类型为uint8 
    gamma_table = np.round(np.array(gamma_list)).astype(np.uint8) 
    # 使用OpenCV 的look up table 函数修改图像的灰度值 
    return cv2.LUT(img, gamma_table) im = cv2.imread(r'lenna.png',0) 
plt.figure(figsize=(8,8)) 
plt.subplot(1,3,1),plt.title('original'),plt.imshow(im,'gray') # 使用伽马值为0.5 的变化,实现对暗部的拉升,亮部的压缩 
im_gamma05 = gamma_trans(im, 0.5) 
plt.subplot(1,3,2),plt.title('gammar=0.5'),plt.imshow(im_gamma05,'gray')# 使用伽马值为2 的变化,实现对亮部的拉升,暗部的压缩 
im_gamma2 = gamma_trans(im, 2) 
plt.subplot(1,3,3),plt.title('gammart=2'),plt.imshow(im_gamma2,'gray')

这段代码展示了如何使用 OpenCV 的 直方图均衡化 功能对灰度图像进行处理,并对比了原始图像和均衡化图像的直方图。

1. 直方图均衡化

直方图均衡化是一种增强图像对比度的技术,通过调整图像的灰度分布,使其直方图接近均匀分布。这种方法特别适用于图像的全局对比度较低时,能够显著提升图像的视觉效果。

OpenCV 的 cv2.equalizeHist
im_equa1 = cv2.equalizeHist(im)

  • 输入:灰度图像 im。
  • 输出:经过直方图均衡化处理的图像 im_equa1。
  • 原理
    • 直方图均衡化通过计算累积分布函数(CDF)来重新分配灰度值,使得输出图像的直方图更加均匀。
    • 这种方法能够增强图像的细节,尤其是对于灰度分布不均匀的图像。
2. 代码解析
(1)读取图像并显示
im = cv2.imread(r'lenna.png', 0)  # 以灰度模式读取图像
plt.figure(figsize=(8, 8))
plt.subplot(2, 2, 1), plt.imshow(im, 'gray'), plt.title('Original')

使用 cv2.imread 以灰度模式读取图像。

使用 Matplotlib 显示原始图像。

(2)直方图均衡化
im_equa1 = cv2.equalizeHist(im)
plt.subplot(2, 2, 3), plt.imshow(im_equa1, 'gray'), plt.title('Equalized')

调用 cv2.equalizeHist 对图像进行直方图均衡化

显示均衡化后的图像。

(3)显示原始图像的直方图
plt.subplot(2, 2, 2)
plt.hist(im.ravel(), 256, [0, 256], label='Original')
plt.legend()

使用 plt.hist 绘制原始图像的直方图。

    • im.ravel():将图像展平为一维数组。
    • 256:直方图的柱数(灰度级)。
    • [0, 256]:灰度值的范围。

添加图例 label='Original'。

(4)显示均衡化图像的直方图
plt.subplot(2, 2, 4)
plt.hist(im_equa1.ravel(), 256, [0, 256], label='Equalized')
plt.legend()

  • 绘制均衡化图像的直方图。
  • 添加图例 label='Equalized'。
3. 显示结果
  • 原始图像:位于第 1 个子图。
  • 原始图像的直方图:位于第 2 个子图。
  • 均衡化后的图像:位于第 3 个子图。
  • 均衡化图像的直方图:位于第 4 个子图。
4. 对比分析
  • 原始图像
    • 灰度分布可能集中在某些区域,导致对比度较低。
    • 直方图可能呈现不均匀分布。
  • 均衡化后的图像
    • 灰度分布更加均匀,对比度显著增强。
    • 直方图接近均匀分布,图像细节更加清晰。
5. 总结
  • 直方图均衡化:通过调整灰度分布,增强图像的全局对比度,特别适用于灰度分布不均匀的图像。
  • cv2.equalizeHist:OpenCV 提供的直方图均衡化函数,操作简单,效果显著。
  • 应用场景
    • 用于提升图像的视觉效果。
    • 作为图像预处理步骤,为后续的特征提取或分析提供更好的基础。

十一,直方图均衡化

import cv2 
from matplotlib import pyplot as plt im = cv2.imread(r'lenna.png',0) 
plt.figure(figsize=(8,8)) 
plt.subplot(2,2,1),plt.imshow(im,'gray') # 调用OpenCV 的直方图均衡化API 
im_equa1 = cv2.equalizeHist(im) 
plt.subplot(2,2,3),plt.imshow(im_equa1,'gray') # 显示原始图像的直方图 
plt.subplot(2,2,2) 
plt.hist(im.ravel(), 256, [0,256],label='org') 
plt.legend() # 显示均衡化图像的直方图 
plt.subplot(2,2,4) 
plt.hist(im_equa1.ravel(), 256, [0,256],label='equalize') 
plt.legend() plt.show()

这段代码展示了如何使用 OpenCV 的 cv2.equalizeHist 函数对灰度图像进行直方图均衡化处理,并通过 Matplotlib 显示原始图像、均衡化后的图像以及它们的直方图。

1. 代码解析
(1)读取图像
im = cv2.imread(r'lenna.png', 0)

使用 cv2.imread 函数以灰度模式读取图像 lenna.png。

参数 0 表示以灰度模式加载图像,返回的 im 是一个单通道的灰度图像。

(2)显示原始图像
plt.figure(figsize=(8, 8))
plt.subplot(2, 2, 1), plt.imshow(im, 'gray'), plt.title('Original')

使用 Matplotlib 的 plt.imshow 函数显示原始灰度图像。

'gray' 参数指定使用灰度颜色映射。

(3)直方图均衡化
im_equa1 = cv2.equalizeHist(im)
plt.subplot(2, 2, 3), plt.imshow(im_equa1, 'gray'), plt.title('Equalized')

调用 cv2.equalizeHist 函数对灰度图像进行直方图均衡化

    • 输入:灰度图像 im。
    • 输出:均衡化后的图像 im_equa1。

显示均衡化后的图像。

(4)显示原始图像的直方图
plt.subplot(2, 2, 2)
plt.hist(im.ravel(), 256, [0, 256], label='Original')
plt.legend()

使用 plt.hist 绘制原始图像的直方图。

    • im.ravel():将图像展平为一维数组。
    • 256:直方图的柱数(灰度级)。
    • [0, 256]:灰度值的范围。
    • label='Original':为直方图添加图例。
(5)显示均衡化图像的直方图
plt.subplot(2, 2, 4)
plt.hist(im_equa1.ravel(), 256, [0, 256], label='Equalized')
plt.legend()

绘制均衡化后图像的直方图。

添加图例 label='Equalized'。

(6)显示结果
plt.show()

使用 plt.show() 显示所有子图。

2. 运行结果

子图 1:原始图像

显示原始灰度图像 im。

子图 2:原始图像的直方图

显示原始图像的灰度直方图。

直方图可能呈现不均匀分布,灰度值集中在某些区域,导致图像对比度较低。

子图 3:均衡化后的图像

显示经过直方图均衡化后的图像 im_equa1。

图像的对比度显著增强,细节更加清晰。

子图 4:均衡化图像的直方图

显示均衡化后图像的灰度直方图。

直方图更加均匀,灰度值分布更加广泛,说明对比度得到了提升。

3. 直方图均衡化的原理

直方图均衡化是一种增强图像对比度的方法,通过调整图像的灰度分布,使输出图像的直方图接近均匀分布。其主要步骤包括:

  1. 计算原始图像的直方图。
  2. 计算累积分布函数(CDF)。
  3. 根据 CDF 将原始灰度值重新映射到新的灰度值,使得输出图像的直方图更加均匀。
4. 总结
  • 直方图均衡化:通过调整灰度分布,增强图像的全局对比度。
  • cv2.equalizeHist:OpenCV 提供的直方图均衡化函数,适用于灰度图像。
  • 应用场景
    • 用于提升图像的视觉效果。
    • 作为图像预处理步骤,为后续的特征提取或分析提供更好的基础。

十二,分割阈值

img = cv2.imread(r'lenna.png',0) #直接读为灰度图像#简单分割阈值 
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) 
#Otsu 滤波 
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_OTSU) 
print('简单分割阈值:',ret1) 
print('最佳分割阈值:',ret2) 
plt.figure(figsize=(8,8)) 
plt.subplot(221),plt.imshow(img,'gray') 
plt.subplot(222),plt.hist(img.ravel(),256)#.ravel 方法将矩阵转化为一维 
plt.subplot(223),plt.imshow(th1,'gray') 
plt.subplot(224),plt.imshow(th2,'gray')

简单分割阈值: 127.0

最佳分割阈值: 124.0

这段代码展示了如何使用 OpenCV 对灰度图像进行二值化处理,包括简单的阈值分割和基于 Otsu 方法的最佳阈值分割。同时,代码还展示了原始图像的直方图以及二值化后的结果。

1. 代码解析
(1)读取灰度图像
img = cv2.imread(r'lenna.png', 0)  # 直接读为灰度图像

使用 cv2.imread 函数以灰度模式读取图像 lenna.png。

参数 0 表示以灰度模式加载图像,返回的 img 是一个单通道的灰度图像。

(2)简单阈值分割
ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

cv2.threshold:对图像进行二值化处理。

    • img:输入的灰度图像。
    • 127:手动指定的阈值。
    • 255:超过阈值后的最大值。
    • cv2.THRESH_BINARY:二值化模式,像素值大于阈值时设为 255,小于阈值时设为 0。

返回值

    • ret1:实际使用的阈值(在这个例子中是 127)。
    • th1:二值化后的图像。
(3)Otsu 阈值分割
ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)

cv2.THRESH_OTSU:自动计算最佳阈值的方法。

    • Otsu 方法通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。
    • 在调用时,阈值参数(第二个参数)可以设为 0,因为 Otsu 方法会自动计算最佳阈值。

返回值

    • ret2:Otsu 方法计算出的最佳阈值。
    • th2:使用最佳阈值二值化后的图像。
(4)打印阈值
print('简单分割阈值:', ret1)  # 输出手动设置的阈值
print('最佳分割阈值:', ret2)  # 输出 Otsu 方法计算的最佳阈值

(5)显示结果
plt.figure(figsize=(8, 8))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title('Original')
plt.subplot(222), plt.hist(img.ravel(), 256), plt.title('Histogram')
plt.subplot(223), plt.imshow(th1, 'gray'), plt.title('Simple Threshold')
plt.subplot(224), plt.imshow(th2, 'gray'), plt.title('Otsu Threshold')

子图 1:显示原始灰度图像。

子图 2:显示原始图像的直方图。

    • 使用 .ravel() 方法将图像展平为一维数组。

子图 3:显示简单阈值分割后的图像。

子图 4:显示 Otsu 阈值分割后的图像。

2. 运行结果

子图 1:原始图像

显示原始灰度图像。

子图 2:原始图像的直方图

显示原始图像的灰度直方图。

直方图反映了图像中不同灰度值的分布情况。

子图 3:简单阈值分割

使用手动设置的阈值(127)进行二值化处理。

阈值分割的结果可能依赖于手动选择的阈值,不一定是最优的。

子图 4:Otsu 阈值分割

使用 Otsu 方法自动计算的最佳阈值进行二值化处理。

Otsu 方法通常能够更好地适应图像的灰度分布,分割效果通常优于手动阈值分割。

3. Otsu 方法的优势
  • 自动选择阈值:Otsu 方法通过统计图像的灰度分布,自动计算最佳阈值,无需手动选择。
  • 适应性强:适用于灰度分布差异较大的图像,能够有效分离前景和背景。
  • 基于统计:通过最小化类内方差或最大化类间方差来选择阈值,具有较强的理论基础。
4. 总结
  • 简单阈值分割:手动设置阈值,适用于灰度分布较为均匀的图像。
  • Otsu 阈值分割:自动计算最佳阈值,适用于灰度分布复杂的图像,分割效果通常更好。
  • 应用场景
    • 简单阈值分割:当图像的前景和背景灰度差异明显时,手动选择阈值可能足够。
    • Otsu 阈值分割:当图像的灰度分布复杂或需要自动化处理时,Otsu 方法是更好的选择。

十三,图像的腐蚀与膨胀

1.定义结构元素
element = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))

cv2.getStructuringElement:用于创建形态学操作的结构元素。

    • cv2.MORPH_CROSS:指定结构元素的形状为十字形(+ 形)。
    • (5, 5):结构元素的大小为 5×5。

element:生成的结构元素是一个二维数组,表示操作的核(kernel)。十字形结构元素在腐蚀和膨胀操作中主要用于边缘检测和细化。

#定义结构元素 
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)) 
plt.imshow(element,'gray')

2. 腐蚀操作
eroded = cv2.erode(bin_img, element)

cv2.erode:对二值图像进行腐蚀操作。

    • bin_img:输入的二值图像。
    • element:结构元素,定义了操作的形状和大小。

腐蚀原理

腐蚀操作会将图像中的前景(白色)区域逐渐缩小。

对于每个像素,如果结构元素覆盖的区域内包含背景(黑色)像素,则该像素被腐蚀为背景。

  • 应用场景
    • 用于去除小的噪声点。
    • 分离粘连的前景对象。
    • 细化图像中的线条。
#腐蚀图像 
eroded = cv2.erode(bin_img,element) 
#显示腐蚀后的图像 
plt.imshow(eroded,'gray') 
#原图像 
plt.figure() 
plt.imshow(bin_img,'gray')

3. 膨胀操作
dilated = cv2.dilate(bin_img, element)

cv2.dilate:对二值图像进行膨胀操作。

    • bin_img:输入的二值图像。
    • element:结构元素。

膨胀原理

膨胀操作会将图像中的前景(白色)区域逐渐扩大。

对于每个像素,如果结构元素覆盖的区域内包含前景(白色)像素,则该像素被膨胀为前景。

  • 应用场景
    • 用于填充前景对象中的小孔。
    • 连接断裂的部分。
    • 增加前景对象的尺寸。
#膨胀图像 
dilated = cv2.dilate(bin_img,element) 
#显示膨胀后的图像
plt.imshow(dilated,'gray'); 
#原图像 
plt.figure() 
plt.imshow(bin_img,'gray')

4. 总结
  • 腐蚀和膨胀:是形态学图像处理中的基本操作,用于修改图像的形状和结构。
  • 腐蚀
    • 使前景区域变小,背景区域变大。
    • 用于去除噪声、分离对象和细化结构。
  • 膨胀
    • 使前景区域变大,背景区域变小。
    • 用于填充孔洞、连接断裂部分和增加对象尺寸。
  • 结构元素
    • 定义了操作的形状和大小,对结果有重要影响。
    • 常用的结构元素包括矩形、圆形和十字形。

十四,图像的模糊处理

1. 中值模糊(Median Blur)
im_medianblur = cv2.medianBlur(im, 5)

cv2.medianBlur:对图像进行中值模糊处理。

    • im:输入图像。
    • 5:核大小(必须是奇数),表示中值滤波的窗口大小。

原理

中值模糊通过将每个像素替换为其邻域内的中值来减少噪声。

对于椒盐噪声等随机噪声,中值模糊效果较好。

import cv2 
import numpy as np 
import matplotlib.pyplot as plt 
%matplotlib inline im = cv2.imread('lenna.png') 
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) 
plt.imshow(im)# 调用OpenCV 的中值模糊API 
im_medianblur = cv2.medianBlur(im, 5) 
plt.figure() 
plt.imshow(im_medianblur) 
plt.show()

2. 均值模糊(Mean Blur)
im_meanblur = cv2.blur(im, (3, 3))

cv2.blur:对图像进行均值模糊处理。

    • im:输入图像。
    • (3, 3):核大小,表示均值滤波的窗口大小。

原理

均值模糊通过将每个像素替换为其邻域内的平均值来减少噪声。

对于高斯噪声,均值模糊有一定的平滑效果,但可能会使图像变得模糊。

im = cv2.imread('lenna.png') 
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) 
plt.imshow(im) 
# 调用OpenCV 的均值模糊API 
im_meanblur = cv2.blur(im, (3, 3))plt.figure() 
plt.imshow(im_meanblur) 
plt.show()

3. 高斯模糊(Gaussian Blur)
im_gaussianblur = cv2.GaussianBlur(im, (5, 5), 0)

cv2.GaussianBlur:对图像进行高斯模糊处理。

    • im:输入图像。
    • (5, 5):核大小(必须是奇数),表示高斯滤波的窗口大小。
    • 0:标准差(sigmaX),设置为 0 时,OpenCV 会根据核大小自动计算标准差。

原理

高斯模糊通过高斯核对图像进行加权平均,使图像平滑。

高斯模糊的效果比均值模糊更自然,边缘保留更好。

im = cv2.imread('lenna.png') 
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) 
plt.imshow(im) 
# 调用OpenCV 的高斯模糊API 
im_gaussianblur = cv2.GaussianBlur(im, (5, 5), 0) 
plt.figure() 
plt.imshow(im_gaussianblur) 
plt.show()

4. 总结
  • 中值模糊
    • 适用于去除椒盐噪声。
    • 对图像细节的保留较好。
  • 均值模糊
    • 适用于高斯噪声。
    • 图像整体模糊,可能会丢失细节。
  • 高斯模糊
    • 效果自然,边缘保留较好。
    • 适用于需要平滑图像但保留细节的场景。

十五,图像锐化

im = cv2.imread('lenna.png') 
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) 
plt.imshow(im)# 锐化算子1 
sharpen_1 = np.array([ 
    [-1,-1,-1], 
    [-1,9,-1], 
    [-1,-1,-1]]) 
# 使用filter2D 进行滤波操作 
im_sharpen1 = cv2.filter2D(im,-1,sharpen_1) 
plt.figure() 
plt.imshow(im_sharpen1) # 锐化算子2 
sharpen_2 = np.array([ 
    [0,-1,0],
    [-1,8,-1], 
    [0,1,0]])/4.0 # 使用filter2D 进行滤波操作 
im_sharpen2 = cv2.filter2D(im,-1,sharpen_2) 
plt.figure() 
plt.imshow(im_sharpen2)

原图

4邻接算子

8邻接算子

这段代码展示了如何使用 OpenCV 的 cv2.filter2D 函数结合自定义的锐化算子对图像进行锐化处理,并通过 Matplotlib 显示锐化后的结果。

1. 锐化算子的定义
(1)锐化算子 1
sharpen_1 = np.array([
    [-1, -1, -1],
    [-1, 9, -1],
    [-1, -1, -1]
])

特点

    • 这是一个 高通滤波器,用于增强图像的边缘。
    • 中心系数为 9,周围系数为 -1,表示对中心像素的增强和对周围像素的抑制。
    • 该算子的效果较为强烈,能够显著增强图像的边缘和细节。
(2)锐化算子 2
sharpen_2 = np.array([
    [0, -1, 0],
    [-1, 8, -1],
    [0, -1, 0]
]) / 4.0

特点

    • 这是一个 归一化后的锐化算子,通过除以 4.0,使得滤波器的权重总和为 1。
    • 中心系数为 8,周围系数为 -1,同样用于增强中心像素。
    • 该算子的效果较为温和,适合对图像进行轻微锐化。
2. 锐化操作
im_sharpen1 = cv2.filter2D(im, -1, sharpen_1)
im_sharpen2 = cv2.filter2D(im, -1, sharpen_2)

cv2.filter2D:用于对图像进行自定义滤波操作。

    • im:输入图像。
    • -1:目标图像的深度(-1 表示与输入图像深度相同)。
    • sharpen_1 或 sharpen_2:自定义的锐化算子。
3. 显示结果
plt.figure()
plt.imshow(im_sharpen1)
plt.title('Sharpened with Sharpen_1')plt.figure()
plt.imshow(im_sharpen2)
plt.title('Sharpened with Sharpen_2')

使用 Matplotlib 显示锐化后的图像。

对比两种锐化算子的效果:

    • sharpen_1:锐化效果强烈,图像边缘更加突出。
    • sharpen_2:锐化效果温和,图像细节增强但不过度。
4. 运行结果
  • 原始图像
    • 显示原始的 RGB 图像。
  • 锐化后的图像 1
    • 使用 sharpen_1 算子锐化后的图像。
    • 图像边缘显著增强,细节更加突出,但可能会出现一些噪点。
  • 锐化后的图像 2
    • 使用 sharpen_2 算子锐化后的图像。
    • 图像细节增强,但锐化效果较为温和,适合对图像进行轻微调整。
5. 总结
  • 锐化操作:通过自定义的锐化算子增强图像的边缘和细节。
  • 锐化算子的选择
    • sharpen_1:适用于需要强烈锐化效果的场景,能够显著增强图像的边缘。
    • sharpen_2:适用于需要温和锐化效果的场景,能够增强图像细节而不引入过多噪点。
  • 应用场景
    • sharpen_1:适合处理边缘模糊的图像,增强图像的视觉效果。
    • sharpen_2:适合对图像进行轻微锐化,保留更多细节。

相关文章:

cv2库的使用及图像预处理02

目录 八,图像缩放 1. 图像缩放操作 2. 插值方法 &#xff08;1&#xff09;最邻近插值&#xff08;cv2.INTER_NEAREST&#xff09; &#xff08;2&#xff09;双线性插值&#xff08;cv2.INTER_LINEAR&#xff09; 3. 显示缩放结果 4. 目标尺寸 5. 总结 九,线性灰度变…...

硬件学习笔记--45 电磁兼容试验-9 无线电干扰抑制试验介绍

目录 电磁兼容试验- 无线电干扰抑制试验 1.试验目的 2.试验方法 3.判定依据及意义 电磁兼容试验- 无线电干扰抑制试验 驻留时间是在规定频率下影响量施加的持续时间。被试设备&#xff08;EUT&#xff09;在经受扫频频带的电磁影响量或电磁干扰的情况下&a…...

P1464 Function(记忆化递归)

#include <bits/stdc.h> using namespace std;#define ll long longll dp[21][21][21]; // dp数组&#xff0c;用来记忆已经计算过的结果ll w(ll a, ll b, ll c) {if (a < 0 || b < 0 || c < 0) {return 1;}if (a > 20 || b > 20 || c > 20) {return …...

OpenCV机器学习(7)人工神经网络 定义模型训练过程中参数的搜索范围cv::ml::ParamGrid 类

OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::ParamGrid 类是 OpenCV 机器学习模块中的一个辅助类&#xff0c;用于定义模型训练过程中参数的搜索范围。它通常被用作某些机器学习算法&#xff08;如支持向量机 SVM&…...

STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(一)

目录 一、B2109 统计数字字符个数 - 洛谷 算法代码&#xff1a; 1. 引入库和命名空间 2. 主函数 3. 读取输入 4. 变量初始化 5. 遍历字符串 6. 输出结果 7. 返回值 总结 评测记录&#xff1a; 二、B2110 找第一个只出现一次的字符 - 洛谷 方法一&#xff1a;算法代…...

游戏引擎学习第107天

仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾我们之前停留的位置 在这段内容中&#xff0c;讨论了如何处理游戏中的三维效果&#xff0c;特别是如何处理额外的“Z层”。由于游戏中的艺术资源是位图而不是3D模型&#xff0c;因此实现三维效果变得非常具有挑战性。虽然可…...

网页制作01-html,css,javascript初认识のhtml的基本标记

一、 Html简介 英文全称是 hyper text markup language,超文本标记语言,是全球广域网上描述网页内容和外观的标准. Html作为一款标记语言,本身不能显示在浏览器中.标记语言经过浏览器的解释和编译,才能正确地反映html标记语言的内容. 1.html 的基本标记 1&#xff09;头部标…...

WebSocket在分布式环境中的局限性及解决方案

WebSocket 在分布式环境中存在一些局限性&#xff0c;特别是当系统需要扩展多个服务实例时&#xff0c;单个 WebSocket 连接的管理和消息推送就变得比较复杂。因此&#xff0c;必须采取一些额外的措施来确保 WebSocket 能在多个服务实例之间正确工作。 WebSocket 在分布式环境…...

Windows日志分析

查看服务日志文件 windows下我们可以通过时间查看器来查看windows系统下服务&#xff0c;应用&#xff0c;系统等产生的事件以及日志 1.打开方式是&#xff1a; winr 输入eventvwr.msc 2.控制面板--系统与安全--事件查看器 事件类型分为5种 错误&#xff1a;标识问题很严重…...

青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试

青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试 一、软件测试二、自动化测试三、单元测试四、Django 单元测试&#xff08;一&#xff09;、创建测试用例&#xff08;二&#xff09;、运行测试&#xff08;三&#xff09;、常用测试功能 课题摘要: 本文全面介绍了软件…...

WPF 中为 Grid 设置背景图片全解析

WPF 中为 Grid 设置背景图片全解析 在 WPF&#xff08;Windows Presentation Foundation&#xff09;开发中&#xff0c;界面的美观度是吸引用户的重要因素之一。而添加背景图片是提升界面视觉效果的常见手段。今天&#xff0c;我们就来深入探讨在 WPF 里如何为 Grid 设置背景…...

3.10 实战Hugging Face Transformers:从文本分类到模型部署全流程

实战Hugging Face Transformers:从文本分类到模型部署全流程 一、文本分类实战:IMDB电影评论情感分析 1.1 数据准备与预处理 from datasets import load_dataset from transformers import AutoTokenizer # 加载IMDB数据集 dataset = load_dataset("imdb") …...

Android中获取so文件来源于哪个库

Android app中可能有很多的.so文件&#xff0c;有时我们不确定这些.so文件都是来源于哪些库的&#xff0c;可以通过在build.gradle中添加代码来统计。具体方法如下&#xff1a; 1.在com.android.application模块的build.gradle文件最后添加如下代码&#xff1a; // 获取所有的…...

地面沉降监测,为地质安全保驾护航

地面沉降&#xff0c;不容忽视的城市隐患 随着城市化进程的加速&#xff0c;大规模的工程建设、地下水过度开采等因素&#xff0c;导致地面沉降现象日益严重。地面沉降不仅会使建筑物开裂、倾斜&#xff0c;影响其使用寿命和安全性&#xff0c;还会破坏地下管线&#xff0c;引…...

宝塔docker 安装oracle11G

1、拉取镜像 sudo docker pull iatebes/oracle_11g #iatebes为用户名2、查看镜像 sudo docker images3、创建并运行容器 docker run -d --privileged --name oralce11g -p 1521:1521 iatebes/oracle_11g4、登录到容器 5、进入容器并修改system用户密码 docker exec -it orac…...

unity学习39:连续动作之间的切换,用按键控制角色的移动

目录 1 不同状态之间的切换模式 1.1 在1个连续状态和一个连续状态之间的transition&#xff0c;使用trigger 1.2 在2个连续状态之间的转换&#xff0c;使用bool值切换转换 2 至少现在有2种角色的移动控制方式 2.1 用CharacterController 控制角色的移动 2.2 用animator…...

DeepSeek等大模型功能集成到WPS中的详细步骤

记录下将**DeepSeek功能集成到WPS中**的步骤&#xff0c;以备忘。 1. 下载并安装OfficeAI插件 访问OfficeAI插件下载地址&#xff1a;https://www.office-ai.cn/&#xff0c;下载插件&#xff08;目前只支持windows系统&#xff09;。 注意&#xff0c;有两个插件&#xff0…...

基于Python的Flask微博话题舆情分析可视化系统

✅️配套lun文 1w9字 ✅️爬虫可用 12月数据 ✅️实时微博热点分析 技术栈:爬虫➕Flask后端框架➕bert深度学习模型➕mysql数据库系统功能&#xff1a;爬取微博数据&#xff08;可以是同类型文章或者制定文章&#xff09;&#xff0c;微博文章情感分析&#xff0c;微博评论情感…...

服务器A到服务器B免密登录

#!/bin/bash # 变量定义 source_host"192.168.42.250" # 源主机 IP target_host"192.168.24.43" # 目标主机 IP target_user"nvidia" # 目标主机的用户名 ssh_port"6666" # SSH 端口号 # 生成 SSH…...

Unity中可靠的UDP实现

可靠 UDP&#xff08;Reliable UDP&#xff09;是一种在用户数据报协议&#xff08;UDP&#xff09;基础上&#xff0c;通过添加额外机制来实现可靠数据传输的技术。与传统 UDP 相比&#xff0c;它克服了 UDP 本身不保证数据可靠性、顺序性以及可能丢失数据的缺点&#xff0c;同…...

轮播图html

题十二&#xff1a;轮播图 要求&#xff1a; 1.鼠标不在图片上方时&#xff0c;进行自动轮播&#xff0c;并且左右箭头不会显示&#xff1b;当鼠标放在图片上方时&#xff0c;停止轮播&#xff0c;并且左右箭头会显示&#xff1b; 2.图片切换之后&#xff0c;图片中下方的小圆…...

二十多年前的苹果电源Power Mac G4 Mdd 电源接口

在1999年&#xff0c;苹果推出了最初的Power Mac G4电脑。第一代Power Mac G4有与G3系列相似的外壳和两种主板设置&#xff0c;分别使用PCI和AGP显示总线。第二代电脑被昵称为快银或水银机&#xff0c;来自2001年的它们有更高速的PowerPC 7450系列芯片&#xff0c;增强了L2缓存…...

java听书项目

项目的架构 网关:1路由转发 2.认证鉴权(token)3.统一处理(跨域) Mysql:关系型数据库 ES:搜索数据库 Redis:页面级缓存,会话状态存储 GitLab:私有托管平台 K8S:自动化部署、扩展和管理容器化应用程序的开源系统 Jenkins:自动化部署 1.环境搭建 创建一个父工程…...

RadASM环境,win32汇编入门教程之三

;运行效果 ;win32汇编环境&#xff0c;RadAsm入门教程之三 ;在这个教程里&#xff0c;我们学一下如何增加控件&#xff0c;比如按钮&#xff0c;其它的控件类似这样增加 ;以下的代码就是在教程一的窗口模版里增加一个按钮控件&#xff0c;可以比较一下&#xff0c;增加了什么内…...

【机器学习】线性回归 多元线性回归

【机器学习系列】 KNN算法 KNN算法原理简介及要点 特征归一化的重要性及方式线性回归算法 线性回归与一元线性回归 线性回归模型的损失函数 多元线性回归 多项式线性回归 多元线性回归 V1.0多元线性回归一元线性回归与多元线性回归多元线性回归模型的误差衡量多元线性回归的最…...

线性代数中的正交和标准正交向量

在线性代数中&#xff0c;理解正交向量和正交向量至关重要&#xff0c;尤其是对于机器学习中的应用。这篇博文将简化这些概念&#xff0c;而不会太深入地深入研究复杂的数学。 正交向量 如果两个向量的点积等于零&#xff0c;则认为这两个向量是正交的。但点积到底是什么呢&am…...

Vue 项目登录的基本流程

Vue 用户登录的基本流程包括以下6个步骤&#xff1a; 步骤&#xff1a; 1. 创建登录表单 在前端&#xff0c;首先要创建一个登录表单&#xff0c;用户输入账号&#xff08;用户名、邮箱、手机号等&#xff09;和密码。 示例&#xff1a;Login.vue <template><div…...

坐井说天阔---DeepSeek-R1

前言 DeepSeek-R1这么火&#xff0c;虽然网上很多介绍和解读&#xff0c;但听人家的总不如自己去看看原论文。于是花了大概一周的时间&#xff0c;下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…...

Spring 是如何解决循环依赖问题的?

Spring框架通过使用三级缓存机制来解决单例Bean之间的循环依赖问题。以下是详细的解释&#xff0c;包括循环依赖的概念、Spring的解决方案以及三级缓存的具体作用。 什么是循环依赖&#xff1f; 循环依赖是指两个或多个Bean之间相互依赖&#xff0c;形成一个闭环。例如&#…...

【数据可视化-17】基于pyecharts的印度犯罪数据可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

thingboard告警信息格式美化

原始报警json内容&#xff1a; { "severity": "CRITICAL","acknowledged": false,"cleared": false,"assigneeId": null,"startTs": 1739801102349,"endTs": 1739801102349,"ackTs": 0,&quo…...

Javaweb中,使用Servlet编写简单的接口

案例&#xff1a;网页提交用户名和密码信息&#xff0c;后端校验密码长度需在6-12位之间 后端部分 WebServlet("/valid") public class SimpleServlet extends HttpServlet{public void service(HttpServletRequest req, HttpServletResponse resp) throws IOExcepti…...

三层渗透测试-DMZ区域 二三层设备区域

DMZ区域渗透 信息收集 首先先进行信息收集&#xff0c;这里我们可以选择多种的信息收集方式&#xff0c;例如nmap如此之类的&#xff0c;我的建议是&#xff0c;可以通过自己现有的手里小工具&#xff0c;例如无影&#xff0c;密探这种工具&#xff0c;进行一个信息收集。以免…...

Java 开发者需要了解的 PDF 基础知识

PDF 代表“可移植文档格式”&#xff08;Portable Document Format&#xff09;&#xff0c;它是全球最流行的文件格式。因此&#xff0c;Java 开发人员很可能会经常需要处理它。然而&#xff0c;与 Microsoft Word 或 HTML/XML 这样的格式相比&#xff0c;PDF 并不那么直观。理…...

基于图像处理的裂缝检测与特征提取

一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…...

Webpack 基础入门

一、Webpack 是什么 Webpack 是一款现代 JavaScript 应用程序的静态模块打包工具。在 Web 开发中&#xff0c;我们的项目会包含各种类型的文件&#xff0c;如 JavaScript、CSS、图片等。Webpack 可以将这些文件打包成一个或多个文件&#xff0c;以便在浏览器中高效加载。它就像…...

掌握SQLite_轻量级数据库的全面指南

1. 引言 1.1 SQLite简介 SQLite 是一个嵌入式关系型数据库管理系统,它不需要单独的服务器进程或系统配置。它的设计目标是简单、高效、可靠,适用于各种应用场景,尤其是移动设备和嵌入式系统。 1.2 为什么选择SQLite 轻量级:文件大小通常在几百KB到几MB之间。无服务器架构…...

大数据处理如何入门

大数据处理的入门可以从以下几个方面入手&#xff1a; 1. 基础知识学习 在深入大数据领域之前&#xff0c;建议先掌握一些基础知识&#xff0c;包括数据类型、存储与处理的基本概念&#xff0c;以及常用的数据处理工具。例如&#xff0c;Python或Java编程语言在大数据领域应用…...

算法与数据结构(最小栈)

题目 思路 为了返回栈中的最小元素&#xff0c;我们需要额外维护一个辅助栈 min_stack&#xff0c;它的作用是记录当前栈中的最小值。 min_stack的作用&#xff1a; min_stack的栈顶元素始终是当前栈 st 中的最小值。 每当st中压入一个新元素时&#xff0c;如果这个元素小于等…...

LeetCode 1287.有序数组中出现次数超过25%的元素:遍历

【LetMeFly】1287.有序数组中出现次数超过25%的元素&#xff1a;遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/element-appearing-more-than-25-in-sorted-array/ 给你一个非递减的 有序 整数数组&#xff0c;已知这个数组中恰好有一个整数&#xff0c;它的出…...

春招项目=图床+ k8s 控制台(唬人专用)

1. 春招伊始 马上要春招了&#xff0c;一个大气的项目&#xff08;冲击波项目&#xff09;直观重要&#xff0c;虽然大家都说基础很重要&#xff0c;但是一个足够新颖的项目完全可以把你的简历添加一个足够闪亮的点。 这就不得不推荐下我的 k8s 图床了&#xff0c;去年折腾快…...

Vue 记录用户进入页面的时间、离开页面的时间并计算时长

在 Vue 项目中&#xff0c;要记录用户进入页面的时间、离开页面的时间&#xff0c;并在用户离开时计算时长并调用后端接口&#xff0c;可以借助 Vue 的生命周期钩子和浏览器的一些事件来实现。以下是具体的实现步骤和示例代码&#xff1a; 实现思路 记录进入时间&#xff1a;…...

解锁豆瓣高清海报(三)从深度爬虫到URL构造,实现极速下载

脚本地址: 项目地址: Gazer PosterBandit_v2.py 前瞻 之前的 PosterBandit.py 是按照深度爬虫的思路一步步进入海报界面来爬取, 是个值得学习的思路, 但缺点是它爬取慢, 仍然容易碰到豆瓣的 418 错误, 本文也会指出彻底解决旧版 418 错误的方法并提高爬取速度. 现在我将介绍…...

机器学习--逻辑回归

机器学习–逻辑回归 一、认知革命&#xff1a;从线性回归到逻辑回归 1.1 本质差异对比 维度线性回归逻辑回归输出类型连续值概率值 (0-1)目标函数最小二乘法极大似然估计数学表达式 y w T x b yw^Txb ywTxb p 1 1 e − ( w T x b ) p\frac{1}{1e^{-(w^Txb)}} p1e−(wTxb…...

gradio创建openai前端对接deepseek等模型流式输出markdown格式文本

环境 gradio3.50.2 openai1.63.1代码 import openai import gradio as gr#导入gradio的包api_key "sk-**a8" api_base "https://api.deepseek.com/v1"import gradio as gr import openai from typing import List, Any, Iteratorclient openai.OpenAI…...

【LeetCode Hot100】最大子数组和|动态规划/贪心,Java实现!图解+代码,小白也能秒懂!

&#x1f4bb; [LeetCode Hot100] 最大子数组和&#xff5c;动态规划/贪心&#xff0c;Java实现&#xff01;图解代码&#xff0c;小白也能秒懂&#xff01; ✏️本文对应题目链接&#xff1a;最大子数组和 &#x1f4cc; 题目描述 给定一个整数数组 nums&#xff0c;找到一个…...

【Go语言快速上手】第二部分:Go语言进阶之网络编程

文章目录 前言&#xff1a;网络编程一、TCP/UDP 编程&#xff1a;net 包的使用1. TCP 编程1.1 TCP 服务器1.2 TCP 客户端 2. UDP 编程2.1 UDP 服务器2.2 UDP 客户端 二、HTTP 编程&#xff1a;net/http 包的使用&#xff0c;编写 HTTP 服务器和客户端2.1 HTTP 服务器2.2 HTTP 客…...

AI法理学与责任归属:技术演进下的法律重构与伦理挑战

文章目录 引言:智能时代的新型法律困境一、AI技术特性对传统法理的冲击1.1 算法黑箱与可解释性悖论1.2 动态学习系统的责任漂移1.3 多智能体协作的责任稀释二、AI法理学的核心争议点2.1 法律主体资格认定2.2 因果关系的技术解构2.3 过错标准的重新定义三、责任归属的实践案例分…...

Linux探秘坊-------8.进程详解

1.概念详解 1.运行&&阻塞&&挂起 内容基础&#xff1a;方框中的就是调度队列&#xff0c;是一个 双向队列&#xff0c;每一个元素是PCB其对应的代码数据 1.运行 只要进程 在调度队列中&#xff0c;进程的状态就是运行&#xff08;running&#xff09;. 2.阻塞…...

C#使用文件读写操作实现仙剑五前传称号存档修改

手把手教学仙剑五前传 称号存档修改器 首先找到 Pal5Q所在目录的save\global.sav 文件,这是一个只有488字节的文件,这里存放称号对应的编号ID,以及是否已获得该称号,1为已获取称号,0为未获取称号 [称号:是否获取]这是一个键值对 称号的编号ID是一个Int32数字,使用C#的方法Bi…...