计算机视觉-OpenCV图像处理
- 创业
- 2025-09-04 23:03:02

1.Matplotlib数据可视化(绘制图像直方图、可视化矩阵) # Matplotlib 数据可视化(绘制图像直方图、可视化矩阵) # 本节主要讲解如何使用 Matplotlib 绘制图像直方图和可视化矩阵。 # 1. 绘制图像直方图 # 2. 可视化矩阵 # 1. 绘制图像直方图 import cv2 import matplotlib.pyplot as plt import numpy as np # 读取图像并转换为灰度图,读取后的 image 是一个二维数组,每个元素代表一个像素的灰度值。 image = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE) #将图像转换为灰度图(像素值范围 0 到 255) # 绘制图像和直方图 plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1) #创建一个1行2列的子图,当前激活第1个子图 plt.imshow(image, cmap='gray') #将图像以矩阵形式可视化。cmap='gray' 指定使用灰度颜色。 plt.title('Grayscale Image') plt.axis('off') #关闭坐标轴 plt.subplot(1, 2, 2) #创建一个1行2列的子图,当前激活第2个子图 # plt.hist 函数要求输入是一维数组,所以需要使用 ravel() 方法将二维或三维的图像数组转换为一维数组 plt.hist(image.ravel(), bins=256, range=[0, 256], color='r', alpha=0.5) #绘制直方图 plt.title('Histogram') #设置标题 plt.xlabel('Pixel Value') #设置x轴标签 plt.ylabel('Frequency') #设置y轴标签 plt.tight_layout() #自动调整子图参数,使之填充整个图像区域 plt.show() #显示图像和直方图
# 2. 可视化矩阵 import numpy as np import matplotlib.pyplot as plt # 创建一个包含3x3个元素的随机矩阵 arr = np.random.rand(3, 3) # 可视化矩阵 # imshow 是 matplotlib.pyplot 中的一个函数,用于将数组(矩阵)以图像的形式显示出来。 # 在这个例子中,它将 arr 矩阵中的每个元素映射为图像中的一个像素,像素的颜色由元素的值决定。 # cmap='viridis':cmap 参数指定了颜色映射(colormap),即如何将数组中的数值映射为不同的颜色。 # 'viridis' 是 matplotlib 提供的一种颜色映射方案,它是一种连续的、感知均匀的颜色映射,从蓝色到黄色渐变,常用于可视化连续的数值数据。 plt.imshow(arr, cmap='viridis') #将矩阵以矩阵形式可视化。cmap='viridis' 指定使用 viridis 颜色。 # 在图像旁边添加一个颜色条。颜色条用于显示颜色与数值之间的对应关系,通过颜色条可以直观地了解图像中不同颜色所代表的数值大小。 plt.colorbar() #添加颜色条 plt.title('Matrix Visualization') #设置标题 plt.show() #显示图像
2.OpenCV图像处理 滤波操作(去除噪声)边缘检测(提取图像中的边缘)特征点检测(检测图像中的关键点)
练习任务:写一个简单的OpenCV脚本,提取两个图像的ORB特征并进行匹配。
滤波操作滤波用于平滑图像、去除噪声。常见的滤波器有 均值滤波、高斯滤波和中值滤波。
# OpenCV 提供了丰富的图像处理功能,我们将重点介绍以下操作 # 滤波操作(去除噪声) # 边缘检测(提取图像中的边缘) # 特征点检测(检测图像中的关键点) # 滤波用于平滑图像、去除噪声。常见的滤波器有 均值滤波、高斯滤波和中值滤波。 # 均值滤波:将图像中的每个像素替换为其周围像素的平均值。 # 高斯滤波:将图像中的每个像素替换为其周围像素的加权平均值。 # 中值滤波:将图像中的每个像素替换为其周围像素的中值。 import cv2 import matplotlib.pyplot as plt import numpy as np # 读取图像 image = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE) # 均值滤波 # cv2.blur() 函数用于对图像进行均值滤波。第一个参数是输入图像,第二个参数是滤波核的大小。 # 滤波核的大小决定了滤波的效果,核的大小越大,滤波效果越明显。 # 例如,当核的大小为 (3, 3) 时,表示 3x3 的滤波核,对图像进行均值滤波。 blur_image = cv2.blur(image, (3, 3)) # 高斯滤波 # cv2.GaussianBlur() 函数用于对图像进行高斯滤波。第一个参数是输入图像,第二个参数是高斯核的大小,第三个参数是高斯核的标准差。 # 高斯核的大小和标准差决定了滤波的效果,高斯核的大小越大,滤波效果越明显。 # 例如,当高斯核的大小为 (3, 3),标准差为 0 时,表示 3x3 的高斯核,对图像进行高斯滤波。 gaussian_image = cv2.GaussianBlur(image, (3, 3), 0) # 中值滤波 # cv2.medianBlur() 函数用于对图像进行中值滤波。第一个参数是输入图像,第二个参数是滤波核的大小。 # 中值滤波适用于去除椒盐噪声,即图像中的黑白点噪声。 # 例如,当核的大小为 3 时,表示 3x3 的滤波核,对图像进行中值滤波。 median_image = cv2.medianBlur(image, 3) # 显示图像和滤波结果 plt.figure(figsize=(12, 6)) plt.subplot(1, 3, 1), plt.imshow(blur_image, cmap='gray'), plt.title('Mean Blur') plt.subplot(1, 3, 2), plt.imshow(gaussian_image, cmap='gray'), plt.title('Gaussian Blur') plt.subplot(1, 3, 3), plt.imshow(median_image, cmap='gray'), plt.title('Median Blur') plt.show() 边缘检测边缘检测用于提取图像中的轮廓,Canny 边缘检测是最常用的方法。
# 边缘检测用于检测图像中的边缘。常见的边缘检测算法有 Sobel算子、Scharr算子、Laplacian算子和Canny算子。 # Canny算子:通过多步操作检测图像中的边缘。 # 读取图像 image = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE) # Canny 边缘检测 # cv2.Canny() 函数用于对图像进行 Canny 边缘检测。第一个参数是输入图像,第二个参数是阈值1,第三个参数是阈值2。 # 阈值1 和阈值2 用于控制边缘检测的灵敏度,边缘检测结果取决于这两个阈值的选择。 edges = cv2.Canny(image, 100, 200) # 显示原图和边缘检测结果 plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1) # plt.subplot() 函数用于在当前图形窗口中创建一个子图布局。它接受三个整数参数,分别表示子图布局的行数、列数和当前子图的编号。 # (1, 2, 1) 表示将图形窗口划分为 1 行 2 列的子图布局,当前要操作的是第 1 个子图(从左到右、从上到下编号)。 plt.imshow(image, cmap='gray') # plt.imshow() 用于显示图像。image 是要显示的图像数组,通常是一个 numpy 数组。 # cmap='gray' 指定使用灰度颜色映射来显示图像,适用于单通道的灰度图像。 plt.title('Original Image') # 为当前子图设置标题,标题内容为 'Original Image',表明该子图显示的是原始图像。 plt.axis('off') # 隐藏当前子图的坐标轴,使图像显示更加简洁。 plt.subplot(1, 2, 2), plt.imshow(edges, cmap='gray'), plt.title('Canny Edges') plt.axis('off') plt.show() 特征点检测SIFT
medium /@deepanshut041/introduction-to-sift-scale-invariant-feature-transform-65d7f3a72d40
# SIFT特征点检测 # 读取图像 image = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE) # 初始化 SIFT 特征检测器 sift = cv2.SIFT_create() # 检测图像中的关键点和描述符 # sift.detectAndCompute() 是 SIFT 检测器对象的一个方法,用于同时检测图像中的关键点并计算这些关键点的描述子。 # 该方法接受两个参数: # 第一个参数是输入的图像(这里是之前读取的灰度图像 image), # 第二个参数是一个掩码图像,用于指定在哪些区域进行关键点检测,None 表示对整个图像进行检测。 # 该方法返回两个值: # keypoints 是一个包含检测到的关键点信息的列表,每个关键点是一个 cv2.KeyPoint 对象,包含关键点的位置、尺度、方向等信息; # descriptors 是一个 numpy 数组,包含每个关键点对应的描述子,描述子是一个用于表示关键点特征的向量,通常用于后续的特征匹配。 keypoints, descriptors = sift.detectAndCompute(image, None) # 绘制关键点 # cv2.drawKeypoints() 是 OpenCV 中用于在图像上绘制关键点的函数。 # 它接受四个参数: # 第一个参数是输入的图像(这里是原始的灰度图像 image), # 第二个参数是关键点列表(keypoints), # 第三个参数是输出图像,如果为 None 则表示在输入图像上直接绘制关键点; # 第四个参数 color 用于指定绘制关键点的颜色,这里 (0, 255, 0) 表示绿色。 # 该函数返回一个绘制了关键点的图像 sift_image。 image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, color=(0, 255, 0)) # 显示原图和绘制了关键点的图像 plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1), plt.imshow(image, cmap='gray'), plt.title('Original Image'), plt.axis('off') plt.subplot(1, 2, 2), plt.imshow(image_with_keypoints), plt.title('Image with Keypoints'), plt.axis('off') plt.show()ORB
# ORB特征检测 import cv2 import matplotlib.pyplot as plt # 读取图像并转换为灰度图 image = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE) # 初始化 ORB 检测器 orb = cv2.ORB_create() # 检测关键点和计算描述子 keypoints, descriptors = orb.detectAndCompute(image, None) # 在图像上绘制关键点 orb_image = cv2.drawKeypoints(image, keypoints, None, color=(0, 255, 0)) # 显示结果 plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1), plt.imshow(image, cmap='gray'), plt.title('Original Image'), plt.axis('off') plt.subplot(1, 2, 2), plt.imshow(orb_image), plt.title('Image with ORB Keypoints'), plt.axis('off') plt.show() Harris 角点检测 # Harris 角点检测 # Harris 角点检测是一种用于检测图像中角点的方法,角点是图像中两条边缘交汇的点。 import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图像 image = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE) # np.float32():将图像数据类型转换为 32 位浮点型。因为 cv2.cornerHarris() 函数要求输入的图像数据类型为浮点型,所以需要进行类型转换。 gray = np.float32(image) # OpenCV 提供了 cv2.cornerHarris() 函数用于进行 Harris 角点检测。 # gray:输入的灰度图像(已转换为浮点型)。 # 2:角点检测中使用的邻域大小,即每个像素周围考虑的邻域范围。这里表示使用 2x2 的邻域。 # 3:Sobel 算子的孔径大小,用于计算图像的梯度。 # 0.04:Harris 角点检测的自由参数,用于控制角点响应函数的计算,通常取值在 0.04 到 0.06 之间。 # 该函数返回一个与输入图像大小相同的数组 dst,数组中的每个元素表示对应像素的角点响应值。 dst = cv2.cornerHarris(gray, 2, 3, 0.04) # 对 dst 数组进行膨胀操作。膨胀操作可以扩大角点响应值的区域,使角点更加明显,方便后续的角点筛选。 dst = cv2.dilate(dst, None) # dst > 0.01 * dst.max():这是一个布尔数组,用于筛选出角点响应值大于 0.01 * dst.max() 的像素位置。 # dst.max() 表示 dst 数组中的最大值,0.01 * dst.max() 是一个阈值,只有角点响应值大于该阈值的像素才被认为是角点。 image[dst > 0.01 * dst.max()] = 255 # 显示结果原图像和 Harris 角点检测结果 plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1), plt.imshow(image, cmap='gray'), plt.title('Original Image'), plt.axis('off') plt.subplot(1, 2, 2), plt.imshow(dst, cmap='gray'), plt.title('Harris Corners'), plt.axis('off') plt.show()写一个简单的OpenCV脚本,提取两个图像的ORB特征并进行匹配
# 写一个简单的OpenCV脚本,提取两个图像的ORB特征并进行匹配。 import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图像 img1 = cv2.imread('ORB1.jpg',cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('ORB2.jpg',cv2.IMREAD_GRAYSCALE) # 创建ORB特征检测器,nfeatures=500 设定ORB检测的最大特征点数为500,数值越大,提取的特征点越多。 orb = cv2.ORB_create(nfeatures=500) # 检测特征点并计算描述符 # detectAndCompute() 方法同时检测特征点 (keypoints) 和计算它们的描述符 (descriptors)。 # kp1, des1 是 img1 的特征点和描述符,kp2, des2 是 img2 的特征点和描述符。 # keypoints 包含特征点的位置、大小、方向等信息,descriptors 是描述这些特征点的向量。 kp1, des1 = orb.detectAndCompute(img1, None) kp2, des2 = orb.detectAndCompute(img2, None) # 创建BF匹配器 # cv2.BFMatcher 创建一个暴力匹配器 (BFMatcher)。 # cv2.NORM_HAMMING 表示使用 汉明距离(适用于二进制特征描述符,如 ORB、BRIEF)。 # crossCheck=True 使匹配更加严格:只有当 A 的最佳匹配是 B,同时 B 的最佳匹配也是 A 时,它们才会被视为匹配。 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 匹配描述符,bf.match(des1, des2) 在两幅图像的特征描述符之间进行匹配,返回 matches(匹配点对列表)。 matches = bf.match(des1, des2) # 按距离排序 # sorted() 函数对所有匹配点对按照它们之间的距离进行排序。 # key=lambda x: x.distance 表示按照匹配点对的距离进行排序。 matches = sorted(matches, key=lambda x: x.distance) # 绘制匹配结果 # drawMatches() 方法绘制匹配结果。 # matches[:60] 表示只绘制前60个匹配点对。 # matchColor=(0, 255, 0) 表示匹配点对的颜色为绿色。 # singlePointColor=(0, 0, 255) 表示特征点的颜色为红色。 img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:60], None, matchColor=(0, 255, 0),singlePointColor=(0, 0, 255)) # 显示结果 plt.figure(figsize=(16, 8)) plt.axis('off') plt.imshow(img3) plt.show()
计算机视觉-OpenCV图像处理由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“计算机视觉-OpenCV图像处理”
上一篇
插槽slot
下一篇
段错误(核心已转储)