如何入门图像处理:OpenCV 库之旅

作者:禅与计算机程序设计艺术

1.简介

在图像处理领域,OpenCV(Open Source Computer Vision Library)是一个开源跨平台计算机视觉库。它主要用于图像处理、机器视觉等应用。由于其强大的功能和广泛的应用,在机器学习、数据分析、自动驾驶、图像检索、运动跟踪、视频分析等多个领域都有着广泛的应用。因此,掌握 OpenCV 是一项必备技能。本文将以简短的形式,介绍如何入门图像处理和利用 OpenCV 进行图像处理。

2.实验环境准备

1) 硬件:笔记本电脑(Windows/Mac OS); 2) 软件: a) IDE:Visual Studio Code (vscode)/PyCharm Professional Edition(需付费); b) Python:Anaconda 3+(含 NumPy 和 Matplotlib 包)/Python 3.x (无需额外安装库)。

3.课程大纲

1) OpenCV 的简介及下载安装; 2) 载入图片并显示; 3) 图像的基本操作; 4) 颜色空间转换与通道分离; 5) 图像滤波与边缘检测; 6) 形态学操作与轮廓提取; 7) 模板匹配; 8) 深度学习与目标检测算法介绍; 9) 总结及建议。

  1. OpenCV 的简介及下载安装 OpenCV(Open Source Computer Vision Library)是一个开源跨平台计算机视觉库。它主要用于图像处理、机器视istics等应用。对于初级图像处理任务,可以使用 OpenCV 提供的各种函数接口。下面,我们简单介绍一下 OpenCV,并从官方网站下载安装。

OpenCV 的官方网站:https://opencv.org/

OpenCV 下载地址:https://github.com/opencv/opencv/releases

安装教程:https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html

  1. 载入图片并显示 首先,导入 cv2 库并创建一个窗口。然后读取图片,通过 imread 函数加载图片,参数指定图片路径或文件名,第二个参数指定读入模式。第三个参数表示图片是否透明。最后,调用 imshow 函数在窗口中显示图片。
import cv2 

cv2.namedWindow('image') # 创建一个窗口

cv2.imshow("image", img) # 在窗口显示图片

cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows() # 销毁所有窗口
  1. 图像的基本操作 OpenCV 中,图像可以理解成多维数组,图像中每个像素点的值就是矩阵中的元素值。你可以通过对矩阵做一些基本的操作,比如取反、缩放、旋转、翻转、裁剪等等。这里,我们介绍几个常用的图像基本操作。

resize() 方法可以调整图像大小:

img = cv2.resize(img,(int(w/2), int(h/2))) # 调整图片尺寸为原始大小的一半

rotate() 方法可以旋转图像:

rows, cols, chnals = img.shape 
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 90, 1)
dst = cv2.warpAffine(img, M, (cols, rows))

cvtColor() 方法可以转换图像的色彩空间:

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # BGR 转灰度图

blur() 方法可以对图像进行模糊化:

kernel = np.ones((5,5),np.float32)/25
blurred_img = cv2.filter2D(img,-1,kernel) # 对原图像做模糊化
  1. 颜色空间转换与通道分离 前面介绍了图像的基本操作,包括调整大小、旋转、色彩空间转换、模糊化等。OpenCV 中还有很多图像处理操作,这些都是通过修改矩阵的元素实现的。但是,有的情况下,我们会遇到不能直接操作矩阵的情况。比如,我们想在图片上画出一个圆,我们就可以使用 cv2.circle() 函数。但是,该函数需要知道圆心坐标和半径,而这些信息在矩阵中并没有体现出来。所以,为了能够更直观地对图片进行处理,我们需要了解颜色空间和通道的概念。

颜色空间:不同颜色系统或设备对像素点的表示方式不同,导致彩色图像不能直观地呈现其物理意义,而计算机中常用的RGB空间并不能完整描述颜色差异,因此需要定义一种新的颜色空间,如YUV、HSV等。

通道:即图像中的每个像素点由几个分量组成,不同的通道用来表现不同信息。比如RGB空间中的R、G、B三种颜色分量表征的是红绿蓝三个颜色的强度,而L、U、V三种颜色分量表征的是亮度、色调、饱和度。通常,RGB空间中的像素值是连续的,而其他空间中的像素值是离散的。

OpenCV 中提供了 cvtColor() 函数可以转换图像的色彩空间和通道分离。下面,我们用 cvtColor() 将图片从 BGR 色彩空间转换为 HSV 色彩空间,并显示它的 V 分量。

hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 从 BGR 色彩空间转换为 HSV 色彩空间
v_channel = hsv_img[:, :, 2] # 获取 HSV 空间的 V 分量

cv2.imshow('V channel', v_channel) # 显示 V 分量
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.cvtColor() 函数的第二个参数用于指定源图像的色彩空间和目标图像的色彩空间,后面的两个数字表示源图像的通道数和目标图像的通道数。如果只有一个参数,则默认为 RGB 色彩空间。

通道分离:OpenCV 中有 cvtColor() 可以将图像从一种颜色空间转换为另一种颜色空间,但不能直接用于图像的通道分离。这种情况下,我们只能借助 numpy 库中的 reshape() 函数来完成通道分离。reshape() 函数可以改变矩阵的形状,将多维数组转换为二维数组。

下面,我们将 V 分量从 HSV 色彩空间中分离出来,并显示其原始和分离后的图像。

v_original = img[:,:,2].copy() # 获取原图的 V 通道
v_hsv = hsv_img[:,:,2].copy() # 获取 HSV 色彩空间的 V 通道

v_original = np.expand_dims(v_original, axis=-1) # 扩展维度使得通道数为 3
v_hsv = np.expand_dims(v_hsv, axis=-1) # 扩展维度使得通道数为 3

v_decomposed = np.concatenate([v_hsv, v_original], axis=2) # 拼接 HSV 和原图的 V 分量

v_hsv_only = v_decomposed[:,:,:1] # 只保留 HSV 中的 V 分量
v_original_only = v_decomposed[:,:,1:] # 只保留原图中的 V 分量

cv2.imshow('Original image only V', v_original_only) # 显示原图的 V 分量
cv2.imshow('HSV only V', v_hsv_only) # 显示 HSV 的 V 分量
cv2.waitKey(0)
cv2.destroyAllWindows()

通过以上例子,我们可以看到,图像中的颜色不仅仅由 R、G、B 三个通道决定,还可以通过 V、H、S 分量进行编码。同时,通过通道分离,我们可以将原图中的某些通道和 HSV 中的某些通道区分开来,提高图像处理的效率。

  1. 图像滤波与边缘检测 图像的滤波是图像处理中的一种重要操作。通过滤波器对图像进行平滑、模糊等操作,可以消除噪声、去除孤立点,使图像变得清晰、平滑。OpenCV 为我们提供了各种滤波器,让我们可以快速实现各种效果。

下面,我们用均值滤波器对原图进行模糊化,并显示结果。

blur_img = cv2.blur(img,(5,5)) # 用均值滤波器对原图进行模糊化

cv2.imshow('Blur image', blur_img) # 显示模糊化后的图片
cv2.waitKey(0)
cv2.destroyAllWindows()

边缘检测:在图像中,边缘往往代表着图像的变化方向或者结构信息,是图像分析和计算机视觉中十分重要的对象。OpenCV 提供了几种边缘检测的方法,如 Sobel 滤波器、Canny 边缘检测算法、霍夫梯度法等。

下面,我们使用 Canny 边缘检测方法进行边缘检测,并显示结果。

edges = cv2.Canny(img,100,200) # 使用 Canny 边缘检测方法

cv2.imshow('Edges detected', edges) # 显示检测出的边缘
cv2.waitKey(0)
cv2.destroyAllWindows()

除了图像滤波与边缘检测,OpenCV 中还有图像形态学操作、模板匹配、深度学习与目标检测等算法,这些算法的作用各不相同,但它们都可以帮助我们解决不同图像处理的问题。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/133504707