Python图像处理

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()  # 显示带有人脸框的图像
运行截图

但是未识别到全部的人脸,还不知道怎么样调代码或者参数

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容