第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。

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做图像展示。两者配合使用,效率最高。

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 本章知识体系

下面这张图,帮你理清本章的核心逻辑:

图像读取与显示知识体系 OpenCV读取 PIL读取 属性获取 BGR格式 imread/imshow RGB格式 Image.open shape/dtype size/通道数 图像复原的第一步:读得对,才能修得好

1.6 实战小练习

光看不练可不行。我建议你找一张老照片试试:

  1. 用OpenCV和PIL分别读取同一张图像
  2. 对比两者的像素值是否一致
  3. 获取图像的尺寸、通道数、数据类型
  4. 尝试保存为不同格式,观察文件大小变化
💡 练手建议
如果你手头没有老照片,可以用手机拍一张,然后故意降低分辨率或添加噪点,模拟老照片的效果。这样练习起来更有感觉。

好了,图像读取与显示的基础就这些。记住:读得对,才能修得好。下一章咱们聊聊图像预处理,那是修复老照片的关键一步。


公众号:蓝海资料掘金营,微信deep3321