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

【OpenCV 图像处理 Python版】图像处理的基本操作

在这里插入图片描述

文章目录

  • 1.图像的 IO 操作
    • 1.1 图像读取 imread
    • 1.2 图像显示
      • 1.2.1 opencv 方式
      • 1.2.2 matplotlib 方式
    • 1.3 图像保存 imwrite
  • 2.绘制几何图形
      • 1. 绘制直线
      • 2. 绘制矩形
      • 3. 绘制圆形
      • 4. 绘制多边形
      • 5. 添加文字
  • 3.获取并修改图像中的像素点
    • 3.1 获取像素值
    • 3.2 修改像素值
    • 3.3 获取和修改区域像素值
  • 4.获取图像属性
    • 4.1 获取图像属性
      • 详细解释
    • 4.2 处理灰度图像
  • 5.图像通道的拆分与合并
    • 5.1 图像通道的拆分
    • 5.2 图像通道的合并
    • 5.3 修改单个通道并合并
  • 6.色彩空间的改变
      • 详细解释
      • 为什么需要将 HSV 和 Lab 图像,先转换回 RGB 格式再显示?
        • 1. `matplotlib` 期望的颜色格式是 RGB
        • 2. 可视化的直观性
        • 3. 避免误解

1.图像的 IO 操作

1.1 图像读取 imread

使用cv2.imread函数可以读取图像。该函数有两个参数:

  • 第一个参数是图像文件的路径
  • 第二个参数是读取模式,可以是以下几种:
    • cv2.IMREAD_COLOR:读取彩色图像(默认)。
    • cv2.IMREAD_GRAYSCALE:读取灰度图像。
    • cv2.IMREAD_UNCHANGED:读取图像,并包括图像的alpha通道。

示例

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 1.读取图像
# 读取彩色图像
image  = cv.imread('../images/iu.jpg', cv.IMREAD_COLOR)# 读取灰度图像
image_gray  = cv.imread('../images/iu.jpg', cv.IMREAD_GRAYSCALE)

1.2 图像显示

图像显示主要有两种方式:OpenCV 提供的 imshow 函数和 matplotlib 库提供的 imshow 函数。

1.2.1 opencv 方式

使用 cv2.imshow 函数可以显示图像。该函数有两个参数:

  • 第一个参数是窗口的名称。
  • 第二个参数是要显示的图像。

使用 cv2.waitKey 函数可以等待按键事件。该函数的参数是等待的时间(毫秒),如果设置为0,则无限等待。

使用cv2.destroyAllWindows函数可以关闭所有窗口。

示例

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 1.读取图像# 读取彩色图像
image  = cv.imread('../images/iu.jpg', cv.IMREAD_COLOR)# 读取灰度图像
image_gray  = cv.imread('../images/iu.jpg', cv.IMREAD_GRAYSCALE)# 2.显示图像
# 2.1 opencv 显示
cv.imshow('iu', image)
cv.imshow('gray', image_gray)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

但是由于使用 opencv 提供的 imshow 函数时会创建新的窗口显示图像,不方便观察,所以后面一般会用另外一种方式。

1.2.2 matplotlib 方式

转换颜色空间

由于OpenCV 读取的图像是 BGR 格式,而 matplotlib 显示图像时使用的是 RGB 格式。因此,需要将 BGR 图像转换为 RGB 图像,此时也是有两种方式:

  1. 使用 cvtColor 进行转换;
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image_rgb)
  1. 使用矩阵转换;
plt.imshow(image[:,:,::-1])

示例

第一种方式

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 1.读取图像# 读取彩色图像
image  = cv.imread('../images/iu.jpg', cv.IMREAD_COLOR)# 读取灰度图像
image_gray  = cv.imread('../images/iu.jpg', cv.IMREAD_GRAYSCALE)# 2.2 plt 读取# 第一种方式
image_rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)# 彩色图像显示
plt.imshow(image_rgb)
plt.show()

在这里插入图片描述
第二种方式

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 1.读取图像# 读取彩色图像
image  = cv.imread('../images/iu.jpg', cv.IMREAD_COLOR)# 读取灰度图像
image_gray  = cv.imread('../images/iu.jpg', cv.IMREAD_GRAYSCALE)# 2.2 plt 读取# 第二种方式
plt.imshow(image[:,:,::-1]) # 彩色图像显示
plt.show()

在这里插入图片描述

1.3 图像保存 imwrite

使用 cv2.imwrite 函数可以保存图像。该函数有两个参数:

  • 第一个参数是保存的文件路径。
  • 第二个参数是要保存的图像。

示例

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 1.读取图像# 读取彩色图像
image  = cv.imread('../images/iu.jpg', cv.IMREAD_COLOR)# 读取灰度图像
image_gray  = cv.imread('../images/iu.jpg', cv.IMREAD_GRAYSCALE)# 2.显示图像
# 2.1 opencv 读取
# cv.imshow('iu', image)
# cv.imshow('gray', image_gray)
# cv.waitKey(0)
# cv.destroyAllWindows()# 2.2 plt 读取# 第一种方式
# image_rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)# 彩色图像读取
# plt.imshow(image_rgb)# 第二种方式
# plt.imshow(image[:,:,::-1]) # 彩色图像读取
# plt.show()# 3.图像保存
cv.imwrite('../images/iu_rgb.jpg', image)
cv.imwrite('../images/iu_gray.jpg', image_gray)

2.绘制几何图形

在OpenCV中,可以使用一系列绘图函数在图像上绘制几何图形和添加文字。这些函数包括绘制直线、矩形、圆形、多边形以及添加文本等。以下是如何使用这些函数的详细步骤和示例代码。

1. 绘制直线

使用 cv2.line 函数可以在图像上绘制直线。该函数的参数包括:

  • 图像对象
  • 起点坐标
  • 终点坐标
  • 颜色(BGR格式)
  • 线条粗细(可选)
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 创建一个空白图像
image = np.zeros((512, 512, 3), np.uint8)# 绘制一条白色直线
cv.line(image, (0, 0), (511, 511), (255, 255, 255), 5)# 显示图像
plt.imshow(image[:,:,::-1])
plt.show()

在这里插入图片描述

2. 绘制矩形

使用 cv2.rectangle 函数可以在图像上绘制矩形。该函数的参数包括:

  • 图像对象
  • 左上角坐标
  • 右下角坐标
  • 颜色(BGR格式)
  • 线条粗细(如果为负值,则填充矩形)
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 创建一个空白图像
image = np.zeros((512, 512, 3), np.uint8)# 绘制一条白色直线
cv.line(image, (0, 0), (511, 511), (255, 255, 255), 5)# 绘制一个绿色矩形
cv.rectangle(image, (100, 100), (400, 400), (0, 255, 0), 3)# 显示图像
plt.imshow(image[:,:,::-1])
plt.show()

在这里插入图片描述

3. 绘制圆形

使用 cv2.circle 函数可以在图像上绘制圆形。该函数的参数包括:

  • 图像对象
  • 圆心坐标
  • 半径
  • 颜色(BGR格式)
  • 线条粗细(如果为负值,则填充圆形)
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 创建一个空白图像
image = np.zeros((512, 512, 3), np.uint8)# 绘制一条白色直线
cv.line(image, (0, 0), (511, 511), (255, 255, 255), 5)# 绘制一个绿色矩形
cv.rectangle(image, (100, 100), (400, 400), (0, 255, 0), 3)# 绘制一个红色圆形
cv.circle(image, (256, 256), 100, (0, 0, 255), -1)# 显示图像
plt.imshow(image[:,:,::-1])
plt.show()

在这里插入图片描述

4. 绘制多边形

使用 cv2.polylines 函数可以在图像上绘制多边形。该函数的参数包括:

  • 图像对象
  • 顶点坐标数组
  • 是否闭合
  • 颜色(BGR格式)
  • 线条粗细
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 创建一个空白图像
image = np.zeros((512, 512, 3), np.uint8)# 绘制一条白色直线
cv.line(image, (0, 0), (511, 511), (255, 255, 255), 5)# 绘制一个绿色矩形
cv.rectangle(image, (100, 100), (400, 400), (0, 255, 0), 3)# 绘制一个红色圆形
cv.circle(image, (256, 256), 100, (0, 0, 255), -1)# 定义多边形的顶点
points = np.array([[100, 50], [200, 300], [70, 200], [50, 100]], np.int32)
points = points.reshape((-1, 1, 2))# 绘制一个蓝色多边形
cv.polylines(image, [points], True, (255, 0, 0), 3)
# 显示图像
plt.imshow(image[:,:,::-1])
plt.show()

在这里插入图片描述

5. 添加文字

使用 cv2.putText 函数可以在图像上添加文字。该函数的参数包括:

  • 图像对象
  • 文字内容
  • 文字起点坐标
  • 字体类型
  • 字体大小
  • 颜色(BGR格式)
  • 线条粗细
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 创建一个空白图像
image = np.zeros((512, 512, 3), np.uint8)# 绘制一条白色直线
cv.line(image, (0, 0), (511, 511), (255, 255, 255), 5)# 绘制一个绿色矩形
cv.rectangle(image, (100, 100), (400, 400), (0, 255, 0), 3)# 绘制一个红色圆形
cv.circle(image, (256, 256), 100, (0, 0, 255), -1)# 定义多边形的顶点
points = np.array([[100, 50], [200, 300], [70, 200], [50, 100]], np.int32)
points = points.reshape((-1, 1, 2))# 绘制一个蓝色多边形
cv.polylines(image, [points], True, (255, 0, 0), 3)
# 显示图像# 添加白色文字
cv.putText(image, 'Hello, OpenCV!', (50, 250), cv.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)plt.imshow(image[:,:,::-1])
plt.show()

在这里插入图片描述

3.获取并修改图像中的像素点

在OpenCV中,可以非常方便地获取和修改图像中的像素点。图像在OpenCV中被表示为一个NumPy数组,因此可以使用NumPy的索引和切片操作来访问和修改图像的像素值。

3.1 获取像素值

要获取图像中某个像素点的值,可以使用数组索引。对于彩色图像,像素值是一个包含三个元素的数组,分别表示B、G、R三个通道的值。对于灰度图像,像素值是一个单一的灰度值。

示例

import cv2 as cv# 读取彩色图像
image = cv.imread('../images/iu.jpg')# 获取某个像素点的值 (x=100, y=100)
pixel_value = image[100, 100]
print("Pixel value at (100, 100):", pixel_value)# 获取某个像素点的蓝色通道值
blue_value = image[100, 100, 0]
print("Blue channel value at (100, 100):", blue_value)# 获取某个像素点的绿色通道值
green_value = image[100, 100, 1]
print("Green channel value at (100, 100):", green_value)# 获取某个像素点的红色通道值
red_value = image[100, 100, 2]
print("Red channel value at (100, 100):", red_value)

3.2 修改像素值

要修改图像中某个像素点的值,可以直接使用数组索引进行赋值操作。对于彩色图像,可以分别修改B、G、R三个通道的值。

示例

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 创建一个空白图像
image = np.zeros((512, 512, 3), np.uint8)# 修改某个像素点的值 (x=100, y=100)
image[100, 100] = [0, 255, 0]  # 将该像素点设置为绿色# 修改某个像素点的蓝色通道值
image[100, 100, 0] = 255  # 将该像素点的蓝色通道值设置为255# 修改某个像素点的绿色通道值
image[100, 100, 1] = 0  # 将该像素点的绿色通道值设置为0# 修改某个像素点的红色通道值
image[100, 100, 2] = 0  # 将该像素点的红色通道值设置为0# 显示修改后的图像
plt.imshow(image[:,:,::-1])
plt.show()

3.3 获取和修改区域像素值

除了单个像素点,还可以获取和修改图像的某个区域。可以使用NumPy的切片操作来实现。

示例

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 创建一个空白图像
image = np.zeros((512, 512, 3), np.uint8)# 获取某个区域的像素值 (从x=100, y=100到x=200, y=200)
region = image[100:200, 100:200]
print("Region shape:", region.shape)# 修改某个区域的像素值 (从x=100, y=100到x=200, y=200)
image[100:200, 100:200] = [0, 255, 0]  # 将该区域设置为绿色# 显示修改后的图像
plt.imshow(image[:,:,::-1])
plt.show()

在这里插入图片描述

4.获取图像属性

在OpenCV中,可以通过读取图像的属性来获取图像的基本信息,例如图像的尺寸、通道数、数据类型等。这些属性可以帮助你了解图像的基本结构和格式,从而更好地进行图像处理和分析。

4.1 获取图像属性

以下是一些常用的图像属性及其获取方法:

  1. 图像的形状(尺寸):可以使用NumPy数组的 shape 属性来获取图像的尺寸。
  2. 图像的大小(像素数):可以使用NumPy数组的 size 属性来获取图像的总像素数。
  3. 图像的数据类型:可以使用NumPy数组的 dtype 属性来获取图像的数据类型。

示例

以下是一个示例代码,演示如何获取图像的这些属性:

import cv2 as cv# 读取图像
image = cv.imread('../images/iu.jpg')# 获取图像的形状(尺寸)
height, width, channels = image.shape
print("Height:", height)
print("Width:", width)
print("Channels:", channels)# 获取图像的大小(像素数)
size = image.size
print("Size (number of pixels):", size)# 获取图像的数据类型
dtype = image.dtype
print("Data type:", dtype)

详细解释

  1. 图像的形状(尺寸)

    • image.shape 返回一个包含三个元素的元组,分别表示图像的高度、宽度和通道数。
    • 对于灰度图像,image.shape 返回的元组只有两个元素,分别表示图像的高度和宽度。
  2. 图像的大小(像素数)

    • image.size 返回图像的总像素数,即高度、宽度和通道数的乘积。
  3. 图像的数据类型

    • image.dtype 返回图像的数据类型,通常是 uint8,表示每个像素值是一个8位无符号整数。

4.2 处理灰度图像

如果你处理的是灰度图像,获取属性的方式略有不同,因为灰度图像只有两个维度(高度和宽度)。

import cv2 as cv# 读取灰度图像
gray_image = cv.imread('example.jpg', cv.IMREAD_GRAYSCALE)# 获取图像的形状(尺寸)
height, width = gray_image.shape
print("Height:", height)
print("Width:", width)# 获取图像的大小(像素数)
size = gray_image.size
print("Size (number of pixels):", size)# 获取图像的数据类型
dtype = gray_image.dtype
print("Data type:", dtype)

5.图像通道的拆分与合并

在OpenCV中,可以使用 cv2.split 函数将彩色图像的通道拆分为单独的灰度图像,并使用 cv2.merge 函数将多个单通道图像合并为一个多通道图像。这些操作在图像处理和计算机视觉任务中非常常见和有用。

5.1 图像通道的拆分

cv2.split 函数可以将彩色图像的B、G、R三个通道拆分为三个单独的灰度图像。

示例

import cv2 as cv
import matplotlib.pyplot as plt# 读取彩色图像
image = cv.imread('../images/iu.jpg')# 拆分图像的B、G、R通道
b_channel, g_channel, r_channel = cv.split(image)# 将BGR图像转换为RGB图像
image_rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)# 显示原始图像和拆分后的通道图像
plt.figure(figsize=(10, 7))# 显示原始图像
plt.subplot(2, 2, 1)
plt.imshow(image_rgb)
plt.title('Original Image (RGB)')
plt.axis('off')# 显示蓝色通道
plt.subplot(2, 2, 2)
plt.imshow(b_channel, cmap='gray')
plt.title('Blue Channel')
plt.axis('off')# 显示绿色通道
plt.subplot(2, 2, 3)
plt.imshow(g_channel, cmap='gray')
plt.title('Green Channel')
plt.axis('off')# 显示红色通道
plt.subplot(2, 2, 4)
plt.imshow(r_channel, cmap='gray')
plt.title('Red Channel')
plt.axis('off')plt.show()

在这里插入图片描述

5.2 图像通道的合并

cv2.merge 函数可以将多个单通道图像合并为一个多通道图像。通常用于将拆分后的通道重新合并为一个彩色图像。

示例

import cv2 as cv
import matplotlib.pyplot as plt# 读取彩色图像
image = cv.imread('../images/iu.jpg')# 拆分图像的B、G、R通道
b_channel, g_channel, r_channel = cv.split(image)# 将BGR图像转换为RGB图像
image_rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)# 合并B、G、R通道
merged_image = cv.merge([b_channel, g_channel, r_channel])# 显示合并通道后的图像
plt.imshow(merged_image[:,:,::-1])
plt.show()

在这里插入图片描述

5.3 修改单个通道并合并

你还可以在拆分通道后对单个通道进行修改,然后再合并回去。例如,将图像的红色通道设置为零。

示例

import cv2 as cv
import matplotlib.pyplot as plt# 读取彩色图像
image = cv.imread('../images/iu.jpg')# 拆分图像的B、G、R通道
b_channel, g_channel, r_channel = cv.split(image)# 将BGR图像转换为RGB图像
image_rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)# # 将红色通道设置为零
# r_channel[:] = 0# 合并B、G、R通道
merged_image = cv.merge([b_channel, g_channel, r_channel])# 显示合并通道后的图像
plt.imshow(merged_image[:,:,::-1])
plt.show()

在这里插入图片描述

6.色彩空间的改变

在图像处理和计算机视觉中,改变色彩空间是一个常见的操作。OpenCV 提供了多种色彩空间转换函数,可以方便地在不同色彩空间之间进行转换。常见的色彩空间包括 BGRRGBHSVLab 等。

OpenCV 提供了 cv.cvtColor 函数来进行色彩空间的转换。以下是一些常见的色彩空间转换:

  • BGRRGBcv.COLOR_BGR2RGB
  • BGR灰度cv.COLOR_BGR2GRAY
  • BGRHSVcv.COLOR_BGR2HSV
  • BGRLabcv.COLOR_BGR2Lab

示例

import cv2 as cv
import matplotlib.pyplot as plt# 读取彩色图像
image = cv.imread('../images/iu.jpg')# BGR 转 RGB
image_rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)# BGR 转 灰度
image_gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)# BGR 转 HSV
image_hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)# BGR 转 Lab
image_lab = cv.cvtColor(image, cv.COLOR_BGR2Lab)# 显示原始图像和转换后的图像
plt.figure(figsize=(12, 8))# 显示原始图像(BGR 转 RGB)
plt.subplot(2, 2, 1)
plt.imshow(image_rgb)
plt.title('Original Image (RGB)')
plt.axis('off')# 显示灰度图像
plt.subplot(2, 2, 2)
plt.imshow(image_gray, cmap='gray')
plt.title('Grayscale Image')
plt.axis('off')# 显示 HSV 图像
plt.subplot(2, 2, 3)
plt.imshow(image_hsv)
plt.title('HSV Image')
plt.axis('off')# 显示 Lab 图像
plt.subplot(2, 2, 4)
plt.imshow(image_lab)
plt.title('Lab Image')
plt.axis('off')plt.tight_layout()
plt.show()

在这里插入图片描述

详细解释

读取图像

使用 cv.imread 读取图像,默认情况下图像是以 BGR 顺序存储的。
色彩空间转换:

  • 使用 cv.cvtColor 函数进行色彩空间转换。
    • cv.COLOR_BGR2RGB:将 BGR 转换为 RGB。
    • cv.COLOR_BGR2GRAY:将 BGR 转换为灰度。
    • cv.COLOR_BGR2HSV:将 BGR 转换为 HSV。
    • cv.COLOR_BGR2Lab:将 BGR 转换为 Lab。

显示图像

使用 plt.imshow 显示图像。对于彩色图像,确保颜色通道顺序正确(RGB)

  • 对于灰度图像,使用 cmap='gray' 参数显示灰度图像。
  • 对于 HSVLab 图像,先转换回 RGB 格式再显示。

为什么需要将 HSV 和 Lab 图像,先转换回 RGB 格式再显示?

在使用 matplotlib 显示图像时,特别是对于 HSV 和 Lab 色彩空间的图像,先转换回 RGB 格式再显示的原因主要有以下几点:

1. matplotlib 期望的颜色格式是 RGB

matplotlibplt.imshow 函数默认期望输入的图像是 RGB 格式的。如果直接传入 HSV 或 Lab 格式的图像,颜色会显示不正确,因为 matplotlib 会将这些值误解为 RGB 值。

2. 可视化的直观性

HSV 和 Lab 色彩空间的值并不直接对应于人类视觉系统中的颜色感知。例如,HSV 色彩空间中的 H(色调)分量是一个角度值,S(饱和度)和 V(亮度)分量是比例值,而这些值在直接显示时并不能直观地反映出图像的颜色信息。将它们转换回 RGB 格式后,可以更直观地展示图像的颜色信息。

3. 避免误解

直接显示 HSV 或 Lab 图像可能会导致误解,因为这些色彩空间的值范围和含义与 RGB 不同。例如,HSV 色彩空间中的 H 分量范围是 [0, 179](在 OpenCV 中),而 RGB 的每个通道范围是 [0, 255]。直接显示这些图像会导致颜色失真和误解。

示例

以下是一个示例代码,演示如何将 HSV 和 Lab 图像转换回 RGB 格式再使用 matplotlib 显示:

import cv2 as cv
import matplotlib.pyplot as plt# 读取彩色图像
image = cv.imread('example.jpg')# BGR 转 HSV
image_hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)# BGR 转 Lab
image_lab = cv.cvtColor(image, cv.COLOR_BGR2Lab)# HSV 转 RGB
image_hsv_rgb = cv.cvtColor(image_hsv, cv.COLOR_HSV2RGB)# Lab 转 RGB
image_lab_rgb = cv.cvtColor(image_lab, cv.COLOR_Lab2RGB)# 显示原始图像和转换后的图像
plt.figure(figsize=(12, 8))# 显示原始图像(BGR 转 RGB)
image_rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)
plt.subplot(2, 2, 1)
plt.imshow(image_rgb)
plt.title('Original Image (RGB)')
plt.axis('off')# 显示 HSV 图像(转换回 RGB)
plt.subplot(2, 2, 2)
plt.imshow(image_hsv_rgb)
plt.title('HSV Image (Converted to RGB)')
plt.axis('off')# 显示 Lab 图像(转换回 RGB)
plt.subplot(2, 2, 3)
plt.imshow(image_lab_rgb)
plt.title('Lab Image (Converted to RGB)')
plt.axis('off')plt.tight_layout()
plt.show()

在这里插入图片描述

相关文章:

【OpenCV 图像处理 Python版】图像处理的基本操作

文章目录 1.图像的 IO 操作1.1 图像读取 imread1.2 图像显示1.2.1 opencv 方式1.2.2 matplotlib 方式 1.3 图像保存 imwrite 2.绘制几何图形1. 绘制直线2. 绘制矩形3. 绘制圆形4. 绘制多边形5. 添加文字 3.获取并修改图像中的像素点3.1 获取像素值3.2 修改像素值3.3 获取和修改…...

HarmonyOS应用开发学习经验

一、HarmonyOS学习官网 开发者能力认证 HarmonyOS应用开发者基础认证6月之前的学习资源官网已经关闭过期,大家不要慌,官方更新了最新资源,但是,对于之前没有学习完的学员不友好,存在知识断片的现象,建议官…...

LLM大语言模型应用方案之RAG检索增强生成的实现步骤。

0.我理解的RAG 什么是RAG? RAG的全称是“检索增强生成模型”(Retrieval-Augmented Generation)。这是一种特别聪明的大语言模型。 RAG是怎么工作的呢? 1.检索:当你问RAG一个问题时,它会先去“图书…...

【python学习】学习python的小项目

学习Python时,通过完成一些小项目可以帮助你巩固知识并提升实践能力。以下是一些适合学习Python的小项目建议: 命令行计算器: 创建一个简单的命令行计算器,可以执行基本的算术运算(加、减、乘、除)。使用i…...

java-冒泡排序 1

## Java中的冒泡排序 ### 1. 冒泡排序的基本概念 冒泡排序(Bubble Sort)是一种简单且直观的排序算法。它通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置,使较大的元素逐步从列表的一端移动到另一端,就像…...

【STM32】USART串口通讯

1.USART简介 STM32芯片具有多个USART外设用于串口通讯,它是 Universal Synchronous Asynchronous Receiver and Transmitter的缩写, 即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于USART, 它还有具有UART外设(Univers…...

Qt6中如何将QList转为QSet?

QSet是一个具有唯一值的哈希集合。比较少用。比较有用的是QSet里面的intersect查找两个集合中不同元素&#xff0c;并合并。 转换过程比较简单&#xff0c;第一种是直接用迭代器。 QSet<int> set(list.begin(), list.end()); 第二种就是逐一遍历赋值&#xff1a; QLi…...

aspectj:AOP编程备忘录-切面定义的注意事项

AOP编程时定义切面时需要注意的事 Around 以Around注解拦截构造方法(Constructor)时切面定义只能用call方式而不能是execution&#xff0c;否则 ProceedingJoinPoint.proceed()返回的是null&#xff0c;得不到构造的实例。 execution execution切入点要修改对象内部&#x…...

大数据面试题之Hive(1)

目录 说下为什么要使用Hive?Hive的优缺点?Hive的作用是什么? 说下Hive是什么?跟数据仓库区别? Hive架构 Hive内部表和外部表的区别? 为什么内部表的删除&#xff0c;就会将数据全部删除&#xff0c;而外部表只删除表结构?为什么用外部表更好? Hive建表语句?创建表…...

【Git】分布式版本控制工具

一、简介 二、目标 Git分布式版本控制工具 一、简介 Git是一种分布式版本控制系统&#xff0c;用于跟踪和管理源代码的变化。它由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于2005年开发&#xff0c;并迅速成为最流行的版本控制工具之一。以下是关于Git的一些关键…...

排序之插入排序----直接插入排序和希尔排序(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 排序之插入排序----直接插入排序和希尔排序(1) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨…...

快速创建条形热力图

Excel中的条件格式可以有效的凸显数据特征&#xff0c;如下图中B列所示。 现在需要使用图表展现热力条形图&#xff0c;如下图所示。由于颜色有多个过渡色&#xff0c;因此手工逐个设置数据条的颜色&#xff0c;基本上是不可能完成的任务&#xff0c;使用VBA代码可以快速创建这…...

go switch 与 interface

go switch 与 interface 前言 前言 github.com/google/cel-go/common/types/ref type Val interface {// ConvertToNative converts the Value to a native Go struct according to the// reflected type description, or error if the conversion is not feasible.ConvertTo…...

BaseMapper 接口介绍

基于 mybatis-mapper/provider 核心部分实现的基础的增删改查操作&#xff0c;提供了一个核心的 io.mybatis.mapper.BaseMapper 接口和一个 预定义 的 io.mybatis.mapper.Mapper 接口&#xff0c;BaseMapper 接口定义如下&#xff1a; /*** 基础 Mapper 方法&#xff0c;可以在…...

HAL-Cubemax定时器使用记录

title: HAL-Cubemax定时器使用记录 tags: STM32HalCubemax 文章目录 HAL-Cubemax定时器使用记录分享一种思路1.创建一个ms(毫秒)级延时中断2.创建计数的变量3.在需要延时的函数中对变量阈值进行判断4.验证实例--完整使用记录代码 问题往期内容基础库HAL cubemax VSCODE GCC …...

同时使用磁吸充电器和Lightning时,iPhone充电速度会变快吗?

在智能手机的世界里&#xff0c;续航能力一直是用户关注的焦点。苹果公司以其创新的MagSafe技术和传统的Lightning接口&#xff0c;为iPhone用户提供了多样化的充电解决方案。 然而&#xff0c;当这两种技术同时使用时&#xff0c;它们能否带来更快的充电速度&#xff1f;本文…...

零成本搭建个人图床服务器

前言 图床服务器是一种用于存储和管理图片的服务器&#xff0c;可以给我们提供将图片上传后能外部访问浏览的服务。这样我们在写文章时插入的说明图片&#xff0c;就可以集中放到图床里&#xff0c;既方便多平台文章发布&#xff0c;又能统一管理和备份。 当然下面通过在 Git…...

SpringBoot 搭建sftp服务 实现远程上传和下载文件

maven依赖&#xff1a; <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version> </dependency>application.yml sftp:protocol: sftphost: port: 22username: rootpassword: sp…...

IDEA中使用leetcode 刷题

目录 1.IDEA下载leetcode插件 2.侧边点开插件 3.打开网页版登录找到cookie复制 4.回到IDEA登录 5.刷题 6.共勉 1.IDEA下载leetcode插件 2.侧边点开插件 3.打开网页版登录找到cookie复制 4.回到IDEA登录 5.刷题 6.共勉 算法题来了不畏惧&#xff0c; 挑战前行是成长的舞台…...

华为海思CPU解读

安全可靠CPU测评结果&#xff08;华为海思篇&#xff09; 中国信息安全测评中心于2024年5月20日发布安全可靠测评结果公告&#xff08;2024年第1号&#xff09;&#xff0c;公布依据《安全可靠测评工作指南&#xff08;试行&#xff09;》的测评结果&#xff0c;自发布起有效期…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...