前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度图像边缘提取及转储

深度图像边缘提取及转储

作者头像
云深无际
发布于 2023-02-27 11:13:53
发布于 2023-02-27 11:13:53
1.7K00
代码可运行
举报
文章被收录于专栏:云深之无迹云深之无迹
运行总次数:0
代码可运行

不会吧?不会吧?不会吧?不会有人忘记我还会写图像处理的代码吧?别说了,我知道你忘了,没关系,我会在这篇文章写一些很简短的代码实现常见的图像处理工作(别问为啥写不长,能力有限,20行开外就不受控制了)。

如何提取深度图像的边缘信息?

Sobel算子:Sobel算子是一种基于图像梯度的边缘检测算法,可以在x方向和y方向上计算图像的梯度,然后将两个梯度值合并成一个边缘强度值。通常可以使用Sobel算子来检测深度图像中的水平和垂直边缘。

Scharr算子是一种改进的Sobel算子,它使用了更大的卷积核来平滑图像,并在计算梯度时使用更准确的权重。Scharr算子在处理低对比度图像时表现更好。

Laplacian算子:Laplacian算子是一种基于二阶微分的边缘检测算法,可以检测出深度图像中的较强的边缘。该算子计算图像的拉普拉斯变换,并寻找其中的极值点作为边缘点。

深度边缘检测算法:除了基于梯度或微分的算法,还有一些专门针对深度图像的边缘检测算法。这些算法通常利用深度图像的信息来检测物体表面的变化,例如深度跳变或斜率变化等。

Canny算子是一种广泛使用的边缘检测算法,它采用了多步骤的边缘检测过程。首先,使用高斯滤波器平滑图像,然后计算图像的梯度和梯度方向。接下来,应用非极大值抑制和双阈值处理来提取边缘。最后,通过连接具有强度边缘的像素来获得完整的边缘。Canny算子在抑制噪声和保留真实边缘方面表现良好,通常被认为是一种比Sobel算子更优秀的边缘检测算法。

如何使用Python实现一个抽帧算法?

为啥会有这种东西?原因就是因为图像帧太多又不需要都处理~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2

def extract_frames(video_path, interval):
    # 打开视频文件
    cap = cv2.VideoCapture(video_path)
    # 计算视频总帧数和帧率
    frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    fps = cap.get(cv2.CAP_PROP_FPS)
    # 计算抽帧间隔
    interval_frames = int(interval * fps)
    # 初始化帧计数器和关键帧列表
    count = 0
    frames = []
    # 逐帧遍历视频
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        count += 1
        # 如果是关键帧,将其添加到关键帧列表中
        if count % interval_frames == 0:
            frames.append(frame)
    # 关闭视频文件
    cap.release()
    return frames

照指定的时间间隔从视频中抽取关键帧

上述代码中,extract_frames()函数接受视频文件路径和抽帧间隔作为输入参数,返回一个包含关键帧的列表。在函数内部,首先使用cv2.VideoCapture()函数打开视频文件,并使用cv2.CAP_PROP_FRAME_COUNT和cv2.CAP_PROP_FPS获取视频总帧数和帧率。然后,根据指定的抽帧间隔计算需要保留的关键帧,在逐帧遍历视频时根据帧计数器来判断当前帧是否为关键帧,如果是,则将其添加到关键帧列表中。最后,使用cap.release()函数关闭视频文件。

可以使用以下代码调用extract_frames()函数来从视频文件中抽取关键帧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
frames = extract_frames('video.mp4', 1)  # 抽取间隔为1秒的关键帧
for frame in frames:
    cv2.imshow('frame', frame)
    cv2.waitKey(0)
cv2.destroyAllWindows()

上述代码将抽取间隔设置为1秒,然后遍历返回的关键帧列表,使用cv2.imshow()函数显示每个关键帧,并在用户按下键盘后继续显示下一个关键帧。最后,使用cv2.destroyAllWindows()函数关闭所有显示窗口。

让我们使用一个算子来提取深度图像的边缘信息的函数:

Sobel算子是一种常用的边缘检测算子,它利用图像的灰度值变化来检测边缘。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2
import numpy as np

def extract_depth_edges(depth_img):
    # 计算Sobel算子的卷积核
    sobelx = cv2.Sobel(depth_img, cv2.CV_64F, 1, 0, ksize=3)
    sobely = cv2.Sobel(depth_img, cv2.CV_64F, 0, 1, ksize=3)
    # 计算梯度幅值和方向
    grad_mag = np.sqrt(sobelx ** 2 + sobely ** 2)
    grad_dir = np.arctan2(sobely, sobelx)
    # 将梯度幅值归一化到0-255之间
    grad_mag_norm = cv2.normalize(grad_mag, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
    # 将梯度方向转换为角度
    grad_dir_deg = (grad_dir * 180 / np.pi) % 180
    # 应用非极大值抑制
    grad_mag_nms = cv2.Canny(grad_mag_norm, 100, 200)
    return grad_mag_nms

上述代码中,extract_depth_edges()函数接受深度图像作为输入参数,返回提取的边缘信息。在函数内部,首先使用cv2.Sobel()函数计算x和y方向上的Sobel算子的卷积核,然后计算梯度幅值和方向。接下来,将梯度幅值归一化到0-255之间,并将梯度方向转换为角度。最后,应用非极大值抑制(Canny边缘检测算法)来提取边缘信息,并返回结果。

可以使用以下代码调用extract_depth_edges()函数来提取深度图像的边缘信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
depth_img = cv2.imread('depth_image.png', cv2.IMREAD_GRAYSCALE)
edges = extract_depth_edges(depth_img)
cv2.imshow('depth_edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

上述代码将读取深度图像并将其作为输入参数传递给extract_depth_edges()函数,然后显示提取的边缘信息。

有时候会有这样的需求,把提取的图像边缘保存在一个txt文件中:

假设我们已经提取了深度图像的边缘信息,存储在名为edge_img的NumPy数组中,边缘值的范围在0到255之间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np

# 假设我们已经提取了深度图像的边缘信息,存储在名为edge_img的NumPy数组中

# 将边缘值缩放到01之间
edge_img = edge_img / 255.0

# 将边缘信息转换为字符串格式
edge_str = np.array2string(edge_img, separator=',', formatter={'float_kind':lambda x: "%.5f" % x})

# 将字符串写入txt文件
with open('edge_info.txt', 'w') as f:
    f.write(edge_str)

在上面的代码中,我们将边缘值缩放到0到1之间,并将其转换为字符串格式。我们使用NumPy的array2string函数将数组转换为字符串,并使用逗号作为分隔符。我们还设置了formatter参数,将浮点数的小数位数限制为5位。最后,我们将字符串写入名为edge_info.txt的txt文件中。

请注意,在读取txt文件时,需要使用适当的代码将字符串转换回NumPy数组格式。

虽然一直写不了长代码,但是不妨碍我写在一起:

接下来把抽帧算法和保存边缘到txt的函数写在一起

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2
import numpy as np

def extract_edge(frame, threshold):
    # 使用高斯模糊平滑图像
    blurred = cv2.GaussianBlur(frame, (3, 3), 0)
    # 转换为灰度图像
    gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
    # 使用Canny算法提取边缘
    edges = cv2.Canny(gray, threshold, threshold * 2)
    return edges

def save_edges_to_txt(edges, filename):
    # 将边缘值缩放到01之间
    edges = edges / 255.0
    # 将边缘信息转换为字符串格式
    edge_str = np.array2string(edges, separator=',', formatter={'float_kind':lambda x: "%.5f" % x})
    # 将字符串写入txt文件
    with open(filename, 'w') as f:
        f.write(edge_str)

# 读取深度图像
depth_img = cv2.imread('depth_img.png')
# 指定抽帧间隔
interval = 10
# 提取深度图像边缘
edges = extract_edge(depth_img, 50)
# 抽帧,保留每隔interval个像素
sampled_edges = edges[::interval, ::interval]
# 将边缘信息保存到txt文件中
save_edges_to_txt(sampled_edges, 'edge_info.txt')

在上面的代码中,我们定义了一个extract_edge函数来提取深度图像的边缘,该函数使用高斯模糊平滑图像并使用Canny算法提取边缘。我们还定义了一个save_edges_to_txt函数,将边缘信息保存到txt文件中。

在主函数中,我们首先读取深度图像,然后指定抽帧间隔。我们使用extract_edge函数提取深度图像边缘,并使用抽帧算法保留每隔interval个像素。最后,我们使用save_edges_to_txt函数将提取的边缘信息保存到txt文件中。

应该是可以直接运行的,如果运行不了你再改改?

上面鄙人已经教了你把图像转换成txt的文件,如何把保存在txt文件里面的边缘信息恢复成图像呢?

你会不?

1.从txt文件中读取边缘信息字符串,并将其转换为NumPy数组。可以使用numpy.loadtxt函数将文件中的数据加载到NumPy数组中。

2。根据边缘信息数组的大小创建一个全零的数组,然后将边缘信息数组的值复制到全零数组的对应位置上。可以使用numpy.zeros函数创建全零数组,并使用numpy.put函数将边缘信息数组的值复制到全零数组的对应位置上。

3.对全零数组进行插值操作,以生成与原始深度图像相同大小的边缘图像。可以使用cv2.resize函数对全零数组进行插值操作。

4.对插值后的边缘图像进行二值化处理,以生成二值图像。可以使用cv2.threshold函数对插值后的边缘图像进行二值化处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2
import numpy as np

def load_edges_from_txt(filename, shape):
    # 从txt文件中读取边缘信息
    edge_str = np.loadtxt(filename, delimiter=',')
    # 创建全零数组
    edges = np.zeros(shape)
    # 将边缘信息复制到全零数组的对应位置上
    np.put(edges, np.arange(shape[0]*shape[1]), edge_str)
    # 对全零数组进行插值操作
    edges = cv2.resize(edges, (shape[1], shape[0]))
    # 对插值后的边缘图像进行二值化处理
    ret, edges = cv2.threshold(edges, 0, 255, cv2.THRESH_BINARY)
    return edges

# 读取深度图像
depth_img = cv2.imread('depth_img.png')
# 获取深度图像大小
height, width = depth_img.shape[:2]
# 从txt文件中加载边缘信息,并恢复成图像
edges = load_edges_from_txt('edge_info.txt', (height//10, width//10))
# 显示原始深度图像和恢复的边缘图像
cv2.imshow('depth_img', depth_img)
cv2.imshow('edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们定义了一个load_edges_from_txt函数,该函数从txt文件中加载边缘信息,并将其恢复成图像。该函数首先使用numpy.loadtxt函数从文件中加载数据,并将其转换为NumPy数组。然后,该函数根据指定的图像大小创建一个全零数组,并使用numpy.put函数将边缘信息数组的值复制到全零数组的对应位置上。接下来,该函数对全零数组进行插值操作,并使用cv2.threshold函数对插值后的边缘图像进行二值化处理,生成二值图像。

最后一个代码,把1000x1000的图像信息转换到10x10的图像里面,应该怎么做?

使用图像缩放操作。可以使用OpenCV中的cv2.resize函数对原始图像进行缩放操作。该函数的输入参数包括原始图像、目标图像大小和插值方法等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2

# 读取原始图像
img = cv2.imread('original_image.png')
# 缩放图像
new_img = cv2.resize(img, (10, 10), interpolation=cv2.INTER_AREA)
# 显示原始图像和缩放后的图像
cv2.imshow('original', img)
cv2.imshow('new', new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们使用cv2.imread函数读取原始图像,然后使用cv2.resize函数对原始图像进行缩放操作,将其缩放为10x10的图像。在cv2.resize函数中,我们将目标图像大小设置为(10, 10),并将插值方法设置为cv2.INTER_AREA。最后,我们使用cv2.imshow函数显示原始图像和缩放后的图像。

代码没有测试,写20行代码测鸡毛,应该是错不了的,祝你Copy的开心!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python opencv图像处理基础总结(六) 直线检测 圆检测 轮廓发现
我还有改变的可能性 一想起这一点 我就心潮澎湃 文章目录 一、直线检测 使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成 # 标准霍夫线变换 cv2.HoughLines(image, rho, theta, threshold, lines=None, srn=None, stn=None, min_theta=None, max_theta=None) image:经过边缘检测的输出图像,8位,单通道二进制源图像 rho:距离步长 theta:角度步长 threshold:阈值,只有
叶庭云
2020/09/17
8.9K0
Python opencv图像处理基础总结(六) 直线检测 圆检测 轮廓发现
使用Open3D提取深度图像的边缘信息
Open3D可以提取深度图像的边缘信息。边缘信息是深度图像中的重要特征之一,可以用于目标检测、场景分割、物体跟踪等任务。Open3D提供了一些函数来提取深度图像中的边缘信息,例如:
云深无际
2023/02/27
1.8K0
使用Open3D提取深度图像的边缘信息
番外篇: 图像梯度
还记得前面平滑图像中提到的滤波与模糊的区别吗?我们说低通滤波器是模糊,高通滤波器是锐化,这节我们就来看看高通滤波器。
CodecWang
2021/12/07
6780
番外篇: 图像梯度
OpenCV 入门之图像模糊与边缘检测
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。官方下载链接如下:https://opencv.org/releases/
用户6021899
2019/08/21
2.3K0
OpenCV 入门之图像模糊与边缘检测
[Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~
Eastmount
2023/09/01
9100
[Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子
OpenCV-Python教程(8、Canny边缘检测)
其中较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的第一个阈值用于将这些间断的边缘连接起来。
全栈程序员站长
2022/09/02
1.1K0
OpenCV-Python教程(8、Canny边缘检测)
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低
叶庭云
2020/09/17
1.3K0
Python opencv图像处理基础总结(五)  图像金字塔  图像梯度  Canny算法边缘提取
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效且概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低
叶庭云
2022/05/09
7620
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
OpenCV—python 边缘检测(Canny)「建议收藏」
边缘类型:简单分为4中类型,阶跃型、屋脊型、斜坡型、脉冲型,其中阶跃型和斜坡型是类似的,只是变化的快慢不同。
全栈程序员站长
2022/09/02
2.2K0
11: 边缘检测
cv2.Canny()进行边缘检测,参数2、3表示最低、高阈值,下面来解释下具体原理。
CodecWang
2021/12/07
5630
11: 边缘检测
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
在当今数字化社会中,图像处理 和 计算机视觉 技术应用广泛,从日常的图像编辑、滤镜应用到专业的智能安防、自动驾驶等领域,这些技术无处不在。对于开发者来说,OpenCV 是一个功能强大的库,提供了各种图像处理和计算机视觉的工具,广泛用于 Python 开发中。
半截诗
2024/10/09
4.4K1
基于OpenCV的图像梯度与边缘检测!
严格的说,梯度计算需要求导数。但是图像梯度的计算,是通过计算像素值的差得到梯度的近似值。图像梯度表示的是图像变化的速度,反映了图像的边缘信息。
Datawhale
2020/07/09
4.7K0
基于OpenCV的图像梯度与边缘检测!
OpenCV与图像处理(二)
以下代码均在python3.6,opencv4.2.0环境下试了跑一遍,可直接运行。
Must
2020/07/28
7180
OpenCV与图像处理(二)
OpenCV——Canny边缘检测(cv2.Canny())
Canny 边缘检测是一种使用多级边缘检测算法检测边缘的方法。1986 年,John F. Canny 发 表了著名的论文 A Computational Approach to Edge Detection,在该论文中详述了如何进行边缘 检测。
全栈程序员站长
2022/09/01
4.6K0
OpenCV——Canny边缘检测(cv2.Canny())
Python 图像边缘检测 | 利用 opencv 和 skimage 的 Canny 算法
CSDN 叶庭云:https://yetingyun.blog.csdn.net/
叶庭云
2022/12/28
2.5K0
Python 图像边缘检测 | 利用 opencv 和 skimage 的 Canny 算法
【OpenCV】Chapter9.边缘检测与图像分割
边缘检测的原理和matlab实现在我之前这两篇博文中提到过,这里不再赘述。 【计算机视觉】基础图像知识点整理【计算机视觉】数字图像处理基础知识题 此次来看OpenCV的实现方式。
zstar
2022/09/28
1.5K0
【OpenCV】Chapter9.边缘检测与图像分割
OpenCV实战:从图像处理到深度学习的全面指南
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列的C函数和少量C++类构成,同时提供Python、Java和MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
TechLead
2023/10/21
9620
OpenCV实战:从图像处理到深度学习的全面指南
[Python图像处理] 十七.图像锐化与边缘检测之Roberts、Prewitt、Sobel和Laplacian算子
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~
Eastmount
2023/02/28
2.9K0
[Python图像处理] 十七.图像锐化与边缘检测之Roberts、Prewitt、Sobel和Laplacian算子
CV学习笔记(十四):边缘检测
在这一篇文章里我们将去学习在计算机视觉中边缘检测的知识,并且去使用OpenCV来实现Canny边缘检测算法。
云时之间
2020/03/27
2.2K0
OpenCV边缘检测与视频读写
边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘的表现形式:
@小森
2024/03/15
1440
OpenCV边缘检测与视频读写
推荐阅读
相关推荐
Python opencv图像处理基础总结(六) 直线检测 圆检测 轮廓发现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验