从零搭建 OpenCV 项目(新手向)--第一天初识OpenCV与图像基础

发布于:2025-07-24 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

一、OpenCV 简介

  1.OpenCV-Python

二、环境安装

1. 安装命令(推荐使用 pip)

2. 验证安装

三、图像表示

四、图像读取与保存

1.图像在OpenCV中的表示形式

2.图像属性和操作

3.像素值的含义

4.相关操作 

4.1 图像读取

4.2 图像显示

4.3 图像保存

五、基本图像操作

1. 获取图像属性

2. 图像裁剪(切片)

3. 图像缩放

4. 图像翻转

5. 图像旋转(90度)

6. 创建可缩放窗口

7. 显示图像与等待用户输入

 8. 释放资源

9. 完整示例代码


一、OpenCV 简介

OpenCV(Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习库,支持多种语言(C++、Python、Java等)。

  • 提供图像和视频处理的丰富工具

  • 可实现如图像读取、处理、特征检测、目标跟踪、深度学习推理等任务

  • 跨平台,常用于自动驾驶、人脸识别、增强现实、图像分类等领域

 OpenCV的优势

- **开源免费:**完全开源,可以自由使用,降低开发成本和技术门槛。

- **多语言支持:**除C++原生接口外,还支持Java、Python等编程语言。

- **跨平台:**支持多种操作系统,Windows、Linux、ios、Android等,方便开发和部署。

- **丰富API:**完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。

  1.OpenCV-Python

OpenCV-Python是原始OpenCV C++实现的Python包装器。它结合了 OpenCV C++ API 的高性能与 Python 语言的易用性和简洁性。通过 OpenCV-Python,开发者可以轻松地进行图像处理、计算机视觉任务以及机器学习应用。

与C / C++等语言相比,Python速度较慢。Python可以使用C / C++扩展,这使我们可以在C / C++中编写计算密集型代码,并创建可用作Python模块的Python包装器。两个好处:首先,代码与原始C / C++代码一样快(因为它是在后台工作的实际C++代码),其次,在Python中编写代码比使用C / C++更容易。

OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。

二、环境安装

1. 安装命令(推荐使用 pip)

pip install opencv-python

若需要支持图像显示、视频编解码等完整功能(包括GUI),建议安装如下:

pip install opencv-python opencv-contrib-python

2. 验证安装

import cv2 print(cv2.__version__)

三、图像表示

像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不同,每个像素可以用不同的二进制数表示。

计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息,我们平常接触的图像都是8位数图像。opencv中常用的是8位图像,大多数彩色和灰度图像使用8位表示每个通道的像素值,范围从0到255,其中0,代表最黑,1,表示最白。

日常生活中常见的图像是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的,几乎所有颜色都可以通过这三种颜色按照不同比例调配而成。在计算机中,RGB三种颜色被称为RGB三通道,每个通道的取值都是0-255,根据这三个通道存储的像素值,来对应不同的颜色。

OpenCV 图像 = Numpy 数组(矩阵)

  • 读取的图像本质是一个 NumPy 的 多维数组

  • 彩色图像为三维数组:(高度, 宽度, 通道数),通道顺序为 BGR(不是RGB)

  • 灰度图像为二维数组:(高度, 宽度)

import cv2

img = cv2.imread("example.jpg")   # 默认读取为BGR
gray = cv2.imread("example.jpg", cv2.IMREAD_GRAYSCALE)
print(img.shape)     # 例如 (480, 640, 3)
print(gray.shape)    # 例如 (480, 640)
)

四、图像读取与保存

1.图像在OpenCV中的表示形式

在OpenCV中,图像以NumPy数组的形式存储和处理。数组的维度和数据类型取决于图像的类型(彩色或灰度)以及像素值的范围。

彩色图像 彩色图像通常表示为三维数组,形状为(height, width, channels)。默认情况下,OpenCV使用BGR顺序存储通道,即蓝、绿、红。例如,一个形状为(480, 640, 3)的数组表示一个高480像素、宽640像素的彩色图像,包含3个通道。

灰度图像 灰度图像表示为二维数组,形状为(height, width)。每个像素的值代表亮度,范围从0(黑色)到255(白色)。

2.图像属性和操作

形状(Shape) 通过img.shape可以获取图像的尺寸信息:

  • 彩色图像返回(height, width, channels)
  • 灰度图像返回(height, width)

数据类型(dtype) 图像的数据类型决定了像素值的范围。常见的是uint8(0到255),适用于大多数标准图像。其他类型如float32用于高动态范围(HDR)图像。

像素访问 可以通过索引直接访问或修改像素值:

  • 灰度图像:value = img[y, x]
  • 彩色图像:b, g, r = img[y, x](BGR顺序)。

3.像素值的含义

灰度图像 每个像素值表示亮度:

  • 0:纯黑色。
  • 255:纯白色。
  • 中间值表示不同深浅的灰色。

彩色图像 每个像素由三个分量(B、G、R)组成,每个分量的值在0到255之间:

  • [0, 0, 0]:纯黑色。
  • [255, 255, 255]:纯白色。
  • 其他组合表示不同颜色。

示例代码

import cv2
import numpy as np

# 读取彩色图像
img_color = cv2.imread('color_image.jpg')
print(f"彩色图像形状: {img_color.shape}")  # 输出 (height, width, 3)

# 读取灰度图像
img_gray = cv2.imread('gray_image.jpg', cv2.IMREAD_GRAYSCALE)
print(f"灰度图像形状: {img_gray.shape}")  # 输出 (height, width)

# 修改像素值
img_color[100, 200] = [255, 0, 0]  # 将(100, 200)处的像素设为蓝色
img_gray[50, 100] = 128  # 将(50, 100)处的像素设为中灰色

注意事项

  1. OpenCV默认使用BGR顺序,而其他库(如Matplotlib)可能使用RGB顺序,转换时需要小心。
  2. 修改图像数据时需确保数据类型和范围正确,避免溢出或类型不匹配。
  3. 对于高性能操作,推荐使用NumPy的向量化操作而非逐像素修改。

4.相关操作 

4.1 图像读取
img = cv2.imread("path/to/image.jpg")  # 默认彩色读取
  • cv2.IMREAD_COLOR:默认,彩色图像

  • cv2.IMREAD_GRAYSCALE:灰度图像

  • cv2.IMREAD_UNCHANGED:包括 alpha 通道

4.2 图像显示
cv2.imshow("Window Name", img)
cv2.waitKey(0)  # 等待任意按键
cv2.destroyAllWindows()  # 关闭所有窗口
4.3 图像保存
cv2.imwrite("output.jpg", img)

五、基本图像操作

1. 获取图像属性

使用 OpenCV 的 shape 属性获取图像的高度、宽度和通道数(通道数为 3 表示 RGB 图像,1 表示灰度图像)。

img = cv2.imread("example.jpg")
height, width, channels = img.shape
print(f"图像高度: {height}, 宽度: {width}, 通道数: {channels}")
 

2. 图像裁剪(切片)

通过数组切片提取感兴趣区域(Region of Interest, ROI),格式为 img[y_start:y_end, x_start:x_end]

roi = img[100:300, 150:350]  # 提取 y=100~300, x=150~350 的区域
cv2.imshow("ROI", roi)
 

3. 图像缩放

使用 cv2.resize() 调整图像尺寸,参数为目标宽度和高度(单位为像素)。

resized = cv2.resize(img, (300, 200))  # 新宽度 300,高度 200
 

4. 图像翻转

通过 cv2.flip() 实现垂直、水平或双向翻转,第二个参数控制方向:

  • 0:垂直翻转(沿 X 轴)
  • 1:水平翻转(沿 Y 轴)
  • -1:双向翻转
flip_v = cv2.flip(img, 0)    # 上下翻转
flip_h = cv2.flip(img, 1)    # 左右翻转
flip_both = cv2.flip(img, -1)  # 上下+左右翻转
 

5. 图像旋转(90度)

使用 cv2.rotate() 实现 90°、180° 或 270° 旋转,支持以下模式:

  • cv2.ROTATE_90_CLOCKWISE:顺时针 90°
  • cv2.ROTATE_180:180°
  • cv2.ROTATE_90_COUNTERCLOCKWISE:逆时针 90°
rotated = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
 

6. 创建可缩放窗口

通过 cv2.namedWindow() 创建可调整大小的窗口,需配合 cv2.WINDOW_NORMAL 参数。

cv2.namedWindow("MyWindow", cv2.WINDOW_NORMAL)
cv2.imshow("MyWindow", img)
 

7. 显示图像与等待用户输入

cv2.waitKey(0) 暂停程序直到用户按键,参数为等待时间(毫秒),0 表示无限等待。

cv2.waitKey(0)
 

 8. 释放资源

关闭所有窗口并释放内存资源(如摄像头或视频对象需额外调用 release())。

cv2.destroyAllWindows()
# cap.release()  # 若使用摄像头或视频,需显式释放
 

9. 完整示例代码

整合上述操作,实现图像读取、裁剪、缩放、翻转和显示的完整流程。

import cv2
img = cv2.imread("example.jpg")
cv2.namedWindow("Image", cv2.WINDOW_NORMAL)
cv2.imshow("Image", img)
print("图像尺寸:", img.shape)

cropped = img[50:200, 100:300]       # 裁剪
resized = cv2.resize(cropped, (200, 100))  # 缩放
flipped = cv2.flip(resized, 1)       # 水平翻转

cv2.imshow("Processed Image", flipped)
cv2.waitKey(0)
cv2.destroyAllWindows()


网站公告

今日签到

点亮在社区的每一天
去签到