基于Canny边缘检测和轮廓检测

这段代码实现了基于Canny边缘检测和轮廓检测,从图像中筛选出面积较大的矩形,并使用OpenCV和Matplotlib显示结果。主要流程如下:

步骤详解:

  1. 读取图像

    img = cv2.imread('U:/1.png')
    

    使用cv2.imread()加载图像。

  2. 转换为灰度图像

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    

    使用cv2.cvtColor()将图像从BGR色彩空间转换为灰度图,以便后续处理。

  3. 边缘检测

    edges = cv2.Canny(gray, 50, 150)
    

    使用cv2.Canny()进行Canny边缘检测,检测图像中的边缘。

  4. 轮廓检测

    contours, hierarchy = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
    

    使用cv2.findContours()检测图像中的轮廓。参数cv2.RETR_LIST用于提取所有轮廓,而cv2.CHAIN_APPROX_SIMPLE用于减少轮廓的点数(仅保留直线的端点)。

  5. 筛选矩形

    for cnt in contours:approx = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True)if len(approx) == 4:area = cv2.contourArea(cnt)if area > min_area:cv2.drawContours(img, [approx], 0, (0, 255, 0), 3)
    
    • 对每个轮廓进行多边形近似,使用cv2.approxPolyDP()方法。
    • 判断是否为矩形(即有4个顶点)。
    • 计算轮廓面积并筛选出面积较大的矩形(面积大于设定的min_area阈值)。
    • cv2.drawContours()绘制矩形轮廓,使用绿色((0, 255, 0))并设定线宽为3。
  6. 显示结果

    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    fig, axes = plt.subplots(1, 2, figsize=(12, 6))
    axes[0].imshow(edges, cmap='gray')
    axes[0].set_title("Edges Detected")
    axes[0].axis('off')axes[1].imshow(img_rgb)
    axes[1].set_title("Rectangles Detected")
    axes[1].axis('off')plt.show()
    
    • 将最终结果(BGR图像)转换为RGB图像,以便正确显示。
    • 使用Matplotlib创建一个1行2列的子图,左图显示边缘检测结果,右图显示带有矩形框的原始图像。
    • plt.show()用于展示结果。

效果:

  • 边缘检测图像:显示了图像中所有的边缘。
  • 带有矩形的最终图像:显示了通过轮廓检测与面积筛选出的矩形,矩形用绿色框标注。

优化建议:

  1. min_area 阈值:你可以根据图像内容调整min_area的值,以过滤掉较小的噪声。
  2. 矩形的筛选条件:除了长宽比、面积等条件,你还可以进一步结合矩形的位置、形态等特征进行更精确的筛选。
  3. 图像预处理:有时在边缘检测前进行图像的平滑处理(如高斯模糊)可以减少噪声,提高检测效果。

该代码适用于需要从图像中提取矩形区域的场景,特别适用于图像中具有明显边缘和几何形状的对象。

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

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

相关文章

cisco防火墙在内网通过外网域名进行访问的配置

1.配置主机的access-list列表 access-list outside_acl extended permit tcp any 192.168.1.123 2.对主机和端口进行映射, 2.1 nat (inside,outside) source static 192.168.1.123 interface service stcp80 stcp8800 注释:先对主机进行外网映射…

React(一)

文章目录 项目地址一、创建第一个react项目二、JSX语法2.1 生成列表2.2 大括号识别JS的表达式2.3 列表循环array2.4 条件判断以及假值显示2.5 复杂条件渲染2.6 事件监听和绑定2.7 使用Fregments返回多个根标签2.8 多条件渲染2.9 导出子组件 三、组件3.1 设置组件3.2 props给子组…

记录一下在原有的接口中增加文件上传☞@RequestPart

首先,咱声明一下: RequestBody和 MultipartFile 不可以 同时使用!!! 因为这两者预期的请求内容类型不同。RequestBody 预期请求的 Content-Type 是 application/json 或 application/xml,而 MultipartFile …

HTTPSOK ---助力阿里云免费 SSL 证书自动续期

目前许多用户面临着 SSL 证书过期续期的难题,尤其是对于阿里云的 免费 SSL 证书,每三个月需要手动申请和更新。为了帮助用户更轻松地管理 SSL 证书,现推出了强大的 HTTPSOK 服务,为用户提供了更便捷的自动续期和管理解决方案。 什…

5G的SUCI、SUPI、5G-GUTI使用场景及关系

使用场景(来源于对23.501、23.502、33.501、23.003的理解) 1、UE初始注册时,根据HN Public Key把SUPI加密成SUCI,并发送初始注册请求 2、AMF转发SUCI给AUSF和UDM进行认证,并获取解密后的SUPI 3、AMF根据SUPI生成一个5G-GUTI,并保…

【微服务】Spring AI 使用详解

目录 一、前言 二、Spring AI 概述 2.1 什么是Spring AI 2.2 Spring AI 特点 2.3 Spring AI 带来的便利 2.4 Spring AI 应用领域 2.4.1 聊天模型 2.4.2 文本到图像模型 2.4.3 音频转文本 2.4.4 嵌入大模型使用 2.4.5 矢量数据库支持 2.4.6 数据工程ETL框架 三、Sp…

【jvm】方法区的理解

目录 1. 说明2. 方法区的演进3. 内部结构4. 作用5.内存管理 1. 说明 1.方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。它是各个线程共享的内存区域。2.尽管《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但它却…

大数据-226 离线数仓 - Flume 优化配置 自定义拦截器 拦截原理 拦截器实现 Java

点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop&#xff0…

编译OpenCV的速度,家里和公司的电脑相差很大

这一段时间,研究OpenCV带ffmpeg的编译问题。然后发现,同样是虚拟机,编译速度,家里的电脑明显比公司慢多了。 都是在SSD上。虚拟机内存,家里是16G,公司是8G。CPU,家里是E5 2667,公司…

Qt 的 QThread:多线程编程的基础

Qt 的 QThread:多线程编程的基础 在现代应用程序中,尤其是需要处理大量数据、进行长时间计算或者进行 I/O 操作时,多线程编程变得至关重要。Qt 提供了一个功能强大且易于使用的线程类 QThread,可以帮助开发者在 Qt 应用程序中实现…

Java 线程池介绍与实践

文章目录 引言概念优势Java 中的线程池实现线程池的核心参数1. corePoolSize:核心线程数2. maximumPoolSize:最大线程数3. keepAliveTime:线程空闲时间4. unit:时间单位5. workQueue:任务队列6. threadFactory&#xf…

富格林:安全指正规防欺诈套路

富格林指出,在现货黄金投资操作中,有众多的投资技巧和投资方式,但其实并不是所有的都适用。投资者应该注意选择安全、可信的投资方式去规防欺诈套路。值得提醒的是,现货黄金虽然拥有很多获利的机会,但也有不少欺诈套路…

PyAEDT:Ansys Electronics Desktop API 简介

在本文中,我将向您介绍 PyAEDT,这是一个 Python 库,旨在增强您对 Ansys Electronics Desktop 或 AEDT 的体验。PyAEDT 通过直接与 AEDT API 交互来简化脚本编写,从而允许在 Ansys 的电磁、热和机械求解器套件之间无缝集成。通过利…

SpringBoot(二十六)SpringBoot自定义注解

注解在springboot日常开发中使用的频率是很高的,官方为我们提供了很多注解,比如:@Autowired、@GetMapping等…… 但是我们有些特定的需求官方提供的注解是没有的。我们可以自定义注解。 下面我们来了解一下自定义注解的过程。 一:元注解 Java为我们提供了几个元注解来自定…

DHTMLX-gantt组件显示不同的颜色

在 dhtmlxGantt 组件中,你可以通过自定义任务的颜色来显示不同的任务类型或状态。这通常通过配置任务的 color 属性来实现。你可以在初始化 Gantt 图表时或在动态添加任务时设置这个属性。 以下是一些常见的方法来为任务设置不同的颜色: 1. 初始化时设…

什么是迭代器?Python迭代器及其用法

迭代器是一种对象,它表示一个数据流,可以一次访问一个成员(元素)。 迭代器从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 在Python中,迭代器是一个实现了迭代协议的…

什么是C++中的友元函数和友元类?

友元函数(Friend Function)和 友元类(Friend Class)是用于控制类的访问权限的机制。这允许特定的函数或类访问另一个类的私有成员和保护成员,打破了 C 的封装性规则。 友元函数 定义 友元提供了不同类的成员函数之间…

深入理解 CSS 属性 pointer-events: none

pointer-events 是 CSS 中一个用于控制元素响应鼠标事件(或触摸事件)的属性。 通过这个属性,我们可以控制元素是否能够接受鼠标事件,例如点击、悬停、拖动等。 其中,pointer-events: none 是 pointer-events 属性的一…

定时器(QTimer)与随机数生成器(QRandomGenerator)的应用实践——Qt(C++)

一、QTimer与QRandomGenerator (一)QTimer(定时器)[2] QTimer类为定时功能提供了一个高级编程接口。在使用QTimer时,实例化一个QTimer对象并将其timeout()发射信号与合适的信号槽相连接。通过调用QTimer的start()函数…

用redis的zset实现日榜,周榜,月榜

思路&#xff1a; 1.初始化一个月的数据&#xff1a; /*** 初始化一个月数据*/Testpublic void initMonthData(){//计算当前时间小时的keylong hourSystem.currentTimeMillis()/(1000*60*60);for(int i1;i<24*30;i){String key"W_hour"(hour-i);Random random new…