问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

OpenCV入门教程:图像处理基础及实例演示

创作时间:
作者:
@小白创作中心

OpenCV入门教程:图像处理基础及实例演示

引用
CSDN
1.
https://m.blog.csdn.net/qq_35485206/article/details/143137290

OpenCV是一个功能强大且易于使用的开源计算机视觉库,广泛应用于图像处理和计算机视觉领域。本文将详细介绍OpenCV的基础使用方法,包括图像读取与显示、颜色空间转换、图像缩放、边缘检测、高斯模糊、形态学操作以及图像绘制等核心功能,并通过丰富的代码示例帮助读者快速掌握这些基础知识。

1. 什么是OpenCV?

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,由Intel在1999年开发,并于2000年推出。它可以处理图像和视频中的许多常见任务,如:

  • 图像处理(滤波、边缘检测等)
  • 视频处理(实时视频处理等)
  • 物体检测和识别(人脸识别、物体跟踪等)
  • 机器学习(支持向量机、神经网络等)

目前,OpenCV支持C++、Python、Java和MATLAB等多种编程语言,并可在多个平台上运行,如Windows、Linux、macOS和Android。

2. 安装OpenCV

在安装OpenCV之前,需要确保已经安装了Python。可以通过pip命令来安装OpenCV:

pip install opencv-python
pip install opencv-python-headless  # 不需要绘图界面的版本

3. 基本操作

3.1 导入库

首先需要导入OpenCV库和numpy库:

import cv2
import numpy as np

3.2 读取和显示图像

通过cv2.imread()读取图像,使用cv2.imshow()显示图像,并通过cv2.waitKey(0)保持窗口直到按下键盘任意键关闭。

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 显示图像
cv2.imshow('Image', image)
# 等待按键事件并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

3.3 保存图像

可以使用cv2.imwrite()来保存处理后的图像。

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 保存图像
cv2.imwrite('path_to_save_image.jpg', image)
# 显示保存信息
print("Image saved as path_to_save_image.jpg")

4. 图像处理基础

4.1 转换颜色空间

OpenCV提供了丰富的颜色空间转换功能,如RGB转换为灰度图像。

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 转为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

其他常见的颜色空间转换包括:

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# BGR到HSV
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow('HSV Image', hsv_image)
# BGR到LAB
lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
cv2.imshow('LAB Image', lab_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.2 图像缩放

可以使用cv2.resize()来调整图像的尺寸。

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 缩放图像到指定尺寸
resized_image = cv2.resize(image, (400, 400))
cv2.imshow('Resized Image', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 按比例缩放图像
height, width = image.shape[:2]
resized_image = cv2.resize(image, (int(width * 0.5), int(height * 0.5)))
cv2.imshow('Resized Image', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.3 图像翻转

可以使用cv2.flip()来翻转图像。

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 水平翻转
flipped_image = cv2.flip(image, 1)
cv2.imshow('Flipped Image', flipped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.4 边缘检测

Canny边缘检测是边缘检测的有效方法。

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# Canny边缘检测
edges = cv2.Canny(image, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.5 高斯模糊

使用cv2.GaussianBlur()来应用高斯模糊。

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 高斯模糊
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.6 形态学操作

常用的形态学操作包括腐蚀和膨胀。

import cv2
import numpy as np

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 创建一个5x5的核心
kernel = np.ones((5, 5), np.uint8)
# 腐蚀操作
erosion = cv2.erode(image, kernel, iterations=1)
cv2.imshow('Erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 膨胀操作
dilation = cv2.dilate(image, kernel, iterations=1)
cv2.imshow('Dilation', dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()

此外,还有更多的形态学操作,如开运算、闭运算等:

import cv2
import numpy as np

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 创建一个5x5的核心
kernel = np.ones((5, 5), np.uint8)
# 开运算(先腐蚀后膨胀)
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
cv2.imshow('Opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 闭运算(先膨胀后腐蚀)
closing = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
cv2.imshow('Closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.7 图像平滑

图像平滑是为了减少噪声和细节,可以使用多种方法如均值滤波、中值滤波和双边滤波。

均值滤波

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 均值滤波
blurred_image = cv2.blur(image, (5, 5))
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

中值滤波

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 中值滤波
median_blurred_image = cv2.medianBlur(image, 5)
cv2.imshow('Median Blurred Image', median_blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

双边滤波

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 双边滤波
bilateral_blurred_image = cv2.bilateralFilter(image, 9, 75, 75)
cv2.imshow('Bilateral Blurred Image', bilateral_blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.8 直方图均衡化

直方图均衡化有助于增加图像的对比度。

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 将图像转换为灰度
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 直方图均衡化
equalized_image = cv2.equalizeHist(gray_image)
cv2.imshow('Equalized Image', equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5. 图像中的基本绘制操作

OpenCV提供了一些基本绘制函数,可以绘制线条、矩形、圆形、多边形和文本。

5.1 绘制线条

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 绘制从点(0, 0)到点(511, 511)的蓝色线条,线条粗细为5
image_with_line = cv2.line(image.copy(), (0, 0), (511, 511), (255, 0, 0), 5)
cv2.imshow('Line', image_with_line)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.2 绘制矩形

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 绘制左上角(384, 0)到右下角(510, 128)的绿色矩形,线条粗细为3
image_with_rectangle = cv2.rectangle(image.copy(), (384, 0), (510, 128), (0, 255, 0), 3)
cv2.imshow('Rectangle', image_with_rectangle)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.3 绘制圆形

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 绘制中心为(447, 63)半径为63的红色圆形,填充该圆
image_with_circle = cv2.circle(image.copy(), (447, 63), 63, (0, 0, 255), -1)
cv2.imshow('Circle', image_with_circle)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.4 绘制多边形

import cv2
import numpy as np

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 定义多边形的顶点
points = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
points = points.reshape((-1, 1, 2))
# 绘制多边形
image_with_polygon = cv2.polylines(image.copy(), [points], True, (0, 255, 255))
cv2.imshow('Polygon', image_with_polygon)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.5 绘制文本

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')
# 绘制文本
image_with_text = cv2.putText(image.copy(), 'OpenCV', (10, 500), cv2.FONT_HERSHEY_SIMPLEX, 4, (255, 255, 255), 2, cv2.LINE_AA)
cv2.imshow('Text', image_with_text)
cv2.waitKey(0)
cv2.destroyAllWindows()

6. 实例项目:边缘检测与形态学操作结合

一个典型的应用案例将边缘检测与形态学操作结合起来进行基本的图像处理。

import cv2
import numpy as np

# 读取图像
image = cv2.imread('path_to_image.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用高斯模糊
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
# 应用Canny边缘检测
edges = cv2.Canny(blurred_image, 50, 150)
# 定义形态学核心
kernel = np.ones((5, 5), np.uint8)
# 应用膨胀操作以增强边缘
dilated_edges = cv2.dilate(edges, kernel, iterations=1)
# 显示最终结果
cv2.imshow('Original Image', image)
cv2.imshow('Edges', edges)
cv2.imshow('Dilated Edges', dilated_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

7. 总结

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号