第1章:图像读取与显示——从零开始接触图像处理
图像复原的第一步是什么?说白了,就是先把图像“请”进内存里。
我刚开始做图像处理那会儿,总觉得读取图像是件小事。后来才发现,不同库的读取方式、颜色通道顺序、数据类型,处处都是坑。今天咱们就把这些基础打扎实。
1.1 使用OpenCV读取图像
OpenCV是我最常用的工具。它读取图像的方式很直接:
import cv2
# 读取图像
img = cv2.imread('old_photo.jpg')
# 检查是否读取成功
if img is None:
print("图像读取失败,请检查路径")
else:
print("图像读取成功!")
这里有个关键点——OpenCV默认读取的是BGR格式,不是我们熟悉的RGB。我在项目中遇到过好几次,显示出来的图像颜色怪怪的,就是因为忘了做通道转换。
⚠️ 避坑指南
我曾经在做一个老照片修复项目时,直接用OpenCV显示图像,结果人脸都是蓝紫色的。后来才意识到是BGR和RGB的差异。记住:OpenCV读进来是BGR,显示要用RGB。
我曾经在做一个老照片修复项目时,直接用OpenCV显示图像,结果人脸都是蓝紫色的。后来才意识到是BGR和RGB的差异。记住:OpenCV读进来是BGR,显示要用RGB。
1.2 使用PIL读取图像
PIL(Pillow)是另一个常用的图像库。它的读取方式更符合Python的习惯:
from PIL import Image
# 读取图像
img_pil = Image.open('old_photo.jpg')
# 显示图像
img_pil.show()
PIL默认就是RGB格式,这点比OpenCV省心。但它的处理速度不如OpenCV快。你想想看,处理大批量图像时,这个差异就很明显了。
💡 我的建议
我个人习惯:用OpenCV做图像处理,用PIL做图像展示。两者配合使用,效率最高。
我个人习惯:用OpenCV做图像处理,用PIL做图像展示。两者配合使用,效率最高。
1.3 图像显示与保存
显示图像,不同库有不同的方式:
# OpenCV显示
cv2.imshow('Old Photo', img)
cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows()
# 保存图像
cv2.imwrite('restored_photo.jpg', img)
保存时要注意格式。JPEG适合照片,PNG适合需要透明背景的图像。嗯,这里有个小技巧:保存为PNG时,可以设置压缩级别:
# 保存为PNG,压缩级别0-9
cv2.imwrite('output.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 3])
1.4 图像属性获取
拿到图像后,第一件事就是看看它的“底细”:
# 获取图像属性
height, width, channels = img.shape
print(f"图像尺寸:{width} x {height}")
print(f"通道数:{channels}")
print(f"数据类型:{img.dtype}")
print(f"像素总数:{img.size}")
为什么会关心这些?因为老照片的尺寸、位深、通道数,直接决定了后续处理的方法。我记得有一次处理一张1920年代的扫描照片,发现它是单通道的灰度图,但保存成了三通道的JPEG。白白浪费了存储空间。
📊 常用图像属性一览
| 属性 | 说明 | 示例值 |
|---|---|---|
| shape | 图像尺寸和通道数 | (480, 640, 3) |
| dtype | 像素数据类型 | uint8 |
| size | 像素总数 | 921600 |
1.5 本章知识体系
下面这张图,帮你理清本章的核心逻辑:
1.6 实战小练习
光看不练可不行。我建议你找一张老照片试试:
- 用OpenCV和PIL分别读取同一张图像
- 对比两者的像素值是否一致
- 获取图像的尺寸、通道数、数据类型
- 尝试保存为不同格式,观察文件大小变化
💡 练手建议
如果你手头没有老照片,可以用手机拍一张,然后故意降低分辨率或添加噪点,模拟老照片的效果。这样练习起来更有感觉。
如果你手头没有老照片,可以用手机拍一张,然后故意降低分辨率或添加噪点,模拟老照片的效果。这样练习起来更有感觉。
好了,图像读取与显示的基础就这些。记住:读得对,才能修得好。下一章咱们聊聊图像预处理,那是修复老照片的关键一步。
公众号:蓝海资料掘金营,微信deep3321