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。