OpenCV图像处理与计算机视觉基础入门

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:OpenCV是图像处理和计算机视觉领域的强大工具,支持多种编程语言,提供了丰富的图像处理功能和滤波器。本入门课程致力于教授初学者如何使用OpenCV进行图像分析、几何变换、形态学操作和特征检测等基础任务,为深入学习人工智能和深度学习打下基础。课程内容包括图像的像素表示、色彩模型、矩阵操作以及OpenCV与深度学习框架的结合应用。 OpenCV图像处理入门

1. OpenCV简介和核心功能

OpenCV是一个开源的计算机视觉和机器学习软件库,它拥有超过2500个优化算法,这些算法可以用于各种视觉应用。OpenCV的核心功能包括图像处理、视频分析、特征检测、物体跟踪、绘图和GUI功能等。

1.1 OpenCV的历史与发展

OpenCV(Open Source Computer Vision Library)最初由英特尔公司推动,其目的是推动计算机视觉的研究和应用。经过多年的迭代,OpenCV已经发展成为一个功能强大的跨平台库,支持多种操作系统,包括Windows、Linux、Mac OS、Android和iOS。

1.2 主要特性与功能

OpenCV的主要特性包括:

  • 实时性能:OpenCV进行了大量优化,以确保在实时应用中提供高速处理。
  • 广泛的算法支持:从基本的图像处理到更高级的机器学习算法,OpenCV都有涵盖。
  • 跨平台:得益于其开源特性,OpenCV可在多种平台上运行。
  • 社区支持:拥有一个庞大且活跃的开发者社区,提供丰富的学习资源和工具支持。

作为本章的总结,我们了解到OpenCV是一个为计算机视觉任务提供了广泛支持的库,它不仅能够处理图像和视频,还能够应用于模式识别和机器学习等领域。在后续的章节中,我们将深入探索OpenCV的核心功能,并通过实例演示如何运用这些功能解决实际问题。

2. 图像操作:读取、显示、保存

2.1 图像的读取与处理

2.1.1 读取不同格式的图像文件

在进行图像处理之前,第一步通常是从存储介质中读取图像数据。OpenCV库支持读取多种图像格式,并且能够处理静态图片、视频帧和实时视频流。本章节将介绍如何使用OpenCV读取不同格式的图像文件,例如JPEG、PNG、BMP等。

首先,使用OpenCV的 cv2.imread() 函数读取图像,该函数的语法结构如下:

cv2.imread(filename[, flags])
  • filename 参数是图像文件的路径。
  • flags 参数用于指定读取方式,比如是否以彩色或灰度读取。

下面的代码演示了如何读取不同格式的图像文件:

import cv2

# 读取彩色图像
color_img = cv2.imread('path_to_image.jpg')

# 读取灰度图像
gray_img = cv2.imread('path_to_image.png', cv2.IMREAD_GRAYSCALE)

# 读取图像,不进行颜色转换
raw_img = cv2.imread('path_to_image.bmp', cv2.IMREAD_UNCHANGED)

# 显示图像
cv2.imshow('Color Image', color_img)
cv2.imshow('Gray Image', gray_img)
cv2.imshow('Raw Image', raw_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

2.1.2 图像数据类型和结构

读取图像后,我们需要了解图像的数据类型和结构。在OpenCV中,图像通常被表示为一个多维NumPy数组。这个数组的形状通常为 (高度, 宽度, 通道数) ,通道数为1表示灰度图,为3表示彩色图像(BGR顺序)。

为了更深入地理解图像的结构,我们可以使用 cv2.imread() 函数读取图像后,使用 type() 函数和 shape 属性来获取图像类型和尺寸信息:

# ...(上文代码继续)

# 获取图像类型和尺寸
color_img_type = type(color_img)
color_img_shape = color_img.shape

gray_img_type = type(gray_img)
gray_img_shape = gray_img.shape

print(f'Color Image type: {color_img_type}')
print(f'Color Image shape: {color_img_shape}')
print(f'Gray Image type: {gray_img_type}')
print(f'Gray Image shape: {gray_img_shape}')

执行上述代码将输出图像的类型和尺寸,帮助开发者对图像数据结构有一个初步的理解。

2.2 图像的显示技术

2.2.1 使用OpenCV显示图像

在图像处理的过程中,实时查看处理效果是非常重要的。OpenCV 提供了 cv2.imshow() 函数用于显示图像。用户可以通过此函数立即查看图像处理结果。

为了更好地理解如何使用 cv2.imshow() ,请看以下代码:

import cv2

# 读取图像
img = cv2.imread('path_to_image.jpg')

# 显示图像,窗口名为 'Image'
cv2.imshow('Image', img)

# 等待任意键盘按键
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

使用 cv2.waitKey() 函数可以暂停程序执行,并等待用户按键操作。参数为0表示无限期等待,直到用户按下任意键。 cv2.destroyAllWindows() 用于关闭所有OpenCV创建的窗口。

2.2.2 图像显示的高级设置

除了基础显示功能,OpenCV还支持高级图像显示选项。可以设置窗口的大小、位置、颜色以及窗口标题等。下面的代码展示了如何设置窗口标题和调整窗口大小:

import cv2

# 读取图像
img = cv2.imread('path_to_image.jpg')

# 设置窗口标题
cv2.setWindowTitle('Image', 'Sample Image')

# 调整窗口大小
cv2.resizeWindow('Image', 640, 480)

# 显示图像
cv2.imshow('Image', img)

# 等待任意键盘按键
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

通过 cv2.setWindowTitle() 和 cv2.resizeWindow() 函数,可以更加灵活地控制图像显示窗口的属性,满足不同场景下的显示需求。

2.3 图像的保存与格式转换

2.3.1 保存图像到不同格式

在图像处理完毕后,往往需要将结果保存为文件。OpenCV提供 cv2.imwrite() 函数来完成这个任务。该函数的语法结构如下:

cv2.imwrite(filename, img[, params])
  • filename 参数是保存图像的文件路径。
  • img 参数是要保存的图像数据。
  • params 是可选参数,用于控制压缩质量和编码。

下面演示了如何将图像保存为不同格式:

import cv2

# 读取图像
img = cv2.imread('path_to_image.jpg')

# 保存图像为JPEG格式
cv2.imwrite('path_to_save_jpeg.jpg', img)

# 保存图像为PNG格式
cv2.imwrite('path_to_save_png.png', img)

# 保存图像为BMP格式
cv2.imwrite('path_to_save_bmp.bmp', img)

在上述代码中,我们读取了一张图像,并将它分别保存为JPEG、PNG和BMP格式。不同格式提供了不同的压缩机制和颜色深度,用户可以根据需要选择合适的格式。

2.3.2 图像压缩与质量控制

当保存为JPEG格式时,可以对压缩率进行控制。这通过 cv2.imwrite() 函数中的 params 参数实现,例如:

# 保存图像为JPEG格式,并设置压缩质量
cv2.imwrite('path_to_save_jpeg_quality.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 80])

在该示例中,通过传递一个列表参数给 cv2.imwrite() 函数,其中指定了JPEG压缩质量为80。更高的质量值意味着图像具有更好的质量,但文件大小也会更大。

需要注意的是,图像压缩会引入损失,对于需要高质量保持的图像,应考虑使用无损格式如PNG。而当对文件大小有严格限制时,JPEG是一个不错的选择。开发者需要根据实际应用需求来平衡图像质量和文件大小。

通过控制图像的格式转换和压缩,可以有效地管理图像资源,并满足不同场景下的需求。这对于提升用户体验和减少存储空间占用都有极大的帮助。

3. 滤波器与图像预处理

3.1 滤波器的应用

3.1.1 线性与非线性滤波

滤波器是图像处理中的基础工具,用于去除噪声、平滑图像或增强边缘等。在OpenCV中,滤波操作可以根据其数学属性分为线性滤波和非线性滤波两大类。线性滤波通过与图像的邻域像素进行加权平均来实现,而非线性滤波则不依赖线性假设。

在实施线性滤波时,常用的算法包括均值滤波、高斯滤波等。均值滤波简单而有效,适用于去除图像中的随机噪声,但可能会使图像变得模糊。高斯滤波则利用高斯核对图像进行加权平均,可以更有效地保留图像边缘信息。

一个简单的均值滤波操作示例代码如下:

import cv2
import numpy as np

# 读取图像
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)

# 应用均值滤波器
blurred_image = cv2.blur(image, (3,3))

# 显示原图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Blurred Image', blurred_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这段代码中, cv2.blur 函数应用了大小为 3x3 的均值滤波器核。大小可以根据需要调整,但通常选择奇数大小的核以确保有一个中心像素。

3.1.2 高斯滤波和均值滤波

高斯滤波是一种具有旋转对称性的线性滤波技术,它通过卷积一个高斯核与图像来模糊图像。高斯核中的权重是根据高斯分布的公式计算的,其中 sigma 参数控制着核的平滑程度。

高斯滤波相较于均值滤波在边缘保留方面表现得更好,因为它不会像均值滤波那样对图像中的边缘和细节产生同样强烈的模糊效果。OpenCV通过 cv2.GaussianBlur 函数提供高斯滤波功能,下面是一个使用高斯滤波的示例:

# 应用高斯滤波器
gaussian_blurred_image = cv2.GaussianBlur(image, (3,3), 1)

# 显示高斯滤波后的图像
cv2.imshow('Gaussian Blurred Image', gaussian_blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这段代码中, cv2.GaussianBlur 函数的参数分别是源图像、核的尺寸 (3,3) 以及 sigmaX 参数,后者用于控制核在X方向上的高斯分布。

3.2 图像预处理技术

3.2.1 噪声去除和边缘保留

图像在采集和传输过程中常常受到各种噪声的干扰。常见的噪声类型包括高斯噪声、盐椒噪声等。预处理的一个重要任务是去除这些噪声,同时尽可能保留图像的重要特征,如边缘。

为了在去除噪声的同时保留边缘,可以使用多种高级滤波技术,如中值滤波和双边滤波。中值滤波对处理盐椒噪声特别有效,因为它是通过用邻域像素的中值替代中心像素来工作的。双边滤波则在降噪的同时保留边缘特征,通过在空域和值域上同时考虑邻域像素而实现。

中值滤波的示例代码如下:

# 应用中值滤波器
median_blurred_image = cv2.medianBlur(image, 5)

# 显示中值滤波后的图像
cv2.imshow('Median Blurred Image', median_blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这段代码中, cv2.medianBlur 函数将图像中的每个像素替换为其邻域的中值,其中核的大小设置为 5 。

3.2.2 图像的直方图均衡化

直方图均衡化是图像处理中一个常用的预处理技术,用于改善图像的对比度。该技术通过拉伸图像的直方图来覆盖整个可用的动态范围,从而增加整体图像的对比度。

直方图均衡化不仅提高了图像的视觉质量,还能够改善后续的图像分析和处理过程的性能。在OpenCV中,可以使用 cv2.equalizeHist 函数进行直方图均衡化:

# 转换图像到YCrCb色彩空间
img_ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)
y, cr, cb = cv2.split(img_ycrcb)

# 应用直方图均衡化到亮度通道
y_eq = cv2.equalizeHist(y)
img_eq = cv2.merge((y_eq, cr, cb))

# 转换图像回BGR色彩空间
img_eq = cv2.cvtColor(img_eq, cv2.COLOR_YCrCb2BGR)

# 显示原始图像和均衡化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Histogram Equalized Image', img_eq)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这段代码中,首先将图像从BGR色彩空间转换到YCrCb空间,然后只对亮度通道(Y)应用直方图均衡化。这是因为直方图均衡化只对亮度信息有效,而不会影响色彩通道。之后,将均衡化的图像重新转换回BGR色彩空间。

以上讨论和示例展示了滤波器和图像预处理技术的基本应用。滤波技术的选择取决于处理需求、噪声类型和图像的特性。通过合适的滤波处理,可以为后续的图像分析和识别工作打下坚实的基础。

4. 色彩空间转换与形态学操作

在图像处理的世界中,色彩空间转换和形态学操作是两项基本且至关重要的技术。它们分别从颜色理论和数学形态学的角度,为图像处理提供了强大的工具和方法。这一章节将详细介绍色彩空间转换的基本原理、图像的几何变换以及形态学操作的原理和应用。

4.1 色彩空间转换原理

色彩空间是描述颜色的一种方式,它是用来表示颜色的数学模型。在计算机视觉和图像处理领域,不同的色彩空间有着不同的应用背景和优势。例如,RGB色彩空间非常适合在显示器上显示图像,而HSV色彩空间则在颜色识别和分割上更胜一筹。

4.1.1 RGB与HSV色彩空间的转换

RGB色彩空间是基于红、绿、蓝三种颜色的组合,这三种颜色通过不同强度的组合能够生成其他所有颜色。而HSV色彩空间则代表色调(Hue)、饱和度(Saturation)、亮度(Value),它们更好地模拟了人类视觉对颜色的感知方式。

在OpenCV中,可以使用函数 cv2.cvtColor 来实现RGB与HSV色彩空间之间的转换。例如,将一个图像从BGR(因为OpenCV是按照BGR顺序读取和显示图像的)转换到HSV色彩空间的代码如下:

import cv2

# 读取图像
image_bgr = cv2.imread('path_to_image.jpg')

# 将BGR转换到HSV色彩空间
image_hsv = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2HSV)

# 显示结果图像
cv2.imshow('BGR Image', image_bgr)
cv2.imshow('HSV Image', image_hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中, cv2.imread 用于读取图像, cv2.cvtColor 用于色彩空间转换,最后使用 cv2.imshow 显示图像。色彩空间转换是图像处理中很常见的一个操作,经常被应用于颜色分割、皮肤检测等领域。

4.1.2 BGR到灰度图像的转换

灰度图像是一种只有亮度,没有颜色的图像,它通常用于简化图像处理任务。将BGR图像转换为灰度图像仅需要保留颜色强度信息,并去除颜色信息。OpenCV中可以使用 cv2.cvtColor 函数,并传入 cv2.COLOR_BGR2GRAY 参数来完成这个转换:

# 将BGR图像转换为灰度图像
gray_image = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2GRAY)

# 显示灰度图像
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

灰度图像处理是许多计算机视觉应用的基础,如边缘检测、光学字符识别(OCR)和面部识别等。

4.2 图像的几何变换

图像的几何变换指的是对图像的形状、大小和方向进行改变的操作。例如,图像旋转可以改变图像的方向,而图像平移则可以移动图像的位置。

4.2.1 仿射变换和透视变换

仿射变换包括平移、旋转、缩放等操作,其特点在于变换后图像的直线依然保持直线。透视变换则更为复杂,它能够改变图像的视角,使图像看起来像是从不同的角度拍摄的。在OpenCV中,仿射变换和透视变换都可以通过 cv2.warpAffine 和 cv2.getPerspectiveTransform 函数实现。

# 仿射变换示例
M_affine = cv2.getRotationMatrix2D((width/2, height/2), 45, 1.0)
result_affine = cv2.warpAffine(image_bgr, M_affine, (width, height))

# 透视变换示例
pts_src = np.float32([[0,0], [width,0], [width,height], [0,height]])
pts_dst = np.float32([[0,height/4], [width*3/4,height/4], [width*3/5,height*4/5], [0,height*3/5]])
M_perspective = cv2.getPerspectiveTransform(pts_src, pts_dst)
result_perspective = cv2.warpPerspective(image_bgr, M_perspective, (width, height))

# 显示仿射变换结果
cv2.imshow('Affine Transformed Image', result_affine)
cv2.imshow('Perspective Transformed Image', result_perspective)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们首先定义了仿射变换和透视变换的变换矩阵 M_affine 和 M_perspective ,然后使用 cv2.warpAffine 和 cv2.warpPerspective 函数应用这些变换。

4.2.2 图像旋转和平移的实现

图像旋转是通过旋转矩阵围绕某一点进行的,而图像平移是通过改变图像中每个像素点的位置实现的。在OpenCV中,这些操作都通过仿射变换实现,旋转矩阵和移动向量都是仿射变换矩阵的一部分。

# 图像旋转示例(绕点(x, y)旋转θ角度)
def rotate_image(image, angle, x, y):
    (h, w) = image.shape[:2]
    (cX, cY) = (x, y)
    M = cv2.getRotationMatrix2D((cX, cY), angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY
    return cv2.warpAffine(image, M, (nW, nH))

rotated_image = rotate_image(image_bgr, 45, image_bgr.shape[1] / 2, image_bgr.shape[0] / 2)
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.3 形态学操作

形态学操作主要基于形状的概念,通常用于简化图像的几何结构,如去除噪声、分割出独立的元素以及求取图像的凸壳等。它依赖于一个被称为结构元素的小图像,这个元素在图像上滑动来决定每个像素的值。

4.3.1 腐蚀与膨胀的基本原理

腐蚀是一种去除边缘的方法,它能够使物体缩小,消除细小的白噪声。而膨胀则正好相反,它可以填补物体中的空洞,连接相邻的物体。腐蚀和膨胀都可以通过 cv2.erode 和 cv2.dilate 函数实现。

# 腐蚀操作
kernel = np.ones((5,5), np.uint8)
eroded_image = cv2.erode(image_bgr, kernel, iterations = 1)

# 膨胀操作
dilated_image = cv2.dilate(image_bgr, kernel, iterations = 1)

# 显示结果
cv2.imshow('Eroded Image', eroded_image)
cv2.imshow('Dilated Image', dilated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,创建了一个5x5的核(结构元素),并应用了腐蚀和膨胀操作。 iterations 参数定义了操作重复的次数。

4.3.2 开运算、闭运算的应用

开运算和闭运算是腐蚀与膨胀的组合操作。开运算首先进行腐蚀操作,然后进行膨胀操作,主要用于移除小的对象。闭运算首先进行膨胀操作,然后进行腐蚀操作,主要用于填补对象内部的小孔。

# 开运算
opened_image = cv2.morphologyEx(image_bgr, cv2.MORPH_OPEN, kernel)

# 闭运算
closed_image = cv2.morphologyEx(image_bgr, cv2.MORPH_CLOSE, kernel)

# 显示结果
cv2.imshow('Opened Image', opened_image)
cv2.imshow('Closed Image', closed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过形态学操作,我们可以对图像中的物体进行形状上的调整,它在图像预处理、特征提取等领域中有着广泛的应用。

本章节的介绍至此,下一级章节将进一步探讨特征检测算法与OpenCV的进阶应用。

5. 特征检测算法与OpenCV进阶应用

5.1 特征检测算法

5.1.1 Harris角点检测算法

Harris角点检测是计算机视觉中一种常用的特征提取方法,它可以识别出图像中的角点特征。Harris算法通过计算图像窗口内的梯度变化来检测角点。

基本原理是: 1. 对图像应用高斯平滑,以减少噪声的影响。 2. 计算图像中每个像素点的梯度(x和y方向的梯度)。 3. 根据梯度计算每个点的Harris响应值。 4. 应用非极大值抑制来选取局部极大值作为角点。

示例代码如下:

import cv2
import numpy as np

# 读取图像
image = cv2.imread('example.jpg', 0)

# 使用Harris角点检测
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)

# 对角点进行膨胀操作以便于可视化
dst = cv2.dilate(dst, None)
image[dst > 0.01 * dst.max()] = [0, 0, 255]

# 显示结果
cv2.imshow('Harris Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.1.2 SIFT和SURF特征检测

尺度不变特征变换(SIFT)和加速稳健特征(SURF)是两种先进的特征检测算法,它们在图像的缩放、旋转甚至仿射变换下都表现出尺度和旋转不变性。

  • SIFT算法特点 :
  • 特征点检测和描述
  • 描述子对尺度和旋转具有不变性
  • 对光照变化有很好的鲁棒性
  • 可以检测出大量特征点,但计算复杂度较高

  • SURF算法特点 :

  • SIFT的快速变体,计算速度更快
  • 基于积分图像,使用Hessian矩阵的行列式作为特征点的度量
  • 同样具有尺度和旋转不变性

代码示例:

# 使用SIFT检测特征点
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(gray, None)

# 使用SURF检测特征点
surf = cv2.xfeatures2d.SURF_create()
keypoints_surf, descriptors_surf = surf.detectAndCompute(gray, None)

5.2 OpenCV与深度学习框架结合

5.2.1 深度学习在图像处理中的角色

深度学习已经在图像处理领域中占据重要地位,尤其是在图像分类、目标检测和图像分割等任务中。深度学习模型可以学习到复杂的数据特征,并且能够处理之前难以解决的复杂问题。

5.2.2 使用OpenCV进行深度学习模型部署

OpenCV支持导入深度学习模型(如Caffe、TensorFlow等),并允许在不同的硬件平台上进行推理。它提供了简单易用的API,使得开发者可以轻松地将深度学习模型集成到应用中。

代码示例:

# 加载预训练的深度学习模型
net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'model.caffemodel')

# 将图像转换为适合输入的格式
blob = cv2.dnn.blobFromImage(image, 1.0, (224, 224), (104, 117, 123))

# 设置模型的输入,并进行前向传播
net.setInput(blob)
out = net.forward()

# 处理输出结果

5.3 numpy在图像处理中的应用

5.3.1 numpy数组与图像数据的交互

numpy提供了强大的数组操作功能,可以非常方便地进行图像数据的处理和分析。在OpenCV中,图像通常以numpy数组的形式存储。

5.3.2 numpy在图像处理中的优化技巧

利用numpy的矩阵运算能力,可以高效地对图像进行各种操作,如图像的算术运算、颜色空间转换等。此外,使用numpy向量化操作代替循环可以显著提升程序的执行速度。

示例代码:

# 用numpy进行图像像素加法
image1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)

# 使用numpy的加法操作替代cv2.add
result = image1 + image2

# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.4 图像处理的编程基础

5.4.1 掌握OpenCV的Python编程基础

要有效地使用OpenCV进行图像处理,首先需要掌握Python编程基础以及OpenCV的基本操作。这包括了解如何使用OpenCV进行图像的读取、显示、保存、复制、裁剪等。

5.4.2 实践项目:构建一个图像处理流水线

一个典型的图像处理流水线可能包括读取图像、进行预处理(如滤波、直方图均衡化)、特征检测(如角点检测或特征描述)、以及最终的输出(保存处理后的图像或显示结果)。

代码示例:

# 简单的图像处理流水线

# 读取图像
image = cv2.imread('input.jpg')

# 预处理:高斯滤波去除噪声
blurred = cv2.GaussianBlur(image, (5, 5), 0)

# 特征检测:SIFT特征点检测
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(blurred, None)

# 显示特征点
cv2.drawKeypoints(image, keypoints, image, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# 保存处理后的图像
cv2.imwrite('output.jpg', image)

# 显示原图和处理后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Processed Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过上述章节内容,读者可以对特征检测算法有深入的理解,并且掌握使用OpenCV进行图像处理的基础知识和进阶技能。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:OpenCV是图像处理和计算机视觉领域的强大工具,支持多种编程语言,提供了丰富的图像处理功能和滤波器。本入门课程致力于教授初学者如何使用OpenCV进行图像分析、几何变换、形态学操作和特征检测等基础任务,为深入学习人工智能和深度学习打下基础。课程内容包括图像的像素表示、色彩模型、矩阵操作以及OpenCV与深度学习框架的结合应用。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

【OpenCV】OpenCV指南:图像处理基础及实例演示 OpenCV 是一个功能强大且易于使用的库,广泛应用于图像处理和计算机视觉领域。从读取和显示图像,到颜色空间转换、图像缩放、翻转、边缘检测、高斯模糊、形态学操作以及图像平滑和绘制,本文详细介绍了 OpenCV 的基础使用方法,附带了丰富的代码示例,帮助读者更直观地理解和应用。 1. 什么是OpenCV? OpenCV(Op... 阅读详情

相关推荐

开源计算机视觉库OpenCV详解

详细介绍开源计算机视觉库OpenCV。

dvlinker的技术专栏 9万+

【Python入门教程】OpenCV库简介

Opencv(Open Source Computer Vision Library)是一个基于开源发行的跨平台计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法,已成为计算机视觉领域最有力的研究工具。在这里我们要区分两个概念:图像处理和计算机视觉的区别:图像处理侧重于“处理”图像–如增强,还原,去噪,分割等等;而计算机视觉重点在于使用计算机来模拟人的视觉,因此模拟才是计算机视觉领域的最终目标。   OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Wi

Remote Sensing迷途小书童 2万+

Python与OpenCV图像处理及计算机视觉入门

本文是关于Adrian Rosebrock博士撰写的《Practical Python and OpenCV》第二版的读后感。书籍详细介绍了如何使用Python和OpenCV库进行图像处理和计算机视觉的基础知识。作者不仅提供了丰富的代码示例,而且强调了通过实践学习的重要性。书中还讨论了OpenCV 3.0的发布,这对于Python 3的支持意义重大,为计算机视觉和机器学习领域的学习者带来了便利。

weixin_35677363的博客 228

OpenCV基础知识

1.OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时。3.opencv重要性。

m0_73723097的博客 1万+

给STM32F103的7寸屏找个新UI:LVGL 8.2裸机移植保姆级教程(附避坑清单)

本文详细介绍了如何将LVGL 8.2裸机移植到STM32F103开发板,特别针对7寸大屏(800×480分辨率)进行优化配置。从环境准备、工程搭建到显示驱动移植、内存优化与性能调优,提供完整的解决方案和避坑清单,帮助开发者快速实现美观的用户界面。

weixin_29181861的博客 413

【ECCV 2024】动态范围直方图自注意力DHSA,即插即用!

直方图自注意力机制,将空间特征按强度分段并进行分组,然后在各个分组内或分组间应用自注意力,以选择性地关注具有动态范围的空间特征,并处理长距离内相似退化的像素。

qq_43303160的博客 1845

【图像处理基石】如何用OpenCV入门计算机视觉?

OpenCV是入门计算机视觉的“最佳跳板”——它让你不用一开始就陷入复杂的数学推导,而是通过“动手实践”建立对CV的直观理解。记住:学CV的核心是“先跑通,再深究”,先把上面的案例一个个实现,再慢慢补原理知识,你会发现入门CV其实没那么难。

专注:太空算力、AI infra、异构调度、大模型成本工程 1148

ArcGIS利用模型构建器批量导出nc文件中的不同波段数据

ArcGIS利用模型构建器批量导出nc文件中的不同波段数据

Yuanbaokk的博客 7254

OpenCV图像处理入门从零开始掌握计算机视觉基础

OpenCV是一个庞大而精妙的工具箱,本文所涉及的仅仅是其冰山一角。从理解像素到进行基本的几何变换,你已经迈出了从零开始掌握计算机视觉基础坚实的第一步。这条学习之路充满了挑战,但也洋溢着发现的乐趣。图像的色彩空间转换、滤波平滑、轮廓检测、直方图均衡化、模板匹配……还有无数激动人心的主题等待你去探索。记住,学习计算机视觉最好的方式就是动手实践。不要畏惧代码,多写、多试、多调试,在实践中发现问题并解决问题。

xiongchaosuper的专栏 321

DeepSeek揭秘:构建高效反洗钱智能监控系统的全流程与代码实例

在金融领域,反洗钱(AML)是一项至关重要的任务。随着金融交易的复杂性和规模不断增长,传统的手工监控方法已无法满足现代金融系统的需求。因此,开发一个智能监控系统来自动识别和报告可疑交易变得尤为重要。本文将详细介绍如何使用DeepSeek技术构建一个高效的反洗钱智能监控系统,并提供相关的代码实例。

理论都是虚的,代码才是王道。 884

英伟达 DGX Spark & Reachy Mini 入门教程(一)

英伟达在2026年CES上发布多款开放模型,包括Nemotron推理LLM、Isaac GR00T VLA和Cosmos世界模型,助力开发者构建个性化AI代理。文章详细介绍了如何通过DGXSpark和Reachy Mini机器人打造办公助手,涵盖材料准备(推理/视觉模型、文本转语音服务)、智能体构建(NeMo Agent Toolkit框架)、工具调用和路由策略实现。系统支持本地/云端部署,提供语音交互、视觉识别和动作执行功能,并保持完全开源可定制。最后给出运行演示的终端配置步骤和测试用例,鼓励开发者在此基

2506_90492529的博客 2713

OpenCV图像处理实战如何利用Python与OpenCV轻松入门计算机视觉

一个最简单的验证方法是读取并显示一张图片:使用“cv2.imread()”函数加载图像,然后通过“cv2.imshow()”函数将其显示在窗口中,最后用“cv2.waitKey(0)”等待用户按键后,用“cv2.destroyAllWindows()”关闭所有窗口。此外,图像的属性如尺寸(宽度和高度)和通道数(如彩色图像的BGR三通道)也可以通过数组的 shape 属性直接获得。OpenCV中的“cv2.findContours()”函数能够从二值图像(经过阈值处理或边缘检测后的图像)中提取物体的轮廓。

m0_67891092的博客 308

RK3576 PCIE接口调试:基于RTL8111HS的网卡驱动移植

检查项方法电源电压复位时序检查设备树 reset-gpios链路速率设备识别lspci -vvv驱动加载。

小灰灰的博客 736

OpenCV图像处理实战从入门到精通,轻松掌握计算机视觉核心技术

它提供了超过2500种优化算法,涵盖了从基本的图像处理到先进的机器学习应用的方方面面,是每一位致力于计算机视觉开发的工程师和研究者必须掌握的工具。对于边缘检测,Sobel算子和Laplacian算子可以初步勾勒出物体的轮廓,但真正被誉为“里程碑”的是Canny边缘检测算法,它通过非极大值抑制和双阈值检测等步骤,能够产生高质量、连接良好的边缘线,为后续的图像分析打下坚实基础。除了基于轮廓的方法,还有基于阈值的分割(如Otsu’s二值化)、基于色彩的分割(在HSV空间中)以及更复杂的如分水岭算法等。

yxb199100的博客 700

Python中的字典(Dictionary)学习

上一章节,我们学习了列表(List) 和 元组(tuple) 来表示有序集合。而我们在讲列表(list)的时候,我们用了列表(list) 来存储用户的姓名。那么如果我们为了方便联系这些童鞋,要把电话号码也添加进去,该怎么做呢?但是这样很不方便,我们把电话号码记录下来,就是为了有什么事能及时联系上这些童鞋。如果用列表来存储这些,列表越长,我们查找起来耗时就越长。

热情、奔放、快乐编程! 503

Qt Creator配置MSVC编译环境、调试环境

获取和安装:cdb.exe 在 Debugging tools for Windows 中,而现在已经不单独提供下载,只在Windows SDK 或者Windows Driver Kit里面包含 所以需要下载微软的调试工具,最少需要下载 Windows SDK。在windows上开发,一般使用Qt Creator自带mingw编译器,编译和调试都很方便,安装Qt时勾选后,自动配置完毕。但是有时候我们需要使用MSVC的编译器,这个时候我们没法直接使用,需要配置环境才能使用,以下是配置方案。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 6988

OpenCV从入门到精通图像处理与计算机视觉的完整指南

随着经验的积累,可以挑战更复杂的项目,如实时目标跟踪系统、自动驾驶中的车道线检测、或者基于AR的互动应用。阈值分割是一种简单有效的方法,而基于边缘的检测算法(如Canny算子)和查找轮廓的函数(`cv2.findContours()`)则能帮助我们识别出图像中物体的边界,这是进行物体识别和形状分析的关键步骤。从传统的基于特征的方法(如Haar级联分类器)到如今与深度学习紧密结合的方法(如YOLO、SSD模型的集成),OpenCV提供了相应的接口和工具,使得开发者能够构建强大的物体识别系统。

u013067749的博客 424

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【OpenCV从入门到精通】图像处理与计算机视觉实战指南

使用 `cv2.imread()` 函数可以读取图像,它支持多种格式(如JPEG、PNG、BMP等),并返回一个多维的NumPy数组,该数组代表了图像的像素矩阵。读取后的图像可以通过 `cv2.imshow()` 在一个窗口中显示出来,配合 `cv2.waitKey()` 来控制窗口的显示时长。此外,常见的几何变换,如缩放、平移、旋转和仿射变换,可以通过 `cv2.resize()`, `cv2.warpAffine()` 等函数实现,它们是图像配准、数据增强等应用的关键技术。

gao738508的博客 344

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OpenCV从入门到精通图像处理与计算机视觉实战指南

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列C函数和少量C++类构成,同时提供了Python、Java和MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。对于希望深入计算机视觉领域的开发者和研究者而言,OpenCV提供了一个强大而高效的工具库,涵盖了从基础的图像读写到高级的物体识别和3D重建等众多功能。

全球失控 595

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

《opencv3编程入门》之一:图像处理、计算机视觉与opencv

本文是我学习  毛星云  的《opencv3编程入门》一书的学习笔记。 1 图像处理          图像处理是用计算机对图像进行分析,以达到所需结果的技术,又称影像处理。它包括图像压缩,增强和复原,匹配、描述和识别三个部分。 2 计算机视觉          计算机视觉(computer vision)是让机器来“看”的学科属于图像处理的一个分支,具体说就是:使用摄影机和电脑代替人眼对

迷途中的前进 2399

OpenCV图像处理实战轻松入门计算机视觉,从零搭建你的第一个视觉应用

在掌握了这些基础知识后,你可以进一步探索更高级的主题,例如图像的特征提取与匹配(SIFT, ORB),模板匹配,轮廓检测,以及利用深度学习框架(如TensorFlow, PyTorch)结合OpenCV进行更复杂的图像分类、目标检测和图像分割等任务。持续的实践和项目驱动是学习的最佳方式,不断尝试用代码解决实际问题,你将在这个充满魅力的领域中获得长足的进步。OpenCV自带了许多预训练的级联分类器,我们可以直接使用它们来检测图像中的物体,其中最经典的就是人脸检测器。然后,在一个循环中,不断使用。

yr_lu的专栏 476

OpenCV图像处理实战从零入门到精通,掌握计算机视觉核心技术

例如,通过简单的数组切片即可完成图像的裁剪,而数组的运算则能实现亮度和对比度的调整。然后,将待识别图像的描述子与预先准备好的模板图像(或图像库)的描述子进行匹配,OpenCV提供了BFMatcher或FlannBasedMatcher等匹配器来完成此任务。这包括:视频分析(处理视频流、背景减除、运动跟踪)、摄像头标定与三维重建、机器学习与深度学习的集成(OpenCV的`dnn`模块支持直接加载TensorFlow、PyTorch等框架训练的模型进行推理),以及在嵌入式设备(如树莓派)上的部署和优化。

ea1120262413的博客 297

计算机视觉入门实战:从OpenCV图像处理到PyTorch深度学习模型

计算机视觉作为人工智能的核心分支,旨在让机器理解和处理视觉信息。其技术原理涵盖从传统图像处理到深度学习模型,通过特征提取与模式识别实现图像分类、目标检测等任务。在工程实践中,OpenCV作为基础图像处理库,提供了丰富的图像操作函数,而PyTorch等深度学习框架则通过卷积神经网络等模型实现复杂视觉理解。这些技术广泛应用于安防监控、自动驾驶、医疗影像分析等领域。本文聚焦OpenCV与PyTorch的整合应用,通过环境搭建、图像处理实战和MNIST手写数字识别案例,为初学者提供完整的计算机视觉学习路径,涵盖An

weixin_32296621的博客 314

探索OpenCV从图像处理到计算机视觉的实战入门指南

本文简要介绍了OpenCV从图像处理到计算机视觉的入门路径。从环境搭建、基础操作,到图像分割、特征检测,再到一个简单的人脸检测应用,这只是OpenCV强大功能的冰山一角。在掌握了这些基础知识后,可以继续探索更深入的领域,如相机标定与三维重建、光学字符识别(OCR)、目标跟踪、深度学习模型(如DNN模块)的集成与应用等。持续的实践和项目驱动学习是掌握OpenCV并最终成为计算机视觉工程师的关键。

KevinCheng98的博客 662
上一篇: CS144计算机网络项目实战
下一篇: DNSResolver: Objective-C中的域名解析工具
来自日本的亮仔
博客等级 码龄8年 2724粉丝 3430原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值