使用OPENCV查找边界,提取出面积前top_n的图像部分,顺序粘贴到指定背景图像上合成单个照片

使用OPENCV查找边界,提取出面积前top_n的图像部分,顺序粘贴到指定背景图像上合成单个照片
注意,仅适用于简单边缘边界

import argparse
import sysimport cv2
import os
import numpy as npif __name__ == "__main__":parser = argparse.ArgumentParser(description='请指定参数')parser.add_argument('--s', default='./', type=str, required=False,help='source,需处理的文件目录,支持相对路径以及绝对路径,如未指定,则是当前目录')parser.add_argument('--t', default='./result', type=str, required=False,help='target,输出的文件目录,支持相对路径以及绝对路径,会自动创建')parser.add_argument('--b', default='back.jpg', type=str, required=False, help='background,背景图像,注意尺寸')parser.add_argument('--sp', default=20, type=int, required=False, help='spacing,间距,单位像素')parser.add_argument('--x', default=450, type=int, required=False,help='start_x,起始点,即被分割的图像的第一块区域的起始点x坐标')parser.add_argument('--y', default=100, type=int, required=False,help='start_y,起始点,即被分割的图像的第一块区域的起始点y坐标')parser.add_argument('--top_n', default=3, type=int, required=False,help='取前n个面积的边缘排列出来')args = parser.parse_args()# 源目录和目标目录source_dir = args.s  # 包含待处理图像的目录target_dir = args.t  # 用于保存结果的目录top_n = args.top_n  # 用于保存结果的目录if not os.path.exists(source_dir):print("source_dir not exists")sys.exit(1)if not os.path.exists(args.b):print("back_img not exists")sys.exit(1)back_img = cv2.imread(args.b)# 如果目标目录不存在,则创建它if not os.path.exists(target_dir):os.makedirs(target_dir)# 遍历源目录中的所有文件for filename in os.listdir(source_dir):# 跳过非图像文件if not filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff', '.gif')):continue# 构建图像的完整路径source_path = os.path.join(source_dir, filename)target_path = os.path.join(target_dir, filename)# 读取图像image_o = cv2.imread(source_path)image = cv2.cvtColor(image_o, cv2.COLOR_BGR2GRAY)# 如果图像是空的,则跳过if image is None:print(f"Error: Could not open or find the image {source_path}.")continue# 使用二值化阈值_, thresh = cv2.threshold(image, 80, 255, cv2.THRESH_BINARY)# 查找轮廓contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 计算每个轮廓的面积,并按照面积降序排序contour_areas = [(cv2.contourArea(contour), contour) for contour in contours]contour_areas.sort(key=lambda x: x[0], reverse=True)# 提取前三个面积最大的轮廓top_n_contours = [contour_area[1] for contour_area in contour_areas[:top_n]]# 叠加前三个轮廓到目标图像上# 假设轮廓按水平方向排列,并且之间有间隔spacing = args.sp  # 轮廓之间的间隔start_x = args.xstart_y = args.ytarget_image = np.copy(back_img)for contour in top_n_contours:# 创建一个与源图像大小相同的掩码,并用0填充mask = np.zeros(image_o.shape[:2], dtype="uint8")# 在掩码上绘制当前轮廓(填充为白色)cv2.drawContours(mask, [contour], -1, 255, -1)# 使用掩码从源图像中提取轮廓区域contour_image = cv2.bitwise_and(image_o, image_o, mask=mask)x, y, w, h = cv2.boundingRect(contour)contour_image = contour_image[y:y + h, x:x + w]mask = mask[y:y + h, x:x + w]y_coords, x_coords = np.where(mask != 0)for y, x in zip(y_coords, x_coords):target_image[start_y + y, start_x + x] = contour_image[y, x]# 将轮廓区域叠加到目标图像上contour_height, contour_width = contour_image.shape[:2]# target_image[0:contour_height, start_x:start_x + contour_width] = contour_image# 更新下一个轮廓的起始位置start_x += contour_width + spacingcv2.imwrite(target_path, target_image)print("handel file success:" + source_path)print("Process completed. Output images are in the output_images directory.")

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

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

相关文章

1W、2W 3KVAC隔离 宽电压输入 交直两用AC/DC 电源模块——TP01(02)AZ 系列

TP01(02)AZ为客户提供一款超小体积模块式开关电源,该系列模块电源输出功 率为1W、2W,具有极低的空载损耗,低漏电流仅0.1mA,小体积,隔离耐压高达 3KV等特点。产品安全可靠,EMC 性能好,EMC 及安全…

【低照度图像增强系列(7)】RDDNet算法详解与代码实现(同济大学|ICME)

前言 ☀️ 在低照度场景下进行目标检测任务,常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题,给检测带来一定的难度。 🌻使用图像增强模块对原始图像进行画质提升,恢复各类图像信息,再使用目标检测…

装饰器模式与代理模式的区别?

代理模式 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式的适用场景: 功能增强 当需要对一个对象的访问提供一些…

SpringBoot(九)之整合mybatis

SpringBoot(九)之整合mybatis 文章目录 SpringBoot(九)之整合mybatisSpring整合mybatis回顾1. 引入依赖2. mybatis-config.xml SpringBoot整合mybatis1.引入依赖2. 配置数据源和 MyBatis 属性3. 配置 Mapper 接口4. 配置mapper.xm…

Python | 十一、项目搭建

项目环境配置 python setup.py 是 Python 中设置、分发和安装模块的传统方式。setup.py 文件通常位于一个 Python 项目的根目录下,并且定义了一个名为 setup 的函数。这个 setup 函数是 setuptools(或者早期的 distutils)模块的一部分&#…

绝缘监测系统在1kV 及以下低压配电系统的应用

安科瑞电气股份有限公司 祁洁 acrelqj 一、系统概述 Acrel-2000L/A 绝缘监测系统设备适用于 1kV 及以下低压配电系统。该设备可以集中采集监测显示绝缘监测仪的数据,实现最多 8 个绝缘监测仪的数据,并且实时记录告警信息和曲线查询。匹配的绝缘监测仪…

【INTEL(ALTERA)】采用 JTAG 频率为 24MHz 或 16Mhz 的非流水线Nios® V/m 处理器,niosv-download 失败

说明 在英特尔 Quartus Prime Pro Edition 软件 23.3 版及更高版本中将 Nios V 处理器软件下载到非流水线Nios V/m 处理器时,可能会出现此问题。 这是由于处理器限制,仅影响非流水线Nios V/m 处理器。 以下其他处理器不受此限制的影响: 管…

jQuery对象与DOM对象简介及相互转换

在Web开发中,操作页面元素是日常任务之一。JavaScript原生提供了一套方法来处理这些操作,这便是DOM(Document Object Model)对象。而随着jQuery库的流行,开发者又获得了一个更简洁、强大的工具来处理DOM操作&#xff0…

mongo增删改查的命令/sql语句

mongodb的查询命令对应的sql命令:https://blog.csdn.net/weixin_42726306/article/details/90208031 mongodb的更新、保存常用命令:https://blog.csdn.net/qq_16664643/article/details/52217315?utm_mediumdistribute.pc_relevant.none-task-blog-2de…

如何开发一个基于通义千问-14B的对话应用

目录 一:开发流程 二:安装 一:开发流程 1:安装环境 需要安装python依赖环境 2:配置项目 我们利用Langchain-Chatchat和Qwen1.5-14B-Chat-GPTQ-Int4来实现一个对话项目应用 3:启动项目 二:安装 1:安装环境 初始化一个python环境: conda create -n qwen-chat py…

搭建第一个SpringBoot+Vue项目

Maven:项目管理工具,对Java项目进行自动化的构建和依赖管理 SpringBoot的特点 只需要很少的配置或者默认配置 能够使用内嵌的Tomcat、Jetty服务器,不需要部署war文件 提供定制化的启动器Starters,简化Maven配置,开…

Spark项目实训(一)

目录 实验任务一:计算级数 idea步骤分步: 完整代码: linux步骤分布: 实验任务二:统计学生成绩 idea步骤分布: 完整代码: linux步骤分步: 实验任务一:计算级数 请…

C#反射的学习,反射的一些注意事项,反射的一些使用代码的实例

C# 中的反射(Reflection)是一种强大的机制,它允许程序在运行时获取关于类型(如类、结构、枚举、委托、接口和数组)的信息,并且能动态地创建和使用这些类型。然而,使用反射时需要注意一些性能和安…

windows2008修改远程桌面端口,如何果断修改远程桌面端口,确保系统安全无忧!

在数字化时代的浪潮中,Windows 2008系统以其卓越的稳定性和可靠性,赢得了众多企业和个人的青睐。然而,随着网络安全问题的日益严峻,如何确保远程桌面连接的安全,成为了摆在我们面前的一道难题。今天,我将为…

理解大语言模型(二)——从零开始实现GPT-2

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型:从线性回归到通用人工智能》,欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下:regression2chatgpt/ch11_llm/char_gpt.ipynb1 本文将讨论如何利用PyTorch从零开始搭建G…

VMware VCP VCAP认证已经不需要培训记录了

之前,VMware的VCP、VCAP认证,必需花上万银子参加培训才能参加考试拿证书;但从今年5月6号开始,只需要参加考试就可以了,不再需要这个培训记录了。 而且,VCTA、VCP、VCAP各等级的考试费统一了,都…

【Qt常用控件】—— 布局管理器

目录 前言 (一)垂直布局 (二)水平布局 (三)网格布局 (四)表单布局 (五)分组布局 (六)Spacer 总结 前言 之前使⽤Qt在界⾯上…

申请公众号数量达标

一般可以申请多少个公众号?目前企业主体只能申请2个公众号,这也意味着想做矩阵公众号的难度提升了。有些公司靠着诸多不同分工的公众号形成一个个矩阵,获取不同领域的粉丝。比如,目前主体为xx旗下公众号,共有30个&…

3.1 掌握RDD的创建

在Apache Spark中,RDD(Resilient Distributed Dataset)是一个基本的、不可变的、分布式的和可分区的数据集。它能够自动进行容错处理,并支持在大规模集群上的并行操作。RDD之间存在依赖关系,可以实现管道化&#xff0c…

React封装Canvas组件

在React中使用元素可以允许你创建动态和交互式的图形。下面是一个简单的步骤说明如何在React组件中使用: 1、创建React组件 先创建一个React组件,并且在其中包含了canvas元素。 import React, {useRef, useEffect } from react;const CanvasComponent = () => {const c…