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

目录

[一、OpenCV 简介](#一、OpenCV 简介)

1.OpenCV-Python

二、环境安装

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

[2. 验证安装](#2. 验证安装)

三、图像表示

四、图像读取与保存

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

2.图像属性和操作

3.像素值的含义

4.相关操作

[4.1 图像读取](#4.1 图像读取)

[4.2 图像显示](#4.2 图像显示)

[4.3 图像保存](#4.3 图像保存)

五、基本图像操作

[1. 获取图像属性](#1. 获取图像属性)

[2. 图像裁剪(切片)](#2. 图像裁剪(切片))

[3. 图像缩放](#3. 图像缩放)

[4. 图像翻转](#4. 图像翻转)

[5. 图像旋转(90度)](#5. 图像旋转(90度))

[6. 创建可缩放窗口](#6. 创建可缩放窗口)

[7. 显示图像与等待用户输入](#7. 显示图像与等待用户输入)

[8. 释放资源](#8. 释放资源)

[9. 完整示例代码](#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)

python 复制代码
pip install opencv-python

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

python 复制代码
pip install opencv-python opencv-contrib-python

2. 验证安装

python 复制代码
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)

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

python 复制代码
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]:纯白色。
  • 其他组合表示不同颜色。

示例代码

python 复制代码
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 图像读取
python 复制代码
img = cv2.imread("path/to/image.jpg")  # 默认彩色读取
  • cv2.IMREAD_COLOR:默认,彩色图像

  • cv2.IMREAD_GRAYSCALE:灰度图像

  • cv2.IMREAD_UNCHANGED:包括 alpha 通道

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

五、基本图像操作

1. 获取图像属性

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

python 复制代码
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]

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

3. 图像缩放

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

python 复制代码
resized = cv2.resize(img, (300, 200))  # 新宽度 300,高度 200
 

4. 图像翻转

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

  • 0:垂直翻转(沿 X 轴)
  • 1:水平翻转(沿 Y 轴)
  • -1:双向翻转
python 复制代码
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°
python 复制代码
rotated = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
 

6. 创建可缩放窗口

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

python 复制代码
cv2.namedWindow("MyWindow", cv2.WINDOW_NORMAL)
cv2.imshow("MyWindow", img)
 

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

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

python 复制代码
cv2.waitKey(0)
 

8. 释放资源

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

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

9. 完整示例代码

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

python 复制代码
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()
相关推荐
2zcode1 小时前
基于Matlab传统图像处理技术的车辆车型识别与分类方法研究
开发语言·图像处理·matlab
_Orch1d4 小时前
初识卷积神经网络CNN
深度学习·计算机视觉·cnn·卷积神经网络
心情好的小球藻8 小时前
OpenCV 零基础到项目实战 | DAY 1:图像基础与核心操作
人工智能·opencv·计算机视觉
WXX_s10 小时前
【OpenCV篇】OpenCV——01day.图像基础
人工智能·opencv·计算机视觉
叫我:松哥11 小时前
基于python django深度学习的中文文本检测+识别,可以前端上传图片和后台管理图片
图像处理·人工智能·后端·python·深度学习·数据挖掘·django
芒果快进我嘴里12 小时前
激活函数Focal Loss 详解
人工智能·计算机视觉·目标跟踪
伊织code12 小时前
OpenCV 官翻8 - 其他算法
人工智能·opencv·算法·拼接·光流·成像
Gession-杰12 小时前
OpenCV快速入门之CV宝典
人工智能·python·opencv·计算机视觉
Ro Jace13 小时前
图像分析学习笔记(2):图像处理基础
图像处理·笔记·学习