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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容