python opencv 找出图像中的最大轮廓并填充(生成mask)
作者:深山里的小白羊 发布时间:2021-01-14 23:42:10
标签:opencv,最大轮廓
本文主要介绍了python opencv 找出图像中的最大轮廓并填充,分享给大家,具体如下:
import cv2
import numpy as np
from PIL import Image
from joblib import Parallel
from joblib import delayed
# Parallel 和 delayed是为了使用多线程处理
# 使用前需要安装joblib:pip install joblib
# img_stack的shape为:num, h, w
# 是三维的图像,可以理解为是num张二维的图像组成
# mask是用来保存最后的结果的
mask = np.ones_like(img_stack)
for i in range(num):
# 阈值化
_, binaryzation = cv2.threshold(img_stack[i], 5, 255, cv2.THRESH_BINARY_INV)
# 找到所有的轮廓
contours, _ = cv2.findContours(binaryzation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
area = []
# 找到最大的轮廓
for k in range(len(contours)):
area.append(cv2.contourArea(contours[k]))
max_idx = np.argmax(np.array(area))
# cv2.fillContexPoly(mask[i], contours[max_idx], 0)
# 填充最大的轮廓
cv2.drawContours(mask[i], contours, max_idx, 0, cv2.FILLED)
del area
# 保存
def _write_mask(mask, i):
Image.fromarray(mask.astype(np.uint8)*255).save(os.path.join(path, 'm%d.png' % i))
# 使用多线程进行保存
num_cores = 10
parallel = Parallel(n_jobs=num_cores, backend='threading')
parallel(delayed(_write_mask)(mask[i, :, :], i) for i in range(0, num))
之前偷懒直接将项目里面的代码段扣下来放在这里,误导了大家,抱歉
这次我重新放一个完整版本,希望对大家有所帮助~~
代码在python 3.7.6 和opencv-python 4.3.0下测试成功
import cv2
import numpy as np
# 以灰度方式读取图像
img = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE)
mask = img.copy()
# 二值化,100为阈值,小于100的变为255,大于100的变为0
# 也可以根据自己的要求,改变参数:
# cv2.THRESH_BINARY
# cv2.THRESH_BINARY_INV
# cv2.THRESH_TRUNC
# cv2.THRESH_TOZERO_INV
# cv2.THRESH_TOZERO
_, binaryzation = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY_INV)
# 找到所有的轮廓
contours, _ = cv2.findContours(binaryzation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
area = []
# 找到最大的轮廓
for k in range(len(contours)):
area.append(cv2.contourArea(contours[k]))
max_idx = np.argmax(np.array(area))
# 填充最大的轮廓
mask = cv2.drawContours(mask, contours, max_idx, 0, cv2.FILLED)
# 保存填充后的图像
cv2.imwrite('masked.png', mask)
输入图像:
输出图像:
来源:https://blog.csdn.net/qq_33757398/article/details/96174768


猜你喜欢
- str_replace — 子字符串替换 [str_replace]mixed str_replace ( mixed
- 一、数据库操作1.1 安装PyMySQLpip install PyMySQL1.2 连接数据库python连接test数据库import
- 在vue中使用ant-design-vue组件官方地址:Ant Design Vue1. 安装首先使用vue-cli创建项目,然后进入项目,
- 在使用python函数print()时,如下代码会出现输出无法显示的问题:分三次在一行输出 123print(1, end="&q
- 本文介绍了Python3网络爬虫之使用User Agent和 * 隐藏身份,分享给大家,具体如下:运行平台:WindowsPython版本
- function clickButton(id) { &n
- 在JavaScript中,可以用三种方法来遍历对象的property:1.for/in。可以使用for/in语句遍历对象自身的propert
- 目录需求描述步骤分析和前置知识代码实现写在最后需求描述手上现有若干份财务分析报告的Word文档,如下:每一份Word文档中的内容如下:为了方
- 最近自己做的项目中设计师要求分类栏中鼠标悬停更换图片,大致实现出来的效果就是这样: 这个在jQuery中是个很简单的事,但是在vue中我还是
- 本文内容速览1、绘图数据准备还是使用鸢尾花iris数据集#导入本帖要用到的库,声明如下:import matplotlib.pyplot a
- 注入漏洞代码和分析<?php function customError($errno, $errstr, $errfile, $err
- 许多服务器管理员都知道,MySQL数据库管理系统(RDBMS)是高度灵活的软件块,带有范围广阔的启动选项,可以用来修改相关行为。然而,大部分
- 一、前言很多时候,我们都有远程控制电脑的需求。比如正在下载某样东西,需要让电脑在下载完后关机。或者你需要监控一个程序的运行状况等。今天我们就
- 1. Document.form.item 问题 现有问题:  
- 今天比较忙,水一下下面的代码来源于这个视频里面提到的,github 的链接为:github.com/mikeckenned…(本地下载)第一
- 本文主要讲解SQLite中时间函数进行分析与总结并给出使用案例。本文给出的例子都是经过测试。SQLite时间/日期函数种类:1、dateti
- 调用jupyter notebook文件内的函数一种简单方法python开发环境jupyter notebook良好的交互式和模块化受到很多
- SQL Server中的集合运算包括UNION(合并),EXCEPT(差集)和INTERSECT(相交)三种。集合运算的基本使用1.UNIO
- 在上一篇文章中我们提到热拷贝(MySQL备份与恢复之热
- TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议。使用UDP协议时,不需要建立连接,只需要