Python图像处理基础
图像读取与显示
使用Pillow库
from PIL import Image # 从PIL库中导入Image模块,用于处理图像
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块,用于绘图
image = Image.open('xcyz.jpg') # 打开指定路径的图片文件,并将其加载为image对象
plt.imshow(image) # 使用imshow函数在绘图区域中显示该图片
plt.axis('off') # 关闭坐标轴的显示
plt.show() # 显示图片
图像基本操作
调整图像大小
# 调整图像大小
resized_image = image.resize((200, 300)) # 将原图像调整为宽200像素,高300像素的大小
翻转图像
# 翻转图像
flipped_image = image.transpose(Image.FLIP_LEFT_RIGHT) # 将图像左右翻转(水平镜像)
旋转图像
# 旋转图像
rotated_image = image.rotate(45) # 将图像顺时针旋转45度
图像滤波
图像滤波是去除图像噪声和干扰的一种常见操作。Python的Pillow库提供了多种图像滤波技术。
高斯滤波
from PIL import ImageFilter # 从PIL库中导入ImageFilter模块,用于应用图像滤波操作
# 高斯滤波
gaussian_blurred_image = image.filter(ImageFilter.GaussianBlur(radius=10)) # 对图像应用半径为10的高斯模糊滤波
中值滤波
# 中值滤波
median_blurred_image = image.filter(ImageFilter.MedianFilter(size=5)) # 对图像应用大小为5的中值滤波
图像增强
图像增强可以提高图像的质量和可读性。Python的Pillow库提供了多种图像增强技术。
from PIL import ImageEnhance # 从PIL库中导入ImageEnhance模块,用于图像增强操作
# 对比度增强
enhancer = ImageEnhance.Contrast(image) # 创建一个对比度增强器对象
enhanced_image = enhancer.enhance(2) # 将图像对比度增强到原来的2倍
# 亮度增强
enhancer1 = ImageEnhance.Brightness(image) # 创建一个亮度增强器对象
enhanced_image1 = enhancer1.enhance(1.5) # 将图像亮度增强到原来的1.5倍
Python图像处理高级应用
图像分割
图像分割是将图像划分为不同的区域或对象的技术。
基于阈值的分割
基于阈值的分割是一种简单的图像分割方法,它通过设置一个阈值来将图像分为前景和背景。
import cv2 # 导入OpenCV库,用于计算机视觉相关操作
import numpy as np # 导入NumPy库,用于数组操作
# 转换图像为灰度图像
gray_image = cv2.cvtColor(np.array(image), cv2.COLOR_BGR2GRAY)
# 使用OpenCV的cvtColor函数将彩色图像转换为灰度图像,首先将PIL图像转换为NumPy数组,再进行颜色空间转换
# 应用阈值分割
_, thresholded_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
# 使用OpenCV的threshold函数对灰度图像应用二值化阈值分割,阈值为127,像素值大于127的设为255,其他设为0
# 显示分割后的图像
plt.imshow(thresholded_image, cmap='gray') # 使用Matplotlib的imshow函数显示二值化后的图像,颜色映射为灰度图
plt.axis('off')
plt.show()
基于边缘的分割
基于边缘的分割是一种通过检测图像边缘来分割图像的方法。
plt.show()
#%%
# 读取图像
image = cv2.imread("xcyz.jpg") # 使用OpenCV读取图像,图像保存在变量image中
# 转换图像为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将图像从BGR格式转换为灰度图像
# 应用边缘检测
edges = cv2.Canny(gray_image, 100, 200) # 使用Canny算法进行边缘检测,阈值为100和200
# 显示边缘检测后的图像
plt.imshow(edges, cmap='gray') # 使用matplotlib显示边缘检测结果,采用灰度色彩映射
plt.axis('off')
plt.show()
基于深度学习的分割
基于深度学习的分割是一种使用神经网络来分割图像的方法。
import torch
from torchvision import models, transforms
from PIL import Image
import matplotlib.pyplot as plt
# 加载预训练的分割模型
model = models.segmentation.deeplabv3_resnet50(pretrained=True)
model.eval() # 切换到评估模式
# 定义图像转换
transform = transforms.Compose([
transforms.Resize((256, 256)), # 将图像调整为256x256像素
transforms.ToTensor(), # 转换为张量
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 归一化
])
# 读取图像
image = Image.open("xcyz.jpg") # 打开图像文件
# 应用图像转换
transformed_image = transform(image).unsqueeze(0) # 应用转换并添加批次维度
# 预测分割结果
with torch.no_grad(): # 禁用梯度计算
output = model(transformed_image)['out'] # 获取模型输出
# 显示分割结果
output_predictions = output.argmax(dim=1).squeeze(0).cpu().numpy() # 取最大类的索引值
plt.imshow(output_predictions, cmap='viridis') # 显示分割图像
plt.axis('off')
plt.show()
特征提取
使用OpenCV进行特征提取
import cv2
# 读取图像
# 使用 OpenCV 的 imread 函数读取图像文件 "xcyz.jpg"
image = cv2.imread("xcyz.jpg")
# 转换图像为灰度图像
# 使用 OpenCV 的 cvtColor 函数将图像从 BGR 格式转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用SIFT特征提取
# 创建 SIFT 对象,用于检测图像中的关键点和计算描述符
sift = cv2.SIFT_create()
# 使用 detectAndCompute 方法在灰度图像中检测关键点并计算对应的描述符
keypoints, descriptors = sift.detectAndCompute(gray_image, None)
# 显示特征点
# 使用 drawKeypoints 函数在原始图像上绘制检测到的关键点,DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS 标志用于绘制包含方向和大小信息的关键点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# 显示特征点
# 使用 Matplotlib 库的 imshow 函数显示带有关键点的图像
plt.imshow(image_with_keypoints)
plt.axis('off') # 关闭坐标轴显示
plt.show() # 显示图像
使用深度学习进行特征提取
import torch
from torchvision import models, transforms
# 导入 PyTorch 和 torchvision 库,其中包括预训练模型和图像变换工具
# 加载预训练的 VGG16 模型
model = models.vgg16(pretrained=True)
# 定义图像转换操作:调整图像大小、转换为张量、归一化
transform = transforms.Compose([
transforms.Resize(224), # 将图像大小调整为 224x224
transforms.ToTensor(), # 将图像转换为 PyTorch 张量
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 按照 ImageNet 数据集的均值和标准差进行归一化
])
# 读取图像
image = Image.open("xcyz.jpg") # 使用 PIL 库打开图像
# 应用图像转换
transformed_image = transform(image) # 对图像进行预处理变换
# 预测特征
with torch.no_grad(): # 禁用梯度计算,节省内存和计算资源
features = model(transformed_image.unsqueeze(0)) # 将单张图像添加批次维度并输入模型,得到特征
# 显示前10个特征
features.shape, features[:10] # 输出特征张量的形状,并显示前 10 个特征
图像合成
图像拼接
import cv2 # 导入 OpenCV 库
# 读取两个图像
image1 = cv2.imread("xcyz.jpg") # 读取第一个图像
image2 = cv2.imread("xcyz1.jpg") # 读取第二个图像
# 调整图像大小以匹配第二个图像的尺寸
resized_image1 = cv2.resize(image1, (image2.shape[1], image2.shape[0])) # 调整 image1 的大小,使其与 image2 的宽度和高度一致
# 应用图像加权合并(拼接)
# 将两个图像按比例合并,两个图像的权重均为 1,偏置为 0
result = cv2.addWeighted(image2, 1, resized_image1, 1, 0)
# 使用 Matplotlib 显示拼接后的图像
import matplotlib.pyplot as plt # 导入 Matplotlib 用于显示图像
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) # 将 BGR 格式转换为 RGB 格式,以便正确显示颜色
plt.axis('off') # 关闭坐标轴显示
plt.show() # 显示图像
图像混合
import cv2 # 导入 OpenCV 库
import matplotlib.pyplot as plt # 导入 Matplotlib 用于显示图像
# 读取两个图像
image1 = cv2.imread("xcyz.jpg") # 读取第一张图像
image2 = cv2.imread("xcyz1.jpg") # 读取第二张图像
# 确保两张图像的尺寸相同,若不同需调整大小
if image1.shape != image2.shape:
image2 = cv2.resize(image2, (image1.shape[1], image1.shape[0])) # 调整 image2 尺寸与 image1 匹配
# 应用图像混合(加权合并)
# 使用 0.5 的权重将两张图像进行加权混合
result = cv2.addWeighted(image1, 0.5, image2, 0.5, 0)
# 显示混合后的图像
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) # 将 BGR 格式转换为 RGB 格式以正确显示颜色
plt.axis('off') # 关闭坐标轴显示
plt.show() # 显示混合后的图像
人脸识别
import cv2 # 导入 OpenCV 库
import matplotlib.pyplot as plt # 导入 Matplotlib 用于显示图像
# 读取图像
image = cv2.imread("xcyz.jpg") # 读取要检测人脸的图像
# 应用图像预处理
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将彩色图像转换为灰度图像以便于人脸检测
# 应用人脸检测
# 加载预训练的人脸检测模型(Haar 特征分类器),并在灰度图像上进行检测
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
faces = face_cascade.detectMultiScale(gray_image) # 返回检测到的所有人脸的坐标和大小
# 绘制检测到的人脸
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2) # 在每张检测到的人脸周围绘制蓝色矩形框
# 显示图像
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # 将 BGR 格式转换为 RGB 格式,以正确显示颜色
plt.axis('off') # 关闭坐标轴显示
plt.show() # 显示带有人脸框的图像
但是未识别到全部的人脸,还不知道怎么样调代码或者参数