南通e站网站建设/网络营销的概念及特征

南通e站网站建设,网络营销的概念及特征,网页设计师工资水平,建网站的网站掩码实现图片抠图 目录 掩码实现图片抠图1 掩码1.1 概念1.2 创建掩码1.3抠图思路 2 代码测试 1 掩码 1.1 概念 掩码(Mask)是一种用于指定图像处理操作区域的工具。掩码通常是一个与图像尺寸相同的二值图像,其中像素值为0表示不处理&#xff…

掩码实现图片抠图

目录

  • 掩码实现图片抠图
    • 1 掩码
      • 1.1 概念
      • 1.2 创建掩码
      • 1.3抠图思路
    • 2 代码测试

1 掩码


1.1 概念

掩码(Mask)是一种用于指定图像处理操作区域的工具掩码通常是一个与图像尺寸相同的二值图像,其中像素值为0表示不处理,像素值为255(或1)表示处理。掩码可以用于多种操作,如图像滤波、图像合成、图像分割等。掩码的尺寸必须与图像的尺寸相同。掩码的像素值通常为0或255(或1),但也可以是其他值,具体取决于应用场景。通过使用掩码,可以更精确地控制图像处理操作的范围,从而实现更复杂的效果。

1.2 创建掩码

  • mask = np.zeros((height, width), dtype=np.uint8),创建一个全黑的掩码
    • (height, width), 高宽
    • dtype=np.uint8 ,数据类型
  • cv2.rectangle(mask, (x1, y1), (x2, y2), 255, -1),在掩码上绘制矩形
    • (x1, y1), (x2, y2)起点和对角线坐标 ,
    • 255颜色, -1表全填充
import cv2
import numpy as np
# 创建一个全黑的掩码
mask = np.zeros((300, 300), dtype=np.uint8)
# 在掩码上绘制一个白色矩形
cv2.rectangle(mask, (50, 50), (100, 100), 255, -1)
cv2.imshow('mask',mask)
cv2.waitKey(0)

运行如下
在这里插入图片描述

1.3抠图思路

  • 图像读取与预处理
    读取图像并转换为灰度图,进行高斯滤波以减少噪声。

  • 边缘检测
    使用Canny算法检测图像中的边缘。

  • 轮廓检测与排序
    查找图像中的轮廓,并根据面积进行排序

  • 二值化处理
    对灰度图进行二值化处理,确定阈值。

  • 轮廓筛选
    根据轮廓的宽度、高度和宽高比筛选出符合条件的轮廓。

  • 掩码操作
    在掩码上绘制筛选后的轮廓,并对原图像和掩码进行与操作,以提取区域。

2 代码测试

原图

在这里插入图片描述

代码展示:

import numpy as np
import cv2# 定义一个函数用于显示图像,并等待用户按下任意键关闭窗口
def cv_chow(name, img):cv2.imshow(name, img)cv2.waitKey(0)# 定义一个函数用于对四个点进行排序,返回一个有序的矩形顶点列表
def order_points(pts):rect = np.zeros((4, 2), dtype="float32")s = pts.sum(axis=1)  # 计算每个点的x和y坐标之和rect[0] = pts[np.argmin(s)]  # 最小的和为左上角rect[2] = pts[np.argmax(s)]  # 最大的和为右下角diff = np.diff(pts, axis=1)  # 计算每个点的x和y坐标之差rect[1] = pts[np.argmin(diff)]  # 最小的差为右上角rect[3] = pts[np.argmax(diff)]  # 最大的差为左下角return rect# 定义一个函数用于对轮廓进行排序,支持从左到右、从右到左、从上到下、从下到上四种排序方式
def sort_contours(cons, method='left-to-right'):reverse = Falsei = 0if method == 'right-to-left' or method == 'bottom-to-top':reverse = Trueif method == 'top-to-bottom' or method == 'bottom-to-top':i = 1boundingBoxes = [cv2.boundingRect(c) for c in cons]  # 获取每个轮廓的边界框(cons, boundingBoxes) = zip(*sorted(zip(cons, boundingBoxes),key=lambda b: b[1][i], reverse=reverse))return cons, boundingBoxes# 读取图像
img = cv2.imread('img_3.png')# 复制图像用于绘制轮廓
cont_img = img.copy()# 将图像转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 对灰度图进行高斯滤波,以减少噪声
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
cv_chow('blurred', blurred)# 使用Canny边缘检测算法检测图像中的边缘
edg = cv2.Canny(blurred, 75, 200)
cv_chow('edg', edg)# 查找图像中的轮廓
cnts = cv2.findContours(edg.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]# 在图像上绘制所有轮廓
cv2.drawContours(cont_img, cnts, -1, (0, 0, 255), 3)
cv_chow('cont_img', cont_img)# 根据轮廓面积对轮廓进行排序,从大到小
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)# 对灰度图进行二值化处理,使用Otsu's方法自动确定阈值
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cv_chow('thresh', thresh)# 在二值化图像中查找轮廓
thresh_cnt = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]# 初始化一个列表用于存储符合条件的轮廓
qus_cnts = []# 初始化一个列表用于存储所有的掩码
mask_all = []# 创建一个与二值化图像大小相同的黑色掩码
mask = np.zeros(thresh.shape, dtype='uint8')# 遍历所有轮廓,筛选出符合条件的轮廓
for c in thresh_cnt:(x, y, w, h) = cv2.boundingRect(c)  # 获取轮廓的边界框ar = w / float(h)  # 计算边界框的宽高比if w >= 8 and h >= 10 and 0.5 <= ar <= 2:  # 根据宽度、高度和宽高比筛选轮廓qus_cnts.append(c)# 遍历筛选后的轮廓,绘制掩码并进行与操作
for i in qus_cnts:cv2.drawContours(mask, [i], -1, 255, -1)  # 在掩码上绘制轮廓cv_chow('mask', mask)img_mask_and = cv2.bitwise_and(img, img, mask=mask)  # 对原图像和掩码进行与操作cv_chow('img_mask_and', img_mask_and)

运行结果:

在这里插入图片描述

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

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

相关文章

基于ssm的一家运动鞋店的产品推广网站的设计

项目简介 一家运动鞋店实现了以下功能&#xff1a; 实现了用户在线选择试题并完成答题&#xff0c;在线查看考核分数。管理员管理收货地址管理、购物车管理、字典管理、留言版管理、新闻信息管理、产品管理、产品收藏管理、产品评价管理、产品订单管理、单页数据管理、用户管…

3.14学习总结

今天完成了几道关于二叉树的算法题 关于二叉树的最小最大深度和数据流中的第k大元素&#xff0c;用到优先队列&#xff0c;学习了有关java的基础知识&#xff0c;学习了双指针法。

spring boot3 kafka集群搭建到使用

首先自行安装docker&#xff0c;通过docker容器安装kafka CentOS 系统 docker安装地址 1.pom.xml和application.properties或者application.yml文件配置 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</arti…

基于 RWA 模型与 AI - Agent 协同的企业级 aPAAS 架构设计

一、引言 在企业数字化转型不断深化的当下&#xff0c;现实世界资产&#xff08;RWA&#xff09;模型与人工智能智能体&#xff08;AI - Agent&#xff09;的协同融合&#xff0c;为企业级应用平台即服务&#xff08;aPAAS&#xff09;架构的创新发展带来了新契机。这种架构旨在…

Flutter PopScope对于iOS设置canPop为false无效问题

这个问题应该出现很久了&#xff0c;之前的组件WillPopScope用的好好的&#xff0c;flutter做优化打算“软性”处理禁用返回手势&#xff0c;出了PopScope&#xff0c;这个组件也能处理在安卓设备上的左滑返回事件。但是iOS上面左滑返回手势禁用&#xff0c;一直无效。 当然之…

海数通-海员数字化管理平台(企业数字化)

产品介绍 海数通产品是一套海员数字化管理平台&#xff0c;为企业提供海员档案、海历、动态、证书、培训、晋升、薪资、社险等全流程多维度的智能化管理能力。薪资计算模型和社险计算模型能够自动并准确的完成复杂的工资、社险计算工作&#xff0c;极大的提高工作效率和准确性…

如何处理PHP中的日期和时间问题

如何处理PHP中的日期和时间问题 在PHP开发中&#xff0c;日期和时间的处理是一个常见且重要的任务。无论是记录用户操作时间、生成时间戳&#xff0c;还是进行日期计算&#xff0c;PHP提供了丰富的函数和类来帮助开发者高效处理这些需求。本文将详细介绍如何在PHP中处理日期和…

【SpringMVC】入门版

1.基本概念 1.1三层架构 三层架构也就是我们常说的b/s架构中的表现层&#xff0c;业务层和持久层,每层都各司其职&#xff0c;下面来分别讲解这三层的作用。 表现层&#xff1a; 也就是我们常说的web层。它负责接收客户端的请求&#xff0c;向客户端响应结果&#xff0c;通…

【Java进阶学习 第八篇】石头迷阵游戏

绘制页面 首先绘制指定宽和高的窗体 JFrame frame new JFrame();frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);frame.setSize(514,595);frame.setTitle("石头迷阵单机版v1.0");//想让游戏一直在屏幕的最上层frame.setAlwaysOnTop(true);//想让窗…

wireguard搭配udp2raw部署内网

前言 上一篇写了使用 wireguard 可以非常轻松的进行组网部署&#xff0c;但是如果服务器厂商屏蔽了 udp 端口&#xff0c;那就没法了 针对 udp 被服务器厂商屏蔽的情况&#xff0c;需要使用一款 udp2raw 或 socat 类似的工具&#xff0c;来将 udp 打包成 tcp 进行通信 这里以…

系统可观测性(5)OpenTelemetry基础使用

系统可观测性(5)OpenTelemetry基础概念 Author: Once Day Date: 2025年3月12日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 本文档翻译整理自《OpenTelemetry Docs》&a…

Jenkins 集成DingDing 推送

现状分析 开发频繁发布代码&#xff0c;和测试没有及时沟通&#xff0c;导致测试返工、bug漏测等 解决方案 Jenkins 集成DingDing机器人&#xff0c;在构建时触发推送 DingDing端机器人配置 1、在钉钉电脑端建立群聊 2、点击群右上角设置&#xff0c;点击【智能群助手】 …

硬件驱动——51单片机:独立按键、中断、定时器/计数器

目录 一、独立按键 1.原理 2.封装函数 3.按键控制点灯 数码管 二、中断 1.原理 2.步骤 3.中断寄存器IE 4.控制寄存器TCON 5.打开外部中断0和1 三、定时器/计数器 1.原理 2.控制寄存器TCON 3.工作模式寄存器TMOD 4.按键控制频率的动态闪烁 一、独立按键 1…

基于PMU的14节点、30节点电力系统状态估计MATLAB程序

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 程序简介&#xff1a; 程序采用三种方法对14节点和30节点电力系统状态进行评估&#xff1a; ①PMU同步向量测量单元结合加权最小二乘法&#xff08;WLS&#xff09;分析电力系统的电压幅值和相角状态&#xff1b; …

Apifox Helper 自动生成API接口文档

在我们开发过程中我们在编写请求地址和编写请求参数的时候特别花费时间耗费了我们很多时间&#xff0c;作为一个程序员&#xff0c;更应该把精力时间集中在开发上&#xff0c; Apifox Helper 是 Apifox 团队针对 IntelliJ IDEA 环境所推出的插件&#xff0c;可以在 IDEA 环境中…

堆概念和结构

1. 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中通常 把堆使用顺序结构的数组来存储 &#xff0c;需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事&#xff0c…

VUE的脚手架搭建引入类库

VUE的小白脚手架搭建 真的好久好久自己没有发布自己博客了,对于一直在做后端开发的我 ,由于社会卷啊卷只好学习下怎么搭建前端,一起学习成长吧~哈哈哈(最终目的,能够懂并简易开发) 文章目录 VUE的小白脚手架搭建1.下载node.js2.安装vue脚手架3.创建一个项目4.代码规范约束配置(…

使用 Arduino 和 ThingSpeak 通过互联网进行实时温度和湿度监测

使用 ThingSpeak 和 Arduino 通过 Internet 进行温度和湿度监控 湿度和温度是许多地方(如农场、温室、医疗、工业家庭和办公室)非常常见的测量参数。我们已经介绍了使用 Arduino 进行湿度和温度测量,并在 LCD 上显示数据。 在这个物联网项目中,我们将使用ThingSpeak在互联…

论文分享:PL-ALF框架实现无人机低纹理环境自主飞行

在室内仓库、地下隧道等低纹理复杂场景中&#xff0c;无人机依赖视觉传感器进行自主飞行时&#xff0c;往往会遇到定位精度低、路径规划不稳定等难题。针对这一问题&#xff0c;重庆邮电大学计算机学院雷大江教授团队在IEEE Trans期刊上提出了一种新型自主飞行框架&#xff1a;…

如何筛选能实现共享自助健身房“灵活性”的物联网框架?

共享自助健身房已经成为一种新兴的健身方式&#xff0c;这种模式方便快捷&#xff0c;尤其适合i人健身爱好者&#xff0c;市场接受度还是挺好的。对于无人自助式的健身房要想实现灵活性&#xff0c;要挑选什么样的物联网框架呢&#xff1f; 1. 支持多种通信协议 共享自助健身…