1、图像处理基础:OpenCV简介、图像读取与显示、像素操作基础

1.1 为什么从OpenCV开始?

做图像处理,OpenCV几乎是绕不开的工具。我个人习惯把它比作「瑞士军刀」——功能多、上手快、社区活跃。你想想看,从人脸识别到自动驾驶,从美颜滤镜到医学影像,背后都有它的影子。

OpenCV的全称是Open Source Computer Vision Library,2000年由Intel发起,现在已经是计算机视觉领域的标配了。它支持C++、Python、Java等多种语言,但说实话,做研究和快速原型,Python版本最香。

核心要点:OpenCV是一个跨平台的计算机视觉库,提供了超过2500个优化算法。你不需要从零造轮子,直接调用就好。

1.2 安装与导入

安装OpenCV很简单,一行命令搞定:

pip install opencv-python

如果你还需要一些扩展模块(比如特征匹配、物体检测),可以装:

pip install opencv-contrib-python

导入的时候,我习惯这样写:

import cv2
import numpy as np

嗯,这里要注意:OpenCV的Python包名是cv2,不是opencv。我第一次用的时候也踩过这个坑,找了半天才发现是导入名写错了。

1.3 图像读取——你的第一行代码

图像读取是入门的第一步。OpenCV用imread()函数来读图:

img = cv2.imread('lena.jpg')

这个函数返回的是一个NumPy数组。说白了,图像在计算机里就是一堆数字。每个像素点对应一个数值,彩色图像就是三个数值(B、G、R)。

读取时还可以指定模式:

参数 含义 常用场景
cv2.IMREAD_COLOR 加载彩色图像(默认) 日常处理
cv2.IMREAD_GRAYSCALE 加载灰度图像 边缘检测、二值化
cv2.IMREAD_UNCHANGED 加载原图(含Alpha通道) 透明图像处理

避坑指南:OpenCV默认使用BGR色彩空间,不是RGB!我曾经在项目中直接用imread读图然后传给matplotlib显示,结果颜色全乱了。后来才意识到需要做颜色空间转换。

1.4 图像显示——看看你读到了什么

读进来之后,总得看看效果吧?用imshow()

cv2.imshow('My Image', img)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()

waitKey(0)的意思是无限等待按键。如果你想让窗口自动关闭,可以设置毫秒数,比如waitKey(1000)就是等1秒。

我个人习惯在调试时这样写:

cv2.imshow('Debug', img)
if cv2.waitKey(0) & 0xFF == ord('q'):
    cv2.destroyAllWindows()

按q键退出,这样方便快速查看多张图。

1.5 图像保存——把结果写下来

处理完的图像,用imwrite()保存:

cv2.imwrite('output.jpg', img)

你可以指定保存格式,OpenCV会根据文件后缀自动判断。比如.jpg.png.bmp都支持。

小技巧:保存为PNG时,可以控制压缩级别。比如cv2.imwrite('output.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 9]),数值越大压缩率越高,但速度越慢。

1.6 像素操作——图像的本质

图像就是矩阵,像素就是矩阵里的元素。我们来操作一下:

import cv2
import numpy as np

# 创建一个300x300的黑色图像
img = np.zeros((300, 300, 3), dtype=np.uint8)

# 把中心区域变成红色
img[100:200, 100:200] = [0, 0, 255]  # BGR格式

cv2.imshow('Red Square', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

为什么会是[0, 0, 255]?因为OpenCV是BGR顺序,蓝色是[255, 0, 0],绿色是[0, 255, 0],红色是[0, 0, 255]

你还可以读取单个像素的值:

pixel = img[50, 100]  # 获取(50,100)位置的像素值
print(pixel)  # 输出 [B, G, R]

修改单个像素:

img[50, 100] = [255, 255, 255]  # 变成白色

核心要点:像素操作是图像处理的基础。无论是滤波、增强还是修复,本质上都是在修改这些像素值。你想想看,美颜磨皮不就是把皮肤区域的像素值做平滑处理吗?

1.7 实战小例子:图像反转

我们来写一个完整的例子,把图像颜色反转:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('lena.jpg')

# 获取图像尺寸
h, w, c = img.shape
print(f'图像尺寸:{w}x{h},通道数:{c}')

# 像素反转:每个通道用255减去原值
inverted = 255 - img

# 显示原图和反转图
cv2.imshow('Original', img)
cv2.imshow('Inverted', inverted)

# 保存结果
cv2.imwrite('inverted_lena.jpg', inverted)

cv2.waitKey(0)
cv2.destroyAllWindows()

这个例子虽然简单,但体现了像素操作的核心思想:遍历每个像素,做数学运算。我在做图像增强时,经常用类似的方法调整对比度和亮度。

1.8 本章小结

这一章我们走完了OpenCV的入门流程:安装、读取、显示、保存、像素操作。说白了,就是「把图像当成数组来玩」。后面的所有技术——图像增强、修复、去噪、超分辨率——都是在这个基础上展开的。

我记得刚开始学OpenCV时,光是搞明白BGR和RGB的区别就折腾了半天。但一旦理解了图像就是数字矩阵,后面的路就顺了。下一章我们会深入图像增强的核心技术,到时候见。

课后练习:试着用像素操作实现一个「灰度化」效果,把彩色图像变成灰度图。提示:灰度值 = 0.299*R + 0.587*G + 0.114*B。