手记

使用OpenCV和Python轻松进行图像处理:一步一步教你学

图像处理是现代领域,如人工智能、计算机视觉和机器人技术中的一个重要环节。OpenCV 是一个强大的开源库,让开发人员能够轻松地处理复杂的图像任务。本博客将带你使用 Python 学习图像处理的基本技能,从读取和显示图像、转换颜色空间和调整图像大小,到更高级的任务如边缘检测、轮廓检测和阈值处理,本博客都将一一涵盖。通过实际操作示例,你将学会轻松地操作和增强图像。

目录
  • 1. OpenCV简介
  • 2. 读取和显示图片
  • 3. 转换颜色空间
  • 4. 调整图片大小
  • 5. 旋转图片
  • 6. 模糊图片
  • 7. 使用Canny算法检测边缘
  • 8. 绘制形状并添加文字
  • 9. 阈值处理
  • 10. 检测轮廓
  • 结论
1. OpenCV简介

OpenCV 是一个广泛使用的开源计算机视觉库,让开发人员能够轻松地处理图像和视频流。它是诸如图像识别、滤波、边缘检测等许多任务的首选工具。此外,OpenCV 还支持跨平台,更适合大规模的AI和机器学习应用。

1.1 安装OpenCV教程

在我们开始之前,请确认已经安装好OpenCV。你可以使用pip轻松安装它。

运行此命令以安装OpenCV库:
pip install opencv-python
2. 阅读和显示图片

如果你想开始图像处理,你首先需要先加载再显示一张图片。

2.1 代码示例如下:
    # 从文件里读取图片  
    image = cv2.imread('image.jpg')  
    # 在窗口里显示图片  
    cv2.imshow('Image', image)  
    # 等待按键后关闭窗口  
    cv2.waitKey(0)  
    cv2.destroyAllWindows()

查看和显示图片

2.2 解释如下:
  • **cv2.imread()**:从指定文件中读取图像,返回一个表示图像的矩阵。
  • **cv2.imshow()**:在窗口中显示图像。第一个参数是窗口名称,第二个参数是图像矩阵。
  • **cv2.waitKey(0)**:这个函数会无限期等待用户按键,直到用户按下按键才会关闭窗口。
  • **cv2.destroyAllWindows()**:确保所有窗口在用户退出程序时都能正确关闭。
3. 将颜色空间转换

OpenCV 使用 BGR 格式(蓝、绿、红)加载图像。然而,其他颜色空间,如灰度,也很有用。在图像处理过程中,在这些颜色空间之间转换是最常见的操作之一。

3.1 代码示例:将图片转为灰度
    # 加载图片,
    image = cv2.imread('image.jpg')  
    # 将图像转换为灰度,
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  
    # 保存为灰度图像,
    cv2.imwrite('gray_image.jpg', gray_image)

把图片转成黑白

3.2 解释一下:
  • **cv2.cvtColor()**:将图像从一种颜色格式转换为另一种颜色格式。例如,从BGR转换成灰度。在这里,我们将图像从BGR转换成灰度。
4. 调整图片大小

有时,为了存储或标准化机器学习的模型尺寸,需要调整图像大小。

4.1 示例代码:调整图片大小
    # 读取图像  
    image = cv2.imread('image.jpg')  
    # 调整图像大小为 300x200  
    resized_image = cv2.resize(image, (300, 200))  
    # 保存调整后的图像到文件  
    cv2.imwrite('resized_image.jpg', resized_image)

调整图片大小

4.2 解释如下:
  • **cv2.resize()**:将输入图像缩放为指定的宽度和高度。在这里,图像变为300x200px。
5. 如何旋转图像

旋转是图像操作中的另一个关键方面,特别是在如物体检测和图像对准等任务中。

5.1 代码示例:把图像转90度
    # 加载图片.
    image = cv2.imread('image.jpg')  
    # 获取图片的高度和宽度.
    (h, w) = image.shape[:2]  
    # 定义图片的中心.
    center = (w // 2, h // 2)  
    # 旋转矩阵公式.
    matrix = cv2.getRotationMatrix2D(center, 90, 1.0)  
    # 旋转.
    rotated_image = cv2.warpAffine(image, matrix, (w, h))  
    # 保存旋转后的图片.
    cv2.imwrite('rotated_image.jpg', rotated_image)

旋转图片

5.2 解释说明:
  • **cv2.getRotationMatrix2D()**:创建一个用于描述旋转的变换矩阵。它根据中心点、旋转角度(以度为单位)和缩放比例。
  • **cv2.warpAffine()**:根据变换矩阵旋转图像。
  1. 把一张图片模糊掉

降噪、目标检测和特征抽取都是模糊技术的重要应用。

6.1 代码示例:应用高斯模糊效果
    # 读取图像  
    image = cv2.imread('image.jpg')  
    # 应用高斯滤波  
    blurred_image = cv2.GaussianBlur(image, (15, 15), 0)  
    # 保存处理后的图像  
    cv2.imwrite('blurred_image.jpg', blurred_image)

应用高斯模糊效果

6.2 解释如下:
  • **cv2.GaussianBlur()**:使用高斯滤波模糊图像。第二个参数是(kernel)大小,第三个参数是标准偏差。
7 坎尼算法的边缘检测

边缘检测是许多计算机视觉应用中的一个关键功能,例如目标检测和识别。OpenCV 提供了 "Canny" 边缘检测算法。

7.1 代码示例:使用 Canny 算法识别边缘
    # 读取图像  
    image = cv2.imread('image.jpg')  
    # 转换为灰度图  
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  
    # 使用Canny边缘检测器  
    edges = cv2.Canny(gray_image, 100, 200)  
    # 保存边缘图  
    cv2.imwrite('edges.jpg', edges)

使用Canny算法来检测边缘

7.2 解释一下:
  • **cv2.Canny()**:进行Canny边缘检测,检测输入图像的边缘。这两个参数分别定义了边缘检测的下限和上限阈值。
8 绘制形状和添加文本

有时你可能想在图片上画图形或加文字来做标注。

8.1 代码示例:画一个矩形并在其中添加文本
    # 加载图像  
    image = cv2.imread('image.jpg')  
    # 绘制一个矩形  
    cv2.rectangle(image, (50, 50), (200, 200), (255, 0, 0), 3)  
    # 在图像上添加文本  
    cv2.putText(image, 'OpenCV', (60, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)  
    # 保存结果图像  
    cv2.imwrite('output_image.jpg', image)

画一个矩形并写上文字

8.2 解释一下:
  • **cv2.rectangle()**:画一个矩形。你需要提供矩形的左上角和右下角点、颜色值和厚度。
  • **cv2.putText()**:在图片上加上文字,指定字体、字体大小、文本位置和颜色值。
9. 阈值设定

阈值化是一种将图像二值化的方法。它常用于图像分割中,我们通常希望从背景中分离目标。

9.1 代码示例:应用二值化阈值处理:
    # 读取图像  
    image = cv2.imread('image.jpg', 0)  
    # 应用阈值  
    _, thresh_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)  
    # 保存处理后的图像  
    cv2.imwrite('threshold_image.jpg', thresh_image)

进行二值化阈值处理

9.2 解释如下:
  • **cv2.threshold()** 是根据阈值将图像转换为二值图像的函数。
10. 轮廓识别:

轮廓表示图像中物体的边缘。这项技术常用于边缘检测和形状分析中。

10.1 代码示例:检测轮廓并绘制出来
    # 加载图像  
    image = cv2.imread('image.jpg')  
    # 将图像转换成灰度  
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  
    # 检测图像边缘  
    edges = cv2.Canny(gray_image, 100, 200)  
    # 查找轮廓  
    contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  
    # 在原始图像上绘制轮廓  
    cv2.drawContours(image, contours, -1, (0, 255, 0), 2)  
    # 保存带有轮廓的图像输出  
    cv2.imwrite('contours_image.jpg', image)

检测并绘制轮廓

10.2 让我们解释一下
  • **cv2.findContours()**:在二值图像中查找轮廓。
  • **cv2.drawContours()**:在原图上画出轮廓。
结尾

OpenCV 是一个极其多功能的库,提供了众多用于图像处理的工具。这些工具从简单的图像缩放和旋转,到较为复杂的边缘识别和轮廓分析。无论是开发AI模型还是探索计算机视觉,OpenCV 都应该是你处理和分析图像时的主要工具。

0人推荐
随时随地看视频
慕课网APP