一、前置核心认知:OpenCV 是什么?

1. 核心定位

OpenCV(Open Source Computer Vision Library)= 图像处理 / 计算机视觉的 “万能工具库”,是全球最主流的开源图像 / 视频处理库,能通过代码实现图片读取、修改、分析等所有基础操作,就像 “代码版的美图秀秀”,但更精准、更适配 AI 任务(比如 CNN 图像识别前的图片预处理)。

2. 小白通俗理解

你手机里的 “美图秀秀” 能手动裁剪、调黑白、旋转图片;OpenCV 就是用代码代替手动操作,让计算机自动完成这些事 —— 后续不管是做图片分类、目标检测,还是视频分析,第一步都是用 OpenCV 处理图片。


二、第一步:OpenCV 安装(小白极简版)

1. 安装命令(Windows/Linux 通用,国内源加速)

打开 CMD / 终端,输入以下命令(opencv-python是核心包,包含所有基础功能):

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

2. 验证安装(确保无报错)

新建test_opencv.py文件,运行以下代码,无报错即安装成功:

python

# 导入OpenCV库(约定俗成简写为cv2)
import cv2
# 打印版本号,验证安装
print("OpenCV版本:", cv2.__version__)

三、核心操作 1:读取图片(最基础的第一步)

1. 核心逻辑

读取图片 = 让 OpenCV “打开” 本地的图片文件,转换成程序能处理的 “图像矩阵”(小白可理解为 “图片的数字形式”)。

2. 小白避坑重点

  • 图片路径不要有中文 / 空格(比如C:\图片\测试.jpg会报错,建议改为C:\img\test.jpg);
  • 优先用绝对路径(比如C:\Users\XXX\Desktop\test.jpg),避免相对路径找不到文件;
  • OpenCV 读取彩色图片时,默认按BGR格式存储(不是常见的RGB),但不影响基础操作。

3. 完整代码(读取 + 显示图片)

python

import cv2

# 1. 读取图片(参数1:图片路径;参数2:读取模式,cv2.IMREAD_COLOR=彩色,cv2.IMREAD_GRAYSCALE=灰度)
# 替换为你自己的图片绝对路径!!!
img_path = "C:\\Users\\XXX\\Desktop\\test.jpg"  # Windows路径用双反斜杠,Linux用单斜杠
img = cv2.imread(img_path, cv2.IMREAD_COLOR)

# 检查图片是否读取成功(小白必加,避免路径错误导致后续报错)
if img is None:
    print("错误:图片读取失败!请检查路径是否正确,或图片是否存在。")
else:
    # 2. 显示图片(参数1:窗口名称;参数2:图像矩阵)
    cv2.imshow("Original Image", img)
    # 3. 等待按键(参数0=无限等待,按任意键关闭窗口;若填数字,比如1000=等待1秒后自动关闭)
    cv2.waitKey(0)
    # 4. 释放所有窗口(避免内存占用)
    cv2.destroyAllWindows()

    # 额外:查看图片的基本信息(可选)
    print("图片形状(高度, 宽度, 通道数):", img.shape)  # 彩色图是(H,W,3),灰度图是(H,W)
    print("图片像素总数:", img.size)
    print("像素数据类型:", img.dtype)
运行效果

弹出一个窗口,显示你指定路径的图片,按任意键窗口关闭。


四、核心操作 2:灰度化(转黑白图)

1. 核心逻辑

灰度化 = 把彩色图片(红 / 绿 / 蓝 3 个通道)转换成黑白图片(仅 1 个通道),目的是减少计算量(3 通道→1 通道),这是 CNN 图像识别前最常用的预处理步骤。

2. 通俗理解

就像手机拍照的 “黑白滤镜”,去掉颜色信息,只保留明暗,计算机处理黑白图会快很多。

3. 完整代码(读取→灰度化→显示对比)

python

import cv2

# 读取彩色图片
img_path = "C:\\Users\\XXX\\Desktop\\test.jpg"
img_color = cv2.imread(img_path, cv2.IMREAD_COLOR)

if img_color is None:
    print("错误:图片读取失败!")
else:
    # 1. 灰度化(核心函数:cv2.cvtColor,参数2=COLOR_BGR2GRAY表示BGR转灰度)
    img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)

    # 2. 显示彩色图和灰度图(并排显示)
    cv2.imshow("Color Image", img_color)
    cv2.imshow("Gray Image", img_gray)

    # 3. 保存灰度图到本地(可选)
    cv2.imwrite("C:\\Users\\XXX\\Desktop\\test_gray.jpg", img_gray)

    # 4. 等待按键+释放窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    # 查看灰度图信息(对比彩色图)
    print("彩色图形状:", img_color.shape)  # (H,W,3)
    print("灰度图形状:", img_gray.shape)  # (H,W)
运行效果

弹出两个窗口,一个显示彩色原图,一个显示黑白灰度图;同时本地会生成test_gray.jpg文件。


五、核心操作 3:裁剪图片(“截图” 局部区域)

1. 核心逻辑

裁剪图片 = 截取图片的指定区域,OpenCV 中图像是 “行列矩阵”:

  • 行(y 轴):对应图片的高度
  • 列(x 轴):对应图片的宽度
  • 裁剪格式:img[行起始:行结束, 列起始:列结束](小白记:img[y1:y2, x1:x2])。

2. 通俗理解

就像用截图工具框选图片的一部分,只保留框内的内容。

3. 完整代码(读取→裁剪→显示)

python

import cv2

img_path = "C:\\Users\\XXX\\Desktop\\test.jpg"
img = cv2.imread(img_path, cv2.IMREAD_COLOR)

if img is None:
    print("错误:图片读取失败!")
else:
    # 查看图片尺寸,确定裁剪范围(比如图片尺寸是(800, 1200, 3),即高度800,宽度1200)
    h, w = img.shape[:2]
    print(f"图片高度:{h},宽度:{w}")

    # 1. 定义裁剪范围(示例:截取图片中间区域)
    # y1=200, y2=600(行范围);x1=300, x2=900(列范围)
    y1, y2 = 200, 600
    x1, x2 = 300, 900
    img_crop = img[y1:y2, x1:x2]

    # 2. 显示原图和裁剪后的图
    cv2.imshow("Original Image", img)
    cv2.imshow("Cropped Image", img_crop)

    # 3. 保存裁剪后的图片
    cv2.imwrite("C:\\Users\\XXX\\Desktop\\test_crop.jpg", img_crop)

    # 4. 等待按键+释放窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
小白技巧

裁剪范围可以根据自己的图片尺寸调整,比如想截取左上角 1/4 区域:

python

y1, y2 = 0, h//2
x1, x2 = 0, w//2

六、核心操作 4:旋转图片(绕中心转指定角度)

1. 核心逻辑

旋转图片需要两步(小白不用深究原理,记固定流程即可):

  1. 计算旋转矩阵:指定 “旋转中心、旋转角度、缩放比例”;
  2. 仿射变换:用旋转矩阵对图片做旋转,输出新图片。

2. 通俗理解

就像用美图秀秀把图片旋转 90 度、180 度,或任意角度,OpenCV 能精准控制旋转角度和缩放。

3. 完整代码(读取→旋转→显示)

python

import cv2
import numpy as np  # 处理矩阵,OpenCV依赖

img_path = "C:\\Users\\XXX\\Desktop\\test.jpg"
img = cv2.imread(img_path, cv2.IMREAD_COLOR)

if img is None:
    print("错误:图片读取失败!")
else:
    h, w = img.shape[:2]
    # 1. 计算旋转矩阵(核心参数)
    center = (w//2, h//2)  # 旋转中心:图片正中心
    angle = 90  # 旋转角度(正数=逆时针,负数=顺时针)
    scale = 1.0  # 缩放比例(1.0=不缩放)
    rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)

    # 2. 执行旋转(仿射变换)
    img_rotated = cv2.warpAffine(img, rotation_matrix, (w, h))

    # 3. 显示原图和旋转后的图
    cv2.imshow("Original Image", img)
    cv2.imshow("Rotated Image (90°)", img_rotated)

    # 4. 保存旋转后的图片
    cv2.imwrite("C:\\Users\\XXX\\Desktop\\test_rotated.jpg", img_rotated)

    # 5. 等待按键+释放窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
扩展:旋转任意角度(比如 45 度)

只需修改angle=45,但旋转非 90/180/270 度时,图片会出现黑边(因为尺寸变化),小白入门先掌握 90 度旋转即可。


七、小白避坑指南(核心 4 点)

  1. 图片读取失败(img is None)
    • 检查路径是否正确,路径不要有中文 / 空格;
    • Windows 路径用双反斜杠(\\)或单斜杠加 r(r"C:\img\test.jpg")防止转义;
  2. 显示窗口闪退
    • 必须加cv2.waitKey(0),否则窗口会瞬间关闭;
  3. 灰度化颜色异常
    • 不要改COLOR_BGR2GRAY参数,OpenCV 默认 BGR 格式,该参数已适配;
  4. 旋转后图片不全
    • 旋转非 90 度倍数时,需重新计算输出尺寸(小白入门可暂时忽略)。

总结

  1. OpenCV 安装用pip install opencv-python,导入cv2无报错即成功;
  2. 读取图片核心是cv2.imread(),务必检查路径,显示需配合imshow()+waitKey()+destroyAllWindows()
  3. 灰度化用cv2.cvtColor(img, cv2.COLOR_BGR2GRAY),目的是减少计算量,是图像预处理的基础;
  4. 裁剪图片用数组切片img[y1:y2, x1:x2],旋转需先算旋转矩阵(getRotationMatrix2D)再仿射变换(warpAffine);
  5. 所有操作的核心是把图片转换成 “数字矩阵”,通过修改矩阵实现图片的各种调整。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐