DIP——边缘提取与分割

1.使用canny算法进行边缘提取
本实验比较简单,基本思路是对原图像进行一个高斯模糊处理,用于去噪,之后转换为灰度图,直接调用cv库中的canny记性边缘提取。若想直接得到彩色边缘,则通过按位与操作,将原始彩色图像和Canny边缘图像结合,得到彩色边缘图。具体完整代码如下:

# canny边缘提取实验
import cv2 as cv
import numpy as np

def edge_demo(image):
    # 对输入的图像进行高斯模糊,去噪,其中高斯核模板大小为3*3,标准差为0
    blurred = cv.GaussianBlur(image, (3, 3), 0)
    # 转换为灰度图
    gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)

    # 使用Canny边缘检测算法,设置低阈值为50,高阈值为150,提取图像的边缘。经验设定
    edge_output = cv.Canny(gray, 50, 150)
    # 在窗口中显示Canny边缘提取的结果图像。
    cv.imshow('Canny Edge', edge_output)
    # 彩色边缘提取
    # 通过按位与操作,将原始彩色图像和Canny边缘图像结合,得到彩色边缘图。
    dst = cv.bitwise_and(image, image, mask=edge_output)
    cv.imshow('Color Edge', dst)

# 绘图
src = cv.imread('ai.jpg')
cv.namedWindow('input image', cv.WINDOW_AUTOSIZE)
cv.imshow('input image', src)
edge_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

实验结果
原始图像:
在这里插入图片描述
灰度处理后canny算法提取的边缘图像
在这里插入图片描述
彩色边缘图像
在这里插入图片描述
2.使用大津法进行图像分割
本实验的原理也比较简单,使用大津法进行图像分割。大津法(Otsu’s Method)是一种自适应阈值选取的方法,通常用于图像分割。其目标是通过最大化类间方差(类间方差是指分割后的两个类别之间的方差)来找到一个合适的阈值,将图像分为两个类别,一类为前景,一类为背景。这里我们绘制灰度直方图,并且使用OpenCV的threshold函数进行OTSU阈值化。并且将计算得到的阈值存储在 ret1 中,OTSU阈值化后的图像存储在 th1 中。其完整代码如下:

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

image = cv2.imread("flying_horse.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

plt.figure(figsize=(6, 6))
plt.imshow(image, cmap="gray")
plt.title("Source Image")
plt.xticks([]), plt.yticks([])
plt.show()

# 显示直方图
plt.figure(figsize=(6, 6))
# np.histogram 用于计算直方图的频率和边界。
hist, bins = np.histogram(image.ravel(), 256, [0, 256])
plt.plot(hist, color='black')
plt.title("Histogram")
plt.xlabel("Pixel Value")
plt.ylabel("Frequency")
plt.show()

# 使用OpenCV的threshold函数进行OTSU阈值化。
# 将计算得到的阈值存储在 ret1 中,OTSU阈值化后的图像存储在 th1 中。
ret1, th1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)

# 显示OTSU阈值化后的图像
plt.figure(figsize=(6, 6))
plt.imshow(th1, cmap="gray")
plt.title("OTSU, Threshold: {}".format(ret1))
plt.xticks([]), plt.yticks([])
plt.show()

实验结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TailwindCSS 如何处理RTL布局模式

背景 TikTok作为目前全世界最受欢迎的APP,需要考虑兼容全世界各个地区的本地化语言和阅读习惯。其中对于阿拉伯语、波斯语等语言的阅读书写习惯是从右向左的,在前端有一个专有名字RTL模式,即Right-to-Left。 其中以阿拉伯语作为第一语言的人…

《算法与数据结构》答疑

答疑 问题一问题二问题三问题四 问题一 在匹配成功时,在返回子串位置那里,为什么不是i-t的长度啊,为什么还要加一 问题二 问题三 问题四 问:如果题目让我们构造一个哈夫曼树,像我发的这个例题的话,我画成我…

Kafka Streams:深度探索实时流处理应用程序

Apache Kafka Streams 是一款强大的实时流处理库,为构建实时数据处理应用提供了灵活且高性能的解决方案。本文将深入探讨 Kafka Streams 的核心概念、详细原理,并提供更加丰富的示例代码,以帮助读者深入理解和应用这一流处理框架。 1. Kafka…

uniapp自定义的日历(纯手写)

效果图&#xff1a; html&#xff1a; <!-- 年月 --><view class"box"><view class"box_time"><view class"time"><image click"lefts" :src"url/uploads/20231206/9d1fb520b12383960dca3c214d84fa0…

三. LiDAR和Camera融合的BEV感知算法-融合算法的基本介绍

目录 前言0. 简述1. 融合背景2. 融合思路3. 融合性能优劣总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第三章——LiDAR和Camera融合的BEV感知算法&am…

数据分析基础之《numpy(2)—ndarray属性》

一、ndarray的属性 1、属性方法 属性名字属性解释ndarray.shape数组维度的元组&#xff08;形状&#xff09;ndarray.ndim数组维数ndarray.size数组中的元素数量ndarray.itemsize一个数组元素的长度&#xff08;字节&#xff09;ndarray.dtype数组元素的类型使用方法 数组名.…

List 接口

1 List 接口 java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。 List是一种常用的集合类型&#xff0c;它可以存储任意类型的对象&#xff0c;也可以结合泛型来存储具体的类型对象&#xff0c;本质上就是一个容器。 1.1 List 类型介绍 有序性…

JVM进程缓存

引言 缓存在日常开发中启动至关重要的作用&#xff0c;由于是存储在内存中&#xff0c;数据的读取速度是非常快的&#xff0c;能大量减少对数据库的访问&#xff0c;减少数据库的压力。我们把缓存分为两类&#xff1a; 分布式缓存&#xff0c;例如Redis&#xff1a; 优点&…

Jmeter 请求签名api接口-BeanShell

Jmeter 请求签名api接口-BeanShell 项目签名说明编译扩展jar包jmeter 使用 BeanShell 调用jar包中的签名方法 项目签名说明 有签名算法的api接口本地不好测试&#xff0c;使用BeanShell 扩展jar 包对参数进行签名&#xff0c;接口签名算法使用 sha512Hex 算法。签名的说明如下…

web,Apache简述

一.HTTP请求访问的完整过程 1.建立连接 2.接收请求 3.处理请求 4.访问资源 服务器获取请求报文中请求的资源web服务器&#xff0c;即存放了web资源的服务器&#xff0c;负责向请求者提供对方请求的静态资源&#xff0c;或动态运行后生成的资源 静态资源&#xff1a;不需要…

IDEA 中文乱码解决方案

我的电脑Window11默认编码是UTF-8 1. console控制台乱码 修改IDEA目录下bin/idea64.exe.vmoptions文件&#xff0c;在文件结尾添加-Dfile.encodingUTF-8&#xff1b;保险起见&#xff0c;再修改下idea配置Help ->Edit Custom VM Options&#xff0c;同样是在文件结尾添加-D…

Spring Cloud Gateway + Nacos + LoadBalancer实现企业级网关

1. Spring Cloud Gateway 整合Nacos、LoadBalancer 实现企业级网关 前置工作&#xff1a; 创建 SpringBoot 多模块项目创建网关&#xff08;gateway-service&#xff09;、用户&#xff08;user-service&#xff09;模块用户模块添加 Nacos discovery 支持以及 Spring Web&am…

堆的基础功能实现和优先级队列

1. 堆的插入与删除 1.1 堆的插入 步骤&#xff1a; 1、先将元素放入到底层空间中(注意&#xff1a;一般是放到整个二叉树的最后一个叶子节点的后边&#xff0c;其次存储空间不够时需要扩容) 2、将最后新插入的节点向上调整&#xff0c;直到满足堆的性质&#xff08;判断该节点…

30 张图解 HTTP 常见的面试题

前言 在面试过程中&#xff0c;HTTP 被提问的概率还是比较高的 我搜集了 5 大类 HTTP 面试常问的题目&#xff0c;同时这 5 大类题跟 HTTP 的发展和演变关联性是比较大的&#xff0c;通过问答 图解的形式由浅入深的方式帮助大家进一步的学习和理解 HTTP 协议。 HTTP 基本概…

【数学建模】《实战数学建模:例题与讲解》第十讲-时间序列预测(含Matlab代码)

【数学建模】《实战数学建模&#xff1a;例题与讲解》第十讲-时间序列预测&#xff08;含Matlab代码&#xff09; 基本概念移动平均&#xff08;Moving Average, MA&#xff09;:指数平滑法&#xff08;Exponential Smoothing&#xff09;:季节性调整&#xff08;Seasonal Adju…

Anaconda安装

1.Anaconda下载路径 官网最新版本&#xff1a;https://www.anaconda.com/products/distribution/ 官网历史版本&#xff1a;https://repo.anaconda.com/archive/ 清华大学开源软件镜像站&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 2.和python版本关系…

GD32F30X-RT-Thread学习-线程管理

1. 软硬件平台 GD32F307E-START Board开发板MDK-ARM Keil 2.RT-Thread Nano 3.RT-Thread 内核学习-线程管理 ​ 在多线程操作系统中&#xff0c;可以把一个复杂的应用分解成多个小的、可调度的、序列化的程序单元&#xff0c;当合理地划分任务并正确地执行时&#xff0c;这…

Java JVM类加载机制原理剖析

目录 前言一、什么是类加载二、类加载子系统三、类的加载过程2.1、加载2.2、验证2.3、准备2.4、解析2.5、初始化 四、类加载器(ClassLoader) 前言 Java类要加载到JVM中的&#xff0c;会经过一系列的加载过程&#xff0c;这个过程就是在类加载子系统中实现的&#xff0c;当我们用…

函数栈帧的创建和销毁

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 1. 什么是函数栈帧 2. 理解函数栈帧能解决什么问题呢&#xff1f; 3. 函数栈帧的创建和销毁解析 3.1 什么是栈&#xff1f; 3.2 认识相关寄存器和汇编指令 3.3…

【深度学习】注意力机制(一)

本文介绍一些注意力机制的实现&#xff0c;包括SE/ECA/GE/A2-Net/GC/CBAM。 目录 一、SE&#xff08;Squeeze-and-Excitation&#xff09; 二、ECA&#xff08;Efficient Channel Attention&#xff09; 三、GE&#xff08;Gather-Excite&#xff09; 四、A2-Net(Double A…