首页 > 编程语言 >【Python图像处理】进阶实战续篇(五)

【Python图像处理】进阶实战续篇(五)

时间:2024-11-24 09:04:22浏览次数:8  
标签:axs 续篇 进阶 gray Python image cv2 图像 import

在这里插入图片描述

在前几篇文章中,我们已经探讨了Python在图像处理领域的多种技术,包括图像分割、视频处理、三维重建、图像增强、面部识别、文字识别、图像检索以及医学图像处理。本篇将继续深入探讨更多图像处理技术及其应用实例,并结合更多的知识点说明,以帮助读者更全面地掌握图像处理领域的知识。

1. 目标检测与跟踪

目标检测是在图像中定位并识别特定对象的任务,而目标跟踪则是在连续的图像帧中追踪这些对象的位置。

1.1 目标检测

目标检测通常利用深度学习模型(如YOLO、SSD、Faster R-CNN等)来实现。

示例代码

import torch
import torchvision.transforms as transforms
from torchvision.models.detection import fasterrcnn_resnet50_fpn, FasterRCNN_ResNet50_FPN_Weights
from PIL import Image
import matplotlib.pyplot as plt

# 加载预训练模型
model = fasterrcnn_resnet50_fpn(weights=FasterRCNN_ResNet50_FPN_Weights.DEFAULT)
model.eval()

# 加载图像
image_path = 'path/to/image.jpg'
image = Image.open(image_path).convert('RGB')

# 预处理图像
transform = transforms.Compose([
    transforms.ToTensor()
])
image_tensor = transform(image)

# 进行目标检测
with torch.no_grad():
    predictions = model([image_tensor])

# 解析预测结果
boxes = predictions[0]['boxes']
labels = predictions[0]['labels']
scores = predictions[0]['scores']

# 绘制结果
def draw_boxes(image, boxes, labels, scores, threshold=0.5):
    import matplotlib.patches as patches
    fig, ax = plt.subplots(1)
    ax.imshow(image)
    
    for box, label, score in zip(boxes, labels, scores):
        if score > threshold:
            x, y, width, height = box[0], box[1], box[2]-box[0], box[3]-box[1]
            rect = patches.Rectangle((x, y), width, height, linewidth=1, edgecolor='r', facecolor='none')
            ax.add_patch(rect)
            ax.text(x, y, f"{label}: {score:.2f}", color='r', fontsize=8)
    
    plt.axis('off')
    plt.show()

draw_boxes(image, boxes, labels, scores)
1.2 目标跟踪

目标跟踪通常用于视频处理,涉及到在连续的图像帧中追踪特定的对象。

示例代码

import cv2
import numpy as np

# 选择跟踪算法
tracker = cv2.TrackerKCF_create()  # KCF跟踪器

# 读取视频
video_path = 'path/to/video.mp4'
cap = cv2.VideoCapture(video_path)

# 读取第一帧
ret, frame = cap.read()
if not ret:
    print("Failed to read the first frame.")
    exit()

# 选择要跟踪的目标
bbox = cv2.selectROI(frame, False)

# 初始化跟踪器
tracker.init(frame, bbox)

# 追踪目标
while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    # 更新跟踪器
    ret, bbox = tracker.update(frame)
    
    if ret:
        p1 = (int(bbox[0]), int(bbox[1]))
        p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
        cv2.rectangle(frame, p1, p2, (255, 0, 0), 2, 1)
    
    # 显示追踪框
    cv2.imshow('Tracking', frame)
    
    # 按Q键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
2. 图像拼接与全景图生成

图像拼接是从多张图像中创建一张更大图像的技术,常用于制作全景图。

2.1 图像拼接

图像拼接通常使用特征匹配(如SIFT、SURF等)和图像融合技术来实现。

示例代码

import cv2
import numpy as np

# 读取图像
img1 = cv2.imread('path/to/image1.jpg')
img2 = cv2.imread('path/to/image2.jpg')

# 初始化特征检测器
sift = cv2.SIFT_create()

# 检测特征点和描述符
keypoints1, descriptors1 = sift.detectAndCompute(img1, None)
keypoints2, descriptors2 = sift.detectAndCompute(img2, None)

# 特征匹配
matcher = cv2.BFMatcher()
matches = matcher.knnMatch(descriptors1, descriptors2, k=2)

# 应用比率测试
good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append(m)

# 计算单应性矩阵
src_pts = np.float32([keypoints1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([keypoints2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
M, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)

# 拼接图像
width = img1.shape[1] + img2.shape[1]
height = max(img1.shape[0], img2.shape[0])
result = cv2.warpPerspective(img1, M, (width, height))
result[0:img2.shape[0], 0:img2.shape[1]] = img2

cv2.imshow('Panorama', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

3. 图像去噪与边缘检测

图像去噪和边缘检测是图像预处理的重要组成部分,有助于提高后续处理的效果。

3.1 图像去噪

图像去噪通常使用滤波技术(如高斯滤波、中值滤波等)来减少图像中的噪声。

示例代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image_path = 'path/to/noisy_image.jpg'
image = cv2.imread(image_path)

# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 高斯滤波去噪
blurred = cv2.GaussianBlur(gray_image, (5, 5), 0)

# 中值滤波去噪
median_blur = cv2.medianBlur(gray_image, 5)

# 可视化原图和去噪后的图像
fig, axs = plt.subplots(1, 3, figsize=(15, 5))
axs[0].imshow(gray_image, cmap='gray')
axs[0].set_title('Original Image')
axs[1].imshow(blurred, cmap='gray')
axs[1].set_title('Gaussian Blurred')
axs[2].imshow(median_blur, cmap='gray')
axs[2].set_title('Median Blurred')
plt.show()
3.2 边缘检测

边缘检测用于识别图像中对象的边界,常用的算法有Canny边缘检测、Sobel算子等。

示例代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image_path = 'path/to/image.jpg'
image = cv2.imread(image_path)

# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Canny边缘检测
edges = cv2.Canny(gray_image, threshold1=50, threshold2=150)

# Sobel算子
sobelx = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=5)

# 可视化原图和边缘检测后的图像
fig, axs = plt.subplots(2, 2, figsize=(15, 10))
axs[0, 0].imshow(gray_image, cmap='gray')
axs[0, 0].set_title('Original Image')
axs[0, 1].imshow(edges, cmap='gray')
axs[0, 1].set_title('Canny Edges')
axs[1, 0].imshow(sobelx, cmap='gray')
axs[1, 0].set_title('Sobel X')
axs[1, 1].imshow(sobely, cmap='gray')
axs[1, 1].set_title('Sobel Y')
plt.show()
4. 图像融合与合成

图像融合是指将多张图像合并成一张图像,而图像合成则是在一张图像上添加另一张图像的一部分。

4.1 图像融合

图像融合通常用于创建HDR图像或增强图像细节。

示例代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image1 = cv2.imread('path/to/image1.jpg')
image2 = cv2.imread('path/to/image2.jpg')

# 转换为灰度图像
gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)

# 对比度拉伸
alpha = 0.5
beta = 0.5
gamma = 0
fusion = cv2.addWeighted(gray1, alpha, gray2, beta, gamma)

# 可视化原图和融合后的图像
fig, axs = plt.subplots(1, 3, figsize=(15, 5))
axs[0].imshow(gray1, cmap='gray')
axs[0].set_title('Image 1')
axs[1].imshow(gray2, cmap='gray')
axs[1].set_title('Image 2')
axs[2].imshow(fusion, cmap='gray')
axs[2].set_title('Fused Image')
plt.show()
4.2 图像合成

图像合成通常用于将两张图像的部分内容组合在一起,例如将一个人物移动到另一个背景中。

示例代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
foreground = cv2.imread('path/to/foreground.jpg')
background = cv2.imread('path/to/background.jpg')

# 调整大小
foreground = cv2.resize(foreground, (background.shape[1], background.shape[0]))

# 创建掩码
mask = np.zeros_like(foreground)
mask[:, :, 0] = foreground[:, :, 0] > 0
mask[:, :, 1] = foreground[:, :, 1] > 0
mask[:, :, 2] = foreground[:, :, 2] > 0

# 合成图像
synthesis = np.where(mask, foreground, background)

# 可视化原图和合成后的图像
fig, axs = plt.subplots(1, 3, figsize=(15, 5))
axs[0].imshow(cv2.cvtColor(foreground, cv2.COLOR_BGR2RGB))
axs[0].set_title('Foreground')
axs[1].imshow(cv2.cvtColor(background, cv2.COLOR_BGR2RGB))
axs[1].set_title('Background')
axs[2].imshow(cv2.cvtColor(synthesis, cv2.COLOR_BGR2RGB))
axs[2].set_title('Synthesized Image')
plt.show()

总结

通过本篇的深入探讨,你现在已经掌握了更多关于Python在图像处理领域的高级技术,包括目标检测与跟踪、图像拼接与全景图生成、图像去噪与边缘检测以及图像融合与合成。这些技术在实际应用中具有重要的价值,如智能监控、无人机航拍、医学影像分析、增强现实等领域。随着计算机视觉技术的不断发展,图像处理领域依然充满了无限的可能性。希望这些实战案例能够帮助你在图像处理的研究和实践中取得更大的进步。

标签:axs,续篇,进阶,gray,Python,image,cv2,图像,import
From: https://blog.csdn.net/suifengme/article/details/142304409

相关文章

  • 重看Python书的第十三天
    函数的递归函数是一种代码封装,能够被其他程序调用,当然也可以被函数自身的内部代码调用。这种函数定义中调用函数自身的方式称为递归。递归基例:存在一个或多个基例,不需要再次递归,它是确定的表达式。递归链条:所有递归都有一个链条,表现为函数功能的不同值调用。 递归构建......
  • 重看Python书的第十二天
    函数的返回值return语句用来结束函数并将程序返回到函数被调用的位置继续执行。return语句可以出现在函数中的任何部分,同时可以将0个,1个或多个函数运算的结果返回给函数被调用处的变量多个返回值当return返回多个值时,这些值形成了一个元组类型数据,由小括号和逗号分隔,例如(a,b......
  • python虚拟环境
    创建虚拟环境:在命令行中导航到你的项目目录,然后运行以下命令来创建虚拟环境:python-mvenvmyenvpython3-mvenvmyenv这里的myenv是虚拟环境的名称,你可以根据需要更改。激活虚拟环境:激活虚拟环境会将其置于活动状态,之后安装的任何包都会在这个环境中,而不是......
  • Python3.9.13与深度学习框架TensorFlow的完整详细安装教程
    一、Python与TensorFlow版本的关系        TensorFlow的不同版本适用不同的Python版本,这是因为TensorFlow需要与Python的特性保持一致,以便最优化性能和功能。以下是一些主要版本之间的对应关系:TensorFlow版本支持的Python版本2.10.x3.7,3.8,3.92.9.x3.7,......
  • Python(格式)
    一:课前作业讲解1,把下列合法的变量名标注起来正确格式:Transform,mesFactory_001,_varabale,_parame001,Monit_错误的格式:001human,002_mes012.json格式是非常重要的一种数据格式,它的基础格式如下:{      Key:value}其中,键(key)必须使用双引号包围,而值(value)可以是字符串......
  • 基于Python校园舆情管理系统设计与实现毕业设计项目
    基于Python校园舆情管理系统设计与实现毕业设计项目大家好,我是俊星学长,一名在Java圈辛勤劳作的码农。今日,要和大家分享的是一款基于Python校园舆情管理系统设计与实现毕业设计项目。项目源码以及部署相关事宜,请联系小村学长,文末会附上联系信息哦。......
  • Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了12篇文章,12个开源项目,1则音视频,全文2200字。以下是本期摘要:......
  • Python网络编程实战案例
    在当今信息技术高速发展的时代,网络编程成为了软件开发中不可或缺的一部分。Python,以其简洁的语法和强大的功能,成为了网络编程的热门选择。本文将通过几个实战案例,展示Python在网络编程中的应用,包括TCP服务器和客户端的创建、UDP通信、HTTP请求以及多线程服务器的实现。1.TCP......
  • 重生之我在Python中用for循环实现九九乘法表
    没错,我又重生了,重生在一个风平浪静的下午,与以往不同,我好像学会了一个新技能------for循环,不同以往,又紧密相连,我双目紧闭,应天地之号召,挥手拂袖便显仙法#控制列的表达式,共9列foriinrange(1,10):#每行共有1到i个算式forjinrange(1,i+1):#乘法表达......
  • 2024年华为OD机试真题-数组拼接-Python-OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精选c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述现在有多组整数数组,需......