当前位置: 首页 > news >正文

图像边缘检测:技术原理与算法解析

图像边缘检测是计算机视觉和图像处理中的一个核心任务,它旨在识别图像中亮度变化明显的点,从而识别出图像的边缘。边缘是图像中的重要特征,对于后续的图像分析、物体识别和图像分割等任务具有至关重要的作用。本文将深入探讨图像边缘检测的技术原理,并结合作者自己的理解,用代码实例来具体说明。

第一部分:边缘检测的基本概念

边缘检测的目标

边缘检测的目标是检测图像中亮度变化明显的点,这些点通常对应于物体轮廓或形状的转折处。边缘检测的结果通常是一个边缘图,其中包含图像中的所有边缘及其位置。

边缘检测的重要性

边缘检测是许多高级图像处理任务的基础,如轮廓提取、形状识别和图像分割等。边缘检测的结果可以用于后续的图像分析和计算机视觉任务。

边缘检测的挑战

  1. 噪声干扰:图像中的噪声可能会影响边缘检测的准确性。
  2. 边缘定位:边缘检测需要准确地定位边缘的位置,这可能是一个挑战。
  3. 边缘类型:图像中的边缘可能具有不同的类型,如阶跃边缘、屋顶边缘等,这需要不同的处理方法。

代码实例:边缘检测的基本概念

为了展示边缘检测的基本概念,我们可以使用Python的OpenCV库来显示一个图像的边缘。

import cv2
import numpy as np# 读取图像
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)# 显示原始图像
cv2.imshow('Original Image', image)# 使用Canny边缘检测
edges = cv2.Canny(image, 100, 200)# 显示边缘检测后的图像
cv2.imshow('Edges', edges)# 等待所有窗口关闭
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们首先使用cv2.imread()函数来读取图像。然后,我们使用cv2.imshow()函数来显示原始图像和边缘检测后的图像。我们使用cv2.Canny()函数来进行Canny边缘检测。最后,我们使用cv2.waitKey()函数等待所有窗口关闭。

在下一部分中,我们将详细介绍Canny边缘检测算法的工作原理,并使用Python的OpenCV库来实现这个算法。我们将讨论Canny边缘检测的步骤,包括非极大值抑制和双阈值技术。

第二部分:Canny边缘检测算法

Canny边缘检测算法概述

Canny边缘检测算法是一种经典的边缘检测方法,它由John F. Canny在1986年提出。Canny边缘检测算法以其高定位精度和低错误率而闻名,它包含以下几个关键步骤:

  1. 使用高斯滤波器进行预处理:通过使用高斯滤波器来平滑图像,减少噪声干扰。
  2. 计算梯度:计算图像的梯度,以确定边缘的方向和强度。
  3. 非极大值抑制:在梯度图像上进行非极大值抑制,以突出边缘。
  4. 双阈值技术:使用双阈值技术来确定边缘的边界。
  5. 滞后阈值处理:通过滞后阈值处理来连接边缘。

代码实例:Canny边缘检测算法

现在,我们将使用Python的OpenCV库来实现Canny边缘检测算法。我们将使用前面创建的图像数据来进行Canny边缘检测。

import cv2
import numpy as np# 读取图像
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)# 使用高斯滤波器进行预处理
smoothed_image = cv2.GaussianBlur(image, (5, 5), 0)# 计算梯度
gradient_x = cv2.Sobel(smoothed_image, cv2.CV_64F, 1, 0, ksize=5)
gradient_y = cv2.Sobel(smoothed_image, cv2.CV_64F, 0, 1, ksize=5)
gradient_magnitude = cv2.magnitude(gradient_x, gradient_y)
gradient_direction = cv2.phase(gradient_x, gradient_y, angleInDegrees=True)# 计算非极大值抑制
non_max_suppression = cv2.dilate(gradient_magnitude, None) - cv2.erode(gradient_magnitude, None)# 使用双阈值技术确定边缘的边界
low_threshold = 0.05 * np.max(gradient_magnitude)
high_threshold = 0.15 * np.max(gradient_magnitude)
edges = cv2.Canny(non_max_suppression, low_threshold, high_threshold)# 显示Canny边缘检测后的图像
cv2.imshow('Canny Edges', edges)# 等待所有窗口关闭
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们首先使用cv2.imread()函数来读取图像。然后,我们使用cv2.GaussianBlur()函数进行高斯滤波,使用cv2.Sobel()函数计算梯度,使用cv2.magnitude()cv2.phase()函数计算梯度的强度和方向。我们使用cv2.dilate()cv2.erode()函数进行非极大值抑制,使用cv2.Canny()函数进行Canny边缘检测。最后,我们使用cv2.imshow()函数显示Canny边缘检测后的图像,并使用cv2.waitKey()函数等待所有窗口关闭。

通过本部分的学习,我们了解了Canny边缘检测算法的工作原理,以及如何使用OpenCV库来实现这个算法。Canny边缘检测算法是一种高效的边缘检测方法,可以用于各种图像处理和计算机视觉任务。随着技术的不断进步,Canny边缘检测算法将继续发展,并为解决更多复杂的问题和挑战提供支持。

第三部分:Sobel边缘检测算法

Sobel边缘检测算法概述

Sobel边缘检测算法是一种基于导数的边缘检测方法,它通过计算图像的水平和垂直方向上的梯度值来检测图像中的边缘。Sobel边缘检测算法简单且易于实现,适用于检测相对明显的边缘。

Sobel边缘检测算法的步骤

  1. 使用Sobel算子计算梯度:Sobel算子是一种特殊的卷积核,用于计算图像在水平和垂直方向上的梯度。
  2. 非极大值抑制:在梯度图像上进行非极大值抑制,以突出边缘。
  3. 阈值处理:使用阈值处理来确定边缘的边界。

代码实例:Sobel边缘检测算法

现在,我们将使用Python的OpenCV库来实现Sobel边缘检测算法。我们将使用前面创建的图像数据来进行Sobel边缘检测。

import cv2
import numpy as np# 读取图像
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)# 使用Sobel算子进行边缘检测
edges = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5)# 显示Sobel边缘检测后的图像
cv2.imshow('Sobel Edges', edges)# 等待所有窗口关闭
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们首先使用cv2.imread()函数来读取图像。然后,我们使用cv2.Sobel()函数进行Sobel边缘检测。最后,我们使用cv2.imshow()函数显示Sobel边缘检测后的图像,并使用cv2.waitKey()函数等待所有窗口关闭。

通过本部分的学习,我们了解了Sobel边缘检测算法的工作原理,以及如何使用OpenCV库来实现这个算法。Sobel边缘检测算法是一种简单的边缘检测方法,适用于检测相对明显的边缘。随着技术的不断进步,Sobel边缘检测算法将继续发展,并为解决更多复杂的问题和挑战提供支持。

在下一部分中,我们将详细介绍Roberts边缘检测算法的工作原理,并使用Python的OpenCV库来实现这个算法。我们将讨论Roberts边缘检测算法的步骤,包括计算水平和垂直方向上的差分值。

第四部分:Roberts边缘检测算法

Roberts边缘检测算法概述

Roberts边缘检测算法是一种基于差分的边缘检测方法,它通过计算图像在水平和垂直方向上的差分值来检测图像中的边缘。Roberts边缘检测算法适用于检测较细的边缘,尤其适用于小物体边缘的检测。

Roberts边缘检测算法的步骤

  1. 使用Roberts算子计算差分:Roberts算子是一种特殊的卷积核,用于计算图像在水平和垂直方向上的差分值。
  2. 非极大值抑制:在差分图像上进行非极大值抑制,以突出边缘。
  3. 阈值处理:使用阈值处理来确定边缘的边界。

代码实例:Roberts边缘检测算法

现在,我们将使用Python的OpenCV库来实现Roberts边缘检测算法。我们将使用前面创建的图像数据来进行Roberts边缘检测。

import cv2
import numpy as np# 读取图像
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)# 使用Roberts算子进行边缘检测
edges = cv2.Roberts(image)# 显示Roberts边缘检测后的图像
cv2.imshow('Roberts Edges', edges)# 等待所有窗口关闭
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们首先使用cv2.imread()函数来读取图像。然后,我们使用cv2.Roberts()函数进行Roberts边缘检测。最后,我们使用cv2.imshow()函数显示Roberts边缘检测后的图像,并使用cv2.waitKey()函数等待所有窗口关闭。

通过本部分的学习,我们了解了Roberts边缘检测算法的工作原理,以及如何使用OpenCV库来实现这个算法。Roberts边缘检测算法适用于检测较细的边缘,尤其适用于小物体边缘的检测。随着技术的不断进步,Roberts边缘检测算法将继续发展,并为解决更多复杂的问题和挑战提供支持。

在下一部分中,我们将详细介绍Prewitt边缘检测算法的工作原理,并使用Python的OpenCV库来实现这个算法。我们将讨论Prewitt边缘检测算法的步骤,包括计算水平和垂直方向上的差分值。

第五部分:Prewitt边缘检测算法

Prewitt边缘检测算法概述

Prewitt边缘检测算法是一种基于差分的边缘检测方法,它通过计算图像在水平和垂直方向上的差分值来检测图像中的边缘。Prewitt边缘检测算法适用于检测相对明显的边缘,但相对于Sobel算子,它的性能可能稍逊一筹。

Prewitt边缘检测算法的步骤

  1. 使用Prewitt算子计算差分:Prewitt算子是一种特殊的卷积核,用于计算图像在水平和垂直方向上的差分值。
  2. 非极大值抑制:在差分图像上进行非极大值抑制,以突出边缘。
  3. 阈值处理:使用阈值处理来确定边缘的边界。

代码实例:Prewitt边缘检测算法

现在,我们将使用Python的OpenCV库来实现Prewitt边缘检测算法。我们将使用前面创建的图像数据来进行Prewitt边缘检测。

import cv2
import numpy as np# 读取图像
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)# 使用Prewitt算子进行边缘检测
edges = cv2.Prewitt(image)# 显示Prewitt边缘检测后的图像
cv2.imshow('Prewitt Edges', edges)# 等待所有窗口关闭
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们首先使用cv2.imread()函数来读取图像。然后,我们使用cv2.Prewitt()函数进行Prewitt边缘检测。最后,我们使用cv2.imshow()函数显示Prewitt边缘检测后的图像,并使用cv2.waitKey()函数等待所有窗口关闭。

通过本部分的学习,我们了解了Prewitt边缘检测算法的工作原理,以及如何使用OpenCV库来实现这个算法。Prewitt边缘检测算法适用于检测相对明显的边缘,但相对于Sobel算子,它的性能可能稍逊一筹。随着技术的不断进步,Prewitt边缘检测算法将继续发展,并为解决更多复杂的问题和挑战提供支持。

在下一部分中,我们将总结本系列文章的内容,并探讨图像边缘检测技术的发展趋势和未来展望。我们将讨论不同边缘检测算法的优缺点,以及如何根据具体应用场景选择合适的边缘检测方法。

第六部分:图像边缘检测技术的未来展望

边缘检测技术的优缺点

  • 优点

    • Sobel边缘检测:简单、快速,适用于检测明显的边缘。
    • Canny边缘检测:高定位精度,低错误率,能够检测出精确的边缘。
    • Roberts边缘检测:适用于检测较细的边缘,特别是小物体边缘。
    • Prewitt边缘检测:适用于检测相对明显的边缘,但性能可能稍逊于Sobel算子。
  • 缺点

    • 对噪声敏感:所有这些方法都对噪声比较敏感,需要预先进行噪声抑制。
    • 边缘定位不精确:在某些情况下,边缘定位可能不够精确。
    • 无法检测所有类型的边缘:不同类型的边缘可能需要不同的处理方法。

选择合适的边缘检测方法

选择合适的边缘检测方法取决于具体应用场景。例如,如果需要快速检测明显的边缘,Sobel算子是一个不错的选择。如果需要检测精确的边缘,Canny边缘检测可能更合适。对于较细的边缘或小物体边缘,Roberts边缘检测可能更有效。

图像边缘检测技术的发展趋势

  1. 深度学习在边缘检测中的应用:深度学习技术,如卷积神经网络(CNN),在边缘检测中取得了显著的进展。这些方法能够自动学习图像中的边缘特征,并能够适应不同的应用场景。

  2. 实时边缘检测:随着计算机处理能力的提高,实时边缘检测变得越来越重要。这需要高效且准确的边缘检测算法。

  3. 自适应边缘检测:未来的边缘检测算法可能会更加自适应,能够根据图像内容和噪声水平自动调整参数。

  4. 多尺度边缘检测:多尺度边缘检测能够同时检测不同尺度的边缘,这对于某些应用场景非常有用。

结论

图像边缘检测是计算机视觉和图像处理中的一个核心任务,它对于后续的图像分析、物体识别和图像分割等任务具有至关重要的作用。随着技术的不断进步,图像边缘检测技术将继续发展,为解决更多复杂的问题和挑战提供支持。

相关文章:

图像边缘检测:技术原理与算法解析

图像边缘检测是计算机视觉和图像处理中的一个核心任务,它旨在识别图像中亮度变化明显的点,从而识别出图像的边缘。边缘是图像中的重要特征,对于后续的图像分析、物体识别和图像分割等任务具有至关重要的作用。本文将深入探讨图像边缘检测的技…...

【Python星启航】少儿编程精英启蒙之旅 - 大纲

1. 计算机基础与编程环境 计算机的基本构成 编程语言与编程环境介绍 Python语言的特点与优势 安装与配置Python环境 2. 计算机历史与发展 计算机的起源与早期发展 个人电脑的普及与影响 当代计算机技术的前沿动态 计算机在未来教育中的角色 3. 编程基础概念 变量的定义与作…...

MATLAB的mat文件转换成json文件

内参矩阵 (K):相机的内在参数矩阵,通常是一个3x3的矩阵,包含了相机的焦距(fxfx​和fyfy​)和主点(光学中心)的坐标(cxcx​和cycy​)。这个矩阵将图像坐标转换为归一化相机…...

STM32第九课:STM32-基于标准库的42步进电机的简单I/O控制(附电机教程,看到即赚到)

一:步进电机简介 步进电机又称为脉冲电机,简而言之,就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩,步进电机的角位移量与输入的脉冲个数严格成正比…...

文件安全传输系统,如何保障信创环境下数据的安全传输?

文件安全传输系统是一套旨在保护数据在传输过程中的安全性和完整性的技术或解决方案。通常包括以下几个关键组件: 加密:使用强加密算法来确保文件在传输过程中不被未授权访问。 身份验证:确保只有授权用户才能访问或传输文件。 完整性校验…...

论文分享|AAAI2024‘北航|用大语言模型缩小有监督和无监督句子表示学习的差距

先说结论,大语言模型除了作为聊天的Agent,也可以为检索模型生成优质的文本对训练数据,从而做到无监督场景下也能够适用。这里分享一篇AAAI2024的工作,重点探讨如何生成比评估集更困难的训练数据来提升无监督句子表示学习质量&…...

vue3相比于vue2有哪些新特性?

Composition API: 组合式 API 提供了更灵活和可组合的方式来组织代码。它允许将逻辑功能集中在一起,而不是分散在生命周期钩子中。 import { ref, reactive, computed, watch } from vue;export default {setup() {const count ref(0);const state r…...

Gooxi受邀参加第三届中国数据中心服务器与设备峰会

7月2-3日,第三届中国数据中心服务器与设备峰会在上海召开,作为国内最聚焦在服务器领域的专业峰会,吸引了来自全国的行业专家、服务器与机房设备厂家,企业IT用户,数据中心业主共同探讨AIGC时代下智算中心设备的设计之道…...

3个实现前端节流的方法,附代码。

一、什么是前端节流 前端节流(Throttling)是一种优化前端性能的技术,它可以限制某些函数的执行频率,以提高性能和用户体验。节流可以用于控制一些高频事件的触发频率,比如滚动事件、鼠标移动事件、窗口大小改变事件等…...

uniapp 微信小程序根据后端返回的文件链接打开并保存到手机文件夹中【支持doc、docx、txt、xlsx等类型的文件】

项目场景: 我们在使用uniapp官方提供的uni.downloadFile以及uni.saveFile时,会发现这个文件下载的默认保存位置和我们预想的不太一样,容易找不到,而且没有提示,那么我们就需要把文件打开自己保存并且有提示保存到哪个…...

一群追星星的人,对AI的盼与怕

面对AI,有人害怕,有人期盼。 “AI和画画的、开网约车的、写东西的人有仇吗?”近来成了很多从业者的心声。大模型技术驱动了AI的能力进化过临界点,我们普通人根本就跟不上,或快或慢被淘汰。看起来,AI正在给人…...

同步IO、异步IO以及五种网络IO模式

目录 一、同步IO和异步IO 二、五种网络IO模式 1、阻塞IO 2、非阻塞IO 3、IO多路复用 3.1、SELECT 3.2、POLL 3.3、EPOLL 一、同步IO和异步IO 场景1: 小明去打开水,而开水塔此时没有水,小明在现场一直等待开水到来,或者不断…...

IP-Guard日志数据上传至 SYSLOG 服务器操作指南

一、功能简介 服务器支持把日志数据上传到 SYSLOG 服务器。 二、功能配置 2.1 数据目录移交设置 在服务器安装目录下 OServer3.ini 文件中,添加工具启动配置,配置五分钟内生效。 Path:设置移交目录路径,IPG 服务器会把收集完成的…...

线程安全(二)synchronized 的底层实现原理、锁升级、对象的内存结构

目录 一、基础使用1.1 不加锁的代码实现1.2 加锁的代码实现二、实现原理2.1 synchronized 简介2.2 对象监控器(Monitor)2.3 加锁过程第一步:判断 Owner 指向第二步:进入 EntryList 阻塞第三步:主动进入 WaitSet 等待三、锁升级3.1 对象的内存结构3.2 Mark Word 对象头3.3 …...

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十四)-无人机操控关键绩效指标(KPI)框架

引言 本文是3GPP TR 22.829 V17.1.0技术报告,专注于无人机(UAV)在3GPP系统中的增强支持。文章提出了多个无人机应用场景,分析了相应的能力要求,并建议了新的服务级别要求和关键性能指标(KPIs)。…...

数电基础 - 半导体存储

目录 一. 简介 一. 只读存储器 二. 可编程只读存储器 三. 可擦除的可编程只读存储器 四. 随机存储器 五. 存储器容量的扩展 六. 总结 一. 简介 半导体存储是数字电路中用于存储数据的重要组成部分。 半导体存储器主要分为两大类:随机存取存储器&#xff0…...

校园工会体育报名小程序的设计

管理员账户功能包括:系统首页,个人中心,赛事公告管理,球员管理,球队信息管理,比赛信息,比赛报名管理 微信端账号功能包括:系统首页,比赛信息,比赛报名&#…...

2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛--学习笔记

#Datawhale #NLP 1.背景介绍: 机器翻译(Machine Translation,简称MT)是自然语言处理领域的一个重要分支,其目标是将一种语言的文本自动转换为另一种语言的文本。机器翻译的发展可以追溯到20世纪50年代,经历…...

手机下载APP (uniapp/vue)

一、uniapp <template><view class"content"><view class"appName">{{ formData.appName }}</view><view class"appInfo">{{ formData.appInfo }}</view><image class"logo" :src"formDa…...

python数据可视化(5)——绘制饼图

课程学习来源&#xff1a;b站up&#xff1a;【蚂蚁学python】 【课程链接&#xff1a;【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接&#xff1a;【链接】】 Python绘制饼图分析北京天气 饼图&#xff0c;是一个划分为几个扇形的圆形统计图表&#xff…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...