基于python的去除图像内部填充

1 代码功能

        该代码实现了一个图像处理的功能,具体来说是去除图像内部填充(或更准确地说,是提取并显示图像中轮廓的外围区域,而忽略内部填充)。以下是该功能的详细步骤:

  1. 读取图像:使用cv2.imread()函数从指定路径image_path读取图像。如果图像无法加载(例如,文件不存在或路径错误),则打印错误消息并返回。

  2. 转换为灰度图像:通过cv2.cvtColor()函数将图像从BGR颜色空间转换为灰度图像。这是边缘检测前的必要步骤,因为边缘检测通常在灰度图像上执行。

  3. 应用边缘检测:使用cv2.Canny()函数对灰度图像进行Canny边缘检测。Canny边缘检测是一种流行的边缘检测算法,它通过计算图像梯度的局部最大值来检测边缘。这里设置了两个阈值(100和200),用于控制边缘检测的灵敏度。

  4. 查找轮廓:通过cv2.findContours()函数在边缘检测后的图像中查找轮廓。这里使用了cv2.RETR_EXTERNAL标志,表示只检索最外层的轮廓,忽略轮廓内部的洞或轮廓上的其他轮廓。

  5. 创建掩膜:创建一个与灰度图像形状相同但全为黑色的图像(即掩膜)。然后,使用cv2.drawContours()函数在掩膜上绘制找到的轮廓,轮廓内的区域被设置为白色(255)。

  6. 应用掩膜到原图:由于掩膜是灰度图像(单通道),而原图是BGR图像(三通道),因此需要将掩膜转换为三通道图像(使用cv2.cvtColor())。然后,使用cv2.bitwise_and()函数将掩膜应用到原图上,以提取轮廓外围的区域,忽略内部填充。

  7. 显示结果:使用matplotlib的plt.imshow()函数显示原始图像、掩膜和结果图像。由于matplotlib默认以RGB格式显示图像,而OpenCV以BGR格式读取图像,因此在显示之前需要将图像从BGR转换为RGB。

        最终,这段代码会显示三个图像:原始图像、掩膜(仅显示轮廓)和结果图像(只包含原始图像中轮廓外围的区域)。这可以用于去除图像中不需要的内部细节,只保留轮廓和轮廓外的区域。

2 代码

import cv2  
import numpy as np  
import matplotlib.pyplot as plt  def remove_interior_fill(image_path):  # 1. 读取图像  img = cv2.imread(image_path)  if img is None:  print(f"Error: Unable to load image at {image_path}")  return  # 2. 转换为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) gray = cv2.equalizeHist(gray)# 3. 应用边缘检测  edges = cv2.Canny(gray, 100, 200)  # 4. 查找轮廓  contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # 5. 创建掩膜  mask = np.zeros_like(gray)  cv2.drawContours(mask, contours, -1, 255, -1)  # 6. 应用掩膜到原图  # 注意:我们需要将掩膜扩展到原始图像的通道数  mask_3ch = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)  result = cv2.bitwise_and(img, mask_3ch)  # 显示结果  plt.figure(figsize=(12, 4))  plt.subplot(1, 3, 1)  plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 转换为RGB以正确显示颜色  plt.title('Original')  plt.axis('off')  plt.subplot(1, 3, 2)  plt.imshow(cv2.cvtColor(mask_3ch, cv2.COLOR_BGR2RGB))  # 同样转换为RGB  plt.title('Mask')  plt.axis('off')  plt.subplot(1, 3, 3)  plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))  plt.title('Result')  plt.axis('off')  plt.show()  # 使用示例  
image_path = 'input.jpg'  
remove_interior_fill(image_path)

3 运行结果

图 3-1 运行结果

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

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

相关文章

AWS服务器购买:如何选择合适的AWS云服务器

在当今数字化时代,云计算已成为企业IT基础设施的重要组成部分。作为全球领先的云服务提供商之一,亚马逊网络服务(AWS)提供了丰富多样的云服务器选项。然而,面对众多选择,如何为您的业务需求挑选最合适的AWS云服务器呢?我们结合九河云的分析来给你解答。 1. 明确业务需求 首先…

JVM调优:根据JVM自带工具定位问题(jps、jstat、Visual VM的使用)

JVM调优步骤 发现问题、定位问题、解决问题 发现问题 常见问题如下 GC频繁CPU负载过高内存溢出(OOM)内存泄露死锁程序响应时间较长 用JDK自带命令调优工具定位问题 jps(java process status):查看正在运行的Java进程 基本语…

JUnit 单元测试

JUnit 测试是程序员测试,就是白盒测试,可以让程序员知道被测试的软件如何 (How)完成功能和完成什么样(What)的功能。 下载junit-4.12和hamcrest-core-1.3依赖包 相关链接 junit-4.12:Central …

html+canvas 实现签名功能-手机触摸

手机上的效果图 需要注意&#xff0c;手机触摸和鼠标不是一个事件&#xff0c;不能通用&#xff0c;上一篇是关于使用鼠标的样例 相关代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewpo…

什么是AQS(抽象队列同步器)?

AQS是AbstractQueuedSynchronizer的简称&#xff0c;即抽象队列同步器&#xff0c;从字面上可以这样理解: 抽象&#xff1a;抽象类&#xff0c;只实现一些主要逻辑&#xff0c;有些方法由子类实现&#xff1b;队列&#xff1a;使用先进先出&#xff08;FIFO&#xff09;的队列…

独立站外链如何影响搜索引擎排名?

独立站的外链对搜索引擎排名有着非常重要的影响。简单来说&#xff0c;外链就像是别的网站对你的网站投的信任票。每一条外链都告诉搜索引擎&#xff1a;“这个网站的内容是有价值的&#xff0c;值得推荐。”因此&#xff0c;外链的数量和质量直接影响你的网站在搜索引擎中的排…

ThinkPad改安装Windows7系统的操作步骤

ThinkPad&#xff1a;改安装Windows7系统的操作步骤 一、BIOS设置 1、先重新启动计算机&#xff0c;并按下笔记本键盘上“F1”键进入笔记本的BIOS设置界面。 2、进入BIOS设置界面后&#xff0c;按下键盘上“→”键将菜单移动至“Restart“项目&#xff0c;按下键盘上“↓”按键…

创新驱动的力量:探索Web3在技术发展中的作用

随着科技的不断进步和创新&#xff0c;Web3作为新一代互联网技术范式&#xff0c;正在以其去中心化、安全、透明和可编程的特性&#xff0c;深刻影响着全球技术发展的方向和速度。本文将深入探讨Web3技术的核心概念、关键特征以及其在技术创新中的重要作用&#xff0c;展示其在…

汽车及零部件研发项目管理系统:一汽东机工选择奥博思 PowerProject 提升研发项目管理效率

在汽车行业中&#xff0c;汽车零部件的研发和生产是一个关键的环节。随着汽车市场的不断扩大和消费者需求的不断增加&#xff0c;汽车零部件项目管理的重要性日益凸显。通过有效的项目管理方法及利用先进的数字项目管理系统&#xff0c;可以大幅提高项目的成功率和顺利度&#…

JVM:常用工具总结

文章目录 一、jstat工具 一、jstat工具 Jstat工具是JDK自带的一款监控工具&#xff0c;可以提供各种垃圾回收、类加载、编译信息等不同的数据。使用方法为&#xff1a;jstat -gc进程ID每次统计的时间间隔&#xff08;毫秒&#xff09;统计次数。 C代表Capacity容量&#xff0c…

秒懂设计模式--学习笔记(11)【结构型-享元模式】

目录 10、享元模式10.1 享元模式10.2 举例10.2.1 马赛克10.2.2 游戏地图&#xff08;以草原地图作为范例&#xff09; 10.3 总结 10、享元模式 10.1 享元模式 “享元”则是共享元件的意思享元模式的英文flyweight是轻量级的意思&#xff0c;这就意味着享元模式能使程序变得更…

stack(leetcode练习题)

文章目录 STL用法总结32 最长有效括号思路代码 496 下一个最大元素思路代码 856 括号的分数思路 STL用法总结 关于stack的知识&#xff0c;可以看点击查看上面的博客&#xff0c;以下题目全在leetcode 32 最长有效括号 思路 “(()” “()(()” “(()(((()” 最开始写的&…

Linux下docker快速安装gitea

之前在服务器上装的gitlab来管理个人项目&#xff0c;但是gitlab服务启动后能明显感受到占用资源比较严重。最近服务器到期&#xff0c;换了个服务器还没来得及装gitlab&#xff0c;刚好最近接触到gitea&#xff0c;网上是这么说的 占用资源少&#xff0c;适合个人开发者&…

[PM]数据分析

概览 数据的定义 运营数据 分析的目的 数据分析流程 1.明确目标 2.数据来源 3.采集数据 4.数据整理 5.数据分析 趋势分析 当数据出现异常&#xff0c;一般从3个角度去查找问题&#xff1a; 1.技术层面&#xff0c;是不统计出错&#xff0c;或者产品出现bug 工 2.产品层面&am…

连接hive库增加相关包

连接hive库增加相关包 例如&#xff1a;java.lang.NoClassDefFoundError: com/ctc/wstx/io/InputBootstrapper org.apache.hadoop.hive.common.auth.HiveAuthUtils java.lang.NoClassDefFoundError: org/codehaus/stax2/XMLInputFactory2

0711springNews新闻系统管理 实现多级评论

0611springmvc新闻系统管理-CSDN博客 0711springNews新闻系统管理项目包 实现多级评论-CSDN博客 数据库字段 需要添加父节点id&#xff0c;通过该字段实现父评论和子评论的关联关系。 对象属性 实现链表&#xff0c;通过一个父评论可以找到它对应的所有子孙评论。 业务层 实现…

Capture软件元件库(以STM32为例)

本教程基于【凡亿】Cadence Allegro 17.4零基础入门66讲PCB Layout设计实战视频 &#xff08;一&#xff09;自带库路径查找 1&#xff0c;首先在找到文件的快捷方式 2&#xff0c;右键打开文件所在位置 3&#xff0c;点击tools&#xff08;上一级目录&#xff09; 4&#xf…

数据库最佳实践:优化爬虫管理的数据存储方案

摘要&#xff1a; 面对日益增长的数据抓取需求&#xff0c;如何高效管理和存储爬虫获取的海量信息成为一大挑战。本文将深入探讨数据库最佳实践&#xff0c;揭示如何通过优化策略提升爬虫数据存储效率&#xff0c;助您跨越数据管理的障碍&#xff0c;实现数据价值最大化。 一、…

SpringBoot+Vue(3)Excel的在线预览

一、思路 在Spring Boot和Vue.js的组合中实现Excel文件的在线预览功能&#xff0c;通常涉及到几个关键步骤&#xff1a;文件上传、文件存储、文件读取、以及通过前端展示Excel内容。由于Excel文件本身不是直接可以在网页上渲染的格式&#xff0c;我们通常需要将Excel文件转换为…

SpringMVC源码深度解析(下)

接着上一遍博客《SpringMVC源码深度解析(中)》继续聊。上一篇博客中&#xff0c;返回的是对象的情况下SpringMVC框架会怎么处理&#xff0c;这种情况也是现在用得最多的&#xff0c;因为都是前后端分离。如果返回的是ModelAndView&#xff0c;则是另外的处理逻辑了&#xff0c;…