OpenCV 与 Matplotlib 的结合使用:探索有趣的图像处理与可视化功能

news2024/12/25 13:00:48

        本文将讲述,将 OpenCVMatplotlib 相结合,可以充分利用两者的优势,实现丰富多彩的图像处理和数据可视化功能。本文将介绍几种有趣且实用的结合应用,并通过示例代码展示具体实现方式。在今后的博客中会扩展下面的十个基础实现以达到更好的应用效果。


目录

1. 基本图像显示与比较

2. 绘制图像直方图

3. 可视化图像处理步骤

4. 绘制轮廓与形状检测

5. 特征点检测与匹配可视化

6. 绘制热力图与颜色映射

7. 在图像上叠加绘图元素

8. 创建交互式可视化

9. 视频帧的实时可视化

10. 融合图像与数据分析

总结



1. 基本图像显示与比较

Matplotlib 提供了强大的绘图和显示功能,相较于 OpenCV 的 cv2.imshow,它支持在 Jupyter Notebook 等环境中直接显示图像,并且可以同时显示多张图像,方便进行对比。

        示例:显示原始图像与灰度图像

import cv2
import matplotlib.pyplot as plt

# 读取彩色图像
image = cv2.imread('example.jpg')
# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 将 BGR 图像转换为 RGB 格式
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 创建子图进行显示
plt.figure(figsize=(10,5))

plt.subplot(1,2,1)
plt.imshow(image_rgb)
plt.title('Original Image')
plt.axis('off')

plt.subplot(1,2,2)
plt.imshow(gray_image, cmap='gray')
plt.title('Grayscale Image')
plt.axis('off')

plt.show()

效果: 该示例同时显示了原始彩色图像和转换后的灰度图像,便于直观比较。


2. 绘制图像直方图

图像直方图是反映图像像素分布的重要工具,结合 OpenCV 和 Matplotlib,可以轻松绘制彩色和灰度图像的直方图,帮助分析图像的亮度和对比度等特性。

示例:绘制彩色图像的直方图

 
import cv2
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('example.jpg')
# 拆分通道
channels = cv2.split(image)
colors = ('b', 'g', 'r')
plt.figure(figsize=(10,5))
plt.title('Color Histogram')
plt.xlabel('Bins')
plt.ylabel('# of Pixels')

for (channel, color) in zip(channels, colors):
    # 计算直方图
    hist = cv2.calcHist([channel], [0], None, [256], [0, 256])
    # 绘制直方图
    plt.plot(hist, color = color)
    plt.xlim([0, 256])

plt.show()

效果: 该示例分别绘制了蓝、绿、红三个通道的像素分布直方图,可用于分析图像的颜色分布情况。


3. 可视化图像处理步骤

在图像处理中,经常需要经过多步操作才能达到预期效果。通过 Matplotlib,可以将各个处理步骤的结果以图像形式展示,方便理解和调试。

示例:边缘检测的各个步骤展示

 
import cv2
import matplotlib.pyplot as plt

# 读取图像并转换为灰度
image = cv2.imread('example.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 高斯模糊
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

# 边缘检测
edges = cv2.Canny(blurred, 50, 150)

# 显示结果
titles = ['Original Image', 'Grayscale', 'Blurred', 'Canny Edges']
images = [cv2.cvtColor(image, cv2.COLOR_BGR2RGB), gray, blurred, edges]

plt.figure(figsize=(15,5))
for i in range(4):
    plt.subplot(1,4,i+1)
    plt.imshow(images[i], cmap='gray' if i > 0 else None)
    plt.title(titles[i])
    plt.axis('off')

plt.show()

效果: 该示例依次展示了原始图像、灰度图像、高斯模糊处理后的图像和最终的边缘检测结果,清晰地展示了处理流程。


4. 绘制轮廓与形状检测

通过 OpenCV 提取图像中的轮廓信息,并使用 Matplotlib 进行可视化,可以实现对图像中形状和物体的检测与标注。

示例:检测并绘制图像中的轮廓

 
import cv2
import matplotlib.pyplot as plt

# 读取图像并转换为灰度
image = cv2.imread('shapes.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)

# 显示结果
plt.figure(figsize=(10,5))
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Detected Contours')
plt.axis('off')
plt.show()

效果: 该示例在原始图像上绘制了检测到的轮廓,绿色线条清晰地标出了各个形状的边界。


5. 特征点检测与匹配可视化

在计算机视觉中,特征点检测与匹配是关键步骤。利用 OpenCV 检测特征点,并用 Matplotlib 可视化匹配结果,可以直观地展示两张图像之间的对应关系。

示例:使用 ORB 算法进行特征点匹配并可视化

 
import cv2
import matplotlib.pyplot as plt

# 读取两张待匹配的图像
img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)

# 初始化 ORB 检测器
orb = cv2.ORB_create()

# 检测关键点并计算描述子
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)

# 使用暴力匹配器进行匹配
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)

# 按距离排序
matches = sorted(matches, key=lambda x: x.distance)

# 绘制前 20 个匹配结果
img_matches = cv2.drawMatches(img1, kp1, img2, kp2, matches[:20], None, flags=2)

# 显示结果
plt.figure(figsize=(15, 10))
plt.imshow(img_matches, cmap='gray')
plt.title('ORB Feature Matching')
plt.axis('off')
plt.show()

效果: 该示例展示了两张图像之间的特征匹配结果,直线连接了对应的特征点,方便观察匹配的准确性。


6. 绘制热力图与颜色映射

将图像数据转换为热力图形式,可以突出显示不同区域的特征强度。Matplotlib 提供了丰富的颜色映射选项,可以与 OpenCV 的图像数据轻松结合。

示例:显示图像的梯度强度热力图

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

# 读取灰度图像
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)

# 计算梯度
sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5)
gradient_magnitude = np.sqrt(sobelx**2 + sobely**2)

# 显示热力图
plt.figure(figsize=(10,5))
plt.imshow(gradient_magnitude, cmap='hot')
plt.title('Gradient Magnitude Heatmap')
plt.axis('off')
plt.colorbar()
plt.show()

效果: 该示例将图像的梯度强度以热力图形式展示,高强度区域以暖色显示,突出边缘和纹理细节。


7. 在图像上叠加绘图元素

结合 Matplotlib 的绘图功能,可以在图像上叠加各种绘图元素,如曲线、文字、标记等,增强图像的表达力。

示例:在图像上绘制函数曲线和标注

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

# 创建空白图像
image = np.zeros((500, 500, 3), dtype=np.uint8)

# 使用 Matplotlib 绘制正弦曲线并叠加到图像上
x = np.linspace(0, 4 * np.pi, 500)
y = 250 + 100 * np.sin(x)

plt.figure(figsize=(5,5))
plt.imshow(image)
plt.plot(x, y, color='yellow', linewidth=2)
plt.text(50, 50, 'Sine Wave', color='white', fontsize=15)
plt.axis('off')
plt.show()

效果: 该示例在黑色背景图像上绘制了黄色的正弦曲线,并添加了文字标注,展示了图像与绘图元素的融合。


8. 创建交互式可视化

利用 Matplotlib 的交互式功能,可以创建可调节参数的图像处理应用,实时观察参数变化对结果的影响。

示例:使用滑块调整图像阈值

 
import cv2
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

# 读取灰度图像
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)

# 初始阈值
initial_threshold = 127

# 创建图形和轴
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)
thresholded = cv2.threshold(image, initial_threshold, 255, cv2.THRESH_BINARY)[1]
l = ax.imshow(thresholded, cmap='gray')
ax.set_title('Threshold Adjustment')
plt.axis('off')

# 创建阈值滑块
axcolor = 'lightgoldenrodyellow'
ax_threshold = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
threshold_slider = Slider(ax_threshold, 'Threshold', 0, 255, valinit=initial_threshold)

# 更新函数
def update(val):
    threshold = threshold_slider.val
    thresholded = cv2.threshold(image, threshold, 255, cv2.THRESH_BINARY)[1]
    l.set_data(thresholded)
    fig.canvas.draw_idle()

threshold_slider.on_changed(update)

plt.show()

效果: 该示例创建了一个带有滑块的交互式界面,用户可以通过滑动调整阈值,实时观察二值化结果的变化。


9. 视频帧的实时可视化

将 OpenCV 处理的视频帧与 Matplotlib 结合,可以实现对视频流的实时分析和可视化,适用于视频监控和实时检测等应用。

示例:实时显示摄像头视频并绘制帧差异

 
import cv2
import matplotlib.pyplot as plt

# 初始化摄像头
cap = cv2.VideoCapture(0)

# 初始化 Matplotlib
plt.ion()
fig, ax = plt.subplots()

ret, frame1 = cap.read()
ret, frame2 = cap.read()

while True:
    # 计算帧差异
    diff = cv2.absdiff(frame1, frame2)
    gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)

    # 更新 Matplotlib 图像
    ax.imshow(cv2.cvtColor(frame2, cv2.COLOR_BGR2RGB))
    ax.set_title('Live Video Feed')
    plt.pause(0.01)
    ax.clear()

    frame1 = frame2
    ret, frame2 = cap.read()
    if not ret:
        break

cap.release()
plt.ioff()
plt.show()

效果: 该示例实时捕获摄像头视频,并在 Matplotlib 窗口中显示,每帧之间的差异可用于运动检测等应用。


10. 融合图像与数据分析

在处理包含数据信息的图像时,可以将图像内容与相关数据分析结果结合展示,提供更全面的可视化效果。

示例:在医学图像上叠加统计信息

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

# 读取医学图像(如 MRI 扫描)
image = cv2.imread('mri_scan.jpg', cv2.IMREAD_GRAYSCALE)

# 计算图像中感兴趣区域的平均强度
roi = image[100:200, 100:200]
mean_intensity = np.mean(roi)

# 显示图像并叠加统计信息
plt.figure(figsize=(8,8))
plt.imshow(image, cmap='gray')
plt.title('MRI Scan')
plt.axis('off')

# 绘制 ROI 矩形
rect = plt.Rectangle((100,100), 100, 100, linewidth=2, edgecolor='r', facecolor='none')
plt.gca().add_patch(rect)

# 显示平均强度
plt.text(110, 220, f'Mean Intensity: {mean_intensity:.2f}', color='red', fontsize=12)

plt.show()

效果: 该示例在医学图像上标注了感兴趣区域,并显示了该区域的平均强度信息,辅助医学诊断和分析。


总结

通过将 OpenCV 强大的图像处理能力与 Matplotlib 丰富的绘图和可视化功能相结合,我们可以实现从简单的图像显示到复杂的数据分析和交互式应用等多种有趣且实用的功能。这种结合不仅增强了图像处理的直观性和可解释性,还拓展了计算机视觉应用的可能性。

在实践中,可以根据具体需求,灵活运用两者的功能,实现更加丰富多样的图像处理和数据可视化任务。


参考资料:

  • OpenCV 官方文档: https://docs.opencv.org/
  • Matplotlib 官方文档: https://matplotlib.org/stable/contents.html

注: 在运行上述示例代码前,请确保安装了相应的库,并准备好合适的图像文件。

大家可以采用清华源安装库如下:Simple Index

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2103716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宝贝甜梦秘籍!康姿百德柔压磁性枕豪华款守护成长每一夜

科学护航童年梦!康姿百德豪华柔压磁性枕,给孩子五星级的睡眠享受 孩子的成长过程中,良好的睡眠环境至关重要。而康姿百德柔压磁性枕(豪华款),凭借其独特的设计和材料,成为了孩子成长过程中不可…

乐凡三防平板高性能为稳定运行保驾护航

随着科技进步的浪潮,三防工业平板电脑在自动化生产、设备监控及数据收集等场景中日益彰显其关键作用。但在特定环境,比如户外探险、紧急救援或电力供应不稳定的场合,维持设备的持续运行成为了一大挑战。因此,开发一款配备可更换电…

运动耳机怎么选购?解密最值得购买的五大品牌!

​到了2024年,开放式耳机已经成为耳机界的大热门。它们的好处是,既能让你听得健康,戴着又舒服,还能一边听歌一边留意周围的声音,这对于喜欢户外活动的人来说,能提高安全意识,是个很好的优势。作…

GaussDB关键技术原理:高弹性(三)

书接上文GaussDB关键技术原理:高弹性(二)从优化器剪枝、执行器两方面对hashbucket进行了解读,本篇将从段页式技术方面继续介绍GaussDB高弹性技术。 3 段页式 3.1 段页式存储 根据前文的介绍,hashbucket需要对文…

数据库审计是什么?主要用在哪些场景呢?

数据库审计是什么?主要用在哪些场景呢? 数据库审计 数据库审计是指对数据库系统中的操作进行记录、监控和分析的过程,用于检查和评估数据库的安全性、合规性和完整性。数据库审计可以为组织提供重要的安全保障和合规性需求的满足。本文将介…

嵌入式24千兆电口+4万兆光口管理型三层交换机RTL9301模块

核心模块概述: 嵌入式RTL9301模块可以支持4口万兆上联24口千兆三层管理型以太网交换机,也就是最多可以提供24个10/100/1000自适应电口、4个10 Gb SFP 端口、1个console口、1个USB串口。 完善的安全控制策略及CPU保护策略(CPU protect policy)提高容错能力&#xff0…

LLM大模型学习:LLM常见问题(思维链部分)

1. 什么是思维链提示? 思维链(Chain-of-thought,CoT),指的是一系列有逻辑关系的思考步骤,形成一个完整的思考过程。人在日常生活中,随时随地都会用思维链来解决问题,比如工作、读书经常用到的思维导图&…

【git】git安装方法

1 Git 的下载 这个就需要去 Git 官网下载对应系统的软件了,下载地址为 git-scm.com或者gitforwindows.org,或者阿里镜像(感谢评论区的星悸迷航同学) 上面的 git-scm 是 Git 的官方,里面有不同系统不同平台的安装包和…

Nhanes数据(复杂调查数据)绘制限制立方样条(rcs)函数svyggrcs1.8尝鲜版发布

临床上,因变量和临床的结局有时候不是线性关系,而回归模型有一个重要的假设就是自变量和因变量呈线性关联,因此非线性关系模型用回归分析来拟合受到限制。因此,一个更好的解决方法是拟合自变量与因变量之间的非线性关系&#xff0…

智慧公厕:城市公共卫生管理的新篇章‌@卓振思众

在快节奏的现代生活中,公共厕所作为城市基础设施的重要组成部分,其使用体验和管理效率直接影响着市民的生活质量与城市形象。随着科技的飞速发展,智慧公厕应运而生,它以一种全新的姿态,为城市公共卫生管理带来了前所未…

【吊打面试官系列-Redis面试题】Pipeline 有什么好处,为什么要用 pipeline?

大家好,我是锋哥。今天分享关于 【Pipeline 有什么好处,为什么要用 pipeline?】面试题,希望对大家有帮助; Pipeline 有什么好处,为什么要用 pipeline? 1000道 互联网大厂Java工程师 精选面试题…

ABAP 报错 提示 Use the associated entity XXX

警告,我们可以忽略,但是报错了,却不知道怎么改? 后面发现是 在ABAP里面 对CDS的字段做 substring 或者concat是不允许的

常见加解密算法06 - 分组密码的填充与工作模式

各位英姿焕发,风华正茂的读者们你们好啊,今天我们讨论一下分组密码的填充与工作模式。 分组密码中,需要将明文按指定大小进行分组,由于明文并非指定大小的整数倍,因此在明文的最后一个分组需要将其填充至加密算法所要…

向 ADC 模型和 DAC 建模添加低通滤波器

与单音测试信号相比,双音测试信号可提供更多有关 ADC 性能的信息。您的作者的模型与特定 ADC 的制造商模型非常匹配,因此可以方便地运行误码率模拟。该 ADC 恰好具有非常宽的输入带宽。 对于带宽较低的 ADC,添加如图 1 所示的低通滤波器将提…

[SUCTF 2018]annonymous1

知识点&#xff1a; 匿名函数创建其实有自己的名字&#xff08;%00lambda_%d&#xff09; 进入页面开始代码审计. <?php // 使用 create_function 创建一个匿名函数&#xff0c;该函数调用 die() 函数并执行 cat flag.php 命令&#xff08;在服务器上执行&#xff0c;如果…

BFF层聚合查询服务异步改造及治理实践

首先感谢王晓老师的[ 接口优化的常见方案实战总结]一文总结&#xff0c;恰巧最近在对稳健理财BFF层聚合查询服务优化治理&#xff0c;针对文章内的串行改并行章节进行展开&#xff0c;分享下实践经验&#xff0c;主要涉及原同步改异步的过程、全异步化后衍生的问题以及治理方面…

实训day42(9.3)

⼀、编排分类 单机容器编排: docker-compose 容器集群编排: docker swarm、mesosmarathon、kubernetes 应⽤编排: ansible(模块&#xff0c;剧本&#xff0c;⻆⾊) ⼆、系统管理进化史 1. 传统部署时代 早期&#xff0c;各个组织是在物理服务器上运⾏应⽤程序。 由于⽆法限…

Mac搭建音视频开发环境

1.安装软件 打开终端&#xff0c;依次输入如下命令&#xff1a; brew install ffmpeg brew install qt brew install --cask qt-creator 2.配置qt 打开Qt Creator&#xff0c;在首选项—>Qt版本设置qt路径 3.设置默认Kits 3.创建项目 输入项目名称和存放目录&#xff0c…

在国产芯片上实现YOLOv5/v8图像AI识别-【4.2】RK3588获取USB摄像头图像推流RTSP更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频&#xff1a;https://www.bilibili.com/video/BV1or421T74f 前言…

大屏适配各分辨率屏幕方案及整合动画性能

每个公司都不可避免会有一些数据可视化的需求&#xff0c;大数据时代&#xff0c;更是一发不可收拾&#xff0c;各种花里胡哨的大屏效果&#xff0c;让前端既烦恼又有些许刺激&#xff0c;刺激是新的挑战带来的&#xff0c;完成了各种风骚的展示效果&#xff0c;那种成就感让人…