本文目录导读:

- PIL/Pillow - 最常用的图像处理库
- OpenCV - 计算机视觉领域主流库
- matplotlib - 科学计算图像处理
- scikit-image - 科学图像处理
- 完整图像分析示例
- 实际应用场景
- 选择建议
我来详细介绍Python中常用的图像读取库及其解析图像信息的方法。
PIL/Pillow - 最常用的图像处理库
from PIL import Image
import numpy as np
# 打开图像
img = Image.open('image.jpg')
# 基本信息
print(f"格式: {img.format}")
print(f"尺寸: {img.size}") # (width, height)
print(f"模式: {img.mode}") # RGB, RGBA, L(灰度)等
print(f"信息: {img.info}") # 额外的元数据
# 转换为numpy数组
img_array = np.array(img)
print(f"数组形状: {img_array.shape}")
print(f"数据类型: {img_array.dtype}")
# 颜色通道信息
if img.mode == 'RGB':
print(f"颜色通道数: 3")
elif img.mode == 'RGBA':
print(f"颜色通道数: 4 (含Alpha通道)")
OpenCV - 计算机视觉领域主流库
import cv2
import numpy as np
# 读取图像 (BGR格式)
img = cv2.imread('image.jpg')
# 基本信息
print(f"尺寸: {img.shape}") # (height, width, channels)
print(f"高度: {img.shape[0]}")
print(f"宽度: {img.shape[1]}")
print(f"通道数: {img.shape[2]}")
print(f"数据类型: {img.dtype}")
# 像素值统计
print(f"最小值: {img.min()}")
print(f"最大值: {img.max()}")
print(f"平均值: {img.mean()}")
# 转换为RGB格式(方便显示)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 读取灰度图像
img_gray = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
print(f"灰度图尺寸: {img_gray.shape}")
# 显示图像
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
matplotlib - 科学计算图像处理
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
# 读取图像
img = mpimg.imread('image.jpg')
# 基本信息
print(f"数据类型: {img.dtype}") # float32 或 uint8
print(f"尺寸: {img.shape}")
print(f"像素值范围: [{img.min():.3f}, {img.max():.3f}]")
# 显示图像
plt.imshow(img)
plt.axis('off')'Image Information')
plt.show()
# 直方图
if len(img.shape) == 3:
colors = ('r', 'g', 'b')
for i, color in enumerate(colors):
plt.hist(img[:, :, i].ravel(), bins=256,
color=color, alpha=0.5, label=color)
plt.legend()
plt.title('Color Histogram')
plt.show()
scikit-image - 科学图像处理
from skimage import io, color, exposure
import numpy as np
# 读取图像
img = io.imread('image.jpg')
print(f"数据类型: {img.dtype}")
print(f"尺寸: {img.shape}")
# 颜色空间转换
if len(img.shape) == 3:
img_gray = color.rgb2gray(img)
img_hsv = color.rgb2hsv(img)
print(f"HSV空间形状: {img_hsv.shape}")
# 图像信息统计
print(f"像素值范围: [{img.min()}, {img.max()}]")
print(f"平均亮度: {img.mean():.2f}")
# 直方图均衡化
img_enhanced = exposure.equalize_hist(img)
完整图像分析示例
import cv2
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
def analyze_image(image_path):
"""综合图像分析函数"""
# 1. 基本信息
pil_img = Image.open(image_path)
print("="*50)
print(f"文件: {image_path}")
print(f"格式: {pil_img.format}")
print(f"尺寸: {pil_img.size[0]} x {pil_img.size[1]} 像素")
print(f"模式: {pil_img.mode}")
# 2. OpenCV分析
cv_img = cv2.imread(image_path)
print(f"通道数: {cv_img.shape[2] if len(cv_img.shape) > 2 else 1}")
print(f"位深: {cv_img.dtype}")
# 3. 像素统计
print(f"\n像素统计:")
for i, color in enumerate(['B', 'G', 'R']):
channel = cv_img[:, :, i]
print(f" {color}通道 - 均值: {channel.mean():.1f}, "
f"标准差: {channel.std():.1f}, "
f"范围: [{channel.min()}, {channel.max()}]")
# 4. 文件元数据
if pil_img.info:
print(f"\n元数据:")
for key, value in pil_img.info.items():
print(f" {key}: {value}")
# 5. 直方图显示
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# 原始图像
img_rgb = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
axes[0].imshow(img_rgb)
axes[0].set_title(f'Image: {pil_img.size[0]}x{pil_img.size[1]}')
axes[0].axis('off')
# 直方图
colors = ['b', 'g', 'r']
for i, color in enumerate(colors):
hist = cv2.calcHist([cv_img], [i], None, [256], [0, 256])
axes[1].plot(hist, color=color, label=f'{color.upper()} channel')
axes[1].set_title('Color Histogram')
axes[1].set_xlabel('Pixel Value')
axes[1].set_ylabel('Frequency')
axes[1].legend()
plt.tight_layout()
plt.show()
return cv_img
# 使用示例
img_array = analyze_image('example.jpg')
实际应用场景
# 批量处理图像
import os
from pathlib import Path
def batch_image_analysis(folder_path):
"""批量分析文件夹中的图像"""
image_extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.tiff'}
for img_path in Path(folder_path).iterdir():
if img_path.suffix.lower() in image_extensions:
analyze_image(str(img_path))
# Web图像处理
import requests
from io import BytesIO
from PIL import Image
def analyze_web_image(url):
"""分析网络图像"""
response = requests.get(url)
img = Image.open(BytesIO(response.content))
print(f"网络图像尺寸: {img.size}")
print(f"格式: {img.format}")
return img
选择建议
- PIL/Pillow: 简单图像处理、格式转换、缩略图
- OpenCV: 实时处理、计算机视觉任务、视频处理
- scikit-image: 科学计算、算法研究
- matplotlib: 数据可视化、科学绘图
这些库各有特色,选择时根据具体需求来决定!