基于python的图像去水印

news2024/12/24 0:04:51

1 代码

import cv2
import numpy as np

def remove_watermark(image_path, output_path):
    # 读取图片
    image = cv2.imread(image_path)

    # 转换为灰度图
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 使用中值滤波去除噪声
    median_filtered = cv2.medianBlur(gray, 5)

    # 计算图像的梯度
    laplacian = cv2.Laplacian(median_filtered, cv2.CV_64F)

    # 将梯度图像转换为8位无符号整数
    laplacian_8u = np.uint8(np.absolute(laplacian))

    # 使用阈值操作找到潜在的水印区域
    _, thresholded = cv2.threshold(laplacian_8u, 30, 255, cv2.THRESH_BINARY)

    # 对阈值图像进行形态学操作,填充孔洞并平滑边缘
    kernel = np.ones((3, 3), np.uint8)
    closing = cv2.morphologyEx(thresholded, cv2.MORPH_CLOSE, kernel, iterations=2)

    # 创建一个掩码,将潜在的水印区域设置为白色
    mask = np.zeros_like(image)
    mask[closing == 255] = [255, 255, 255]

    # 将掩码转换为单通道图像
    mask_gray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)

    # 使用掩码去除水印
    result = cv2.inpaint(image, mask_gray, 3, cv2.INPAINT_TELEA)

    # 保存去水印后的图片
    cv2.imwrite(output_path, result)

remove_watermark('input.jpg', 'output.jpg')

2 去水印效果

图2-1 去水印前后对比

        从图2-1可以看出并没有完美去除水印,这是由水印与背景颜色接近造成的,后面我会用深度学习的方法探索一番。

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

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

相关文章

Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置”

1. Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置” 文章目录 1. Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置”2. 拦截器3. Spring MVC 中的拦截器的创建和基本配置3.1 定义拦截3.2 拦截器基本配置3.3 拦截器的高级配置 4. Spr…

初识C++|类和对象(中)——类的默认成员函数

🍬 mooridy-CSDN博客 🧁C专栏(更新中!) 🍹初始C|类与对象(上)-CSDN博客 4. 类的默认成员函数 默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成…

数字孪生技术栈:简单选three.js,复杂选unity3D,基本不会错。

数字孪生项目中涉及到3D模型交互的部分,选择什么技术栈呢,一般来说遵循这个原则:简单的应用可以选择Three.js,而复杂的应用则更适合选择Unity3D。 Three.js是一个基于WebGL的开源JavaScript库,用于在Web浏览器中创建和…

IP地址定位与GPS定位:技术解析与应用比较

IP地址定位和GPS定位是比较常见的定位技术。本文将与大家探讨这两种技术的工作原理、优缺点及其在实际应用中的比较和融合。 IP地址定位 IP地址定位的工作原理 IP地址(InternetProtocolAddress)是分配给联网设备的唯一标识符。IP地址定位通过分析设备…

基于springboot3实现单点登录(一): 单点登录及其相关概念介绍

引言 应网友要求,从本文开始我们将实现一套基于springboot3springsecurity的单点登录认证系统。 单点登录的实现方式有多种,接下来我们会以oauth2为例来介绍和实现。 单点登录介绍 单点登录(Single Sign-On,简称SSO&#xff0…

LeetCode-环形链表、环形链表 II

一、环形链表 . - 力扣(LeetCode) 判断是否有环,使用快慢指针,开始时都指向头节点,快指针每次走两部,慢指针每次走一步,如果在走的过程中,慢指针和快指针相同(也就是快指…

STM32第九课:STM32-基于标准库的42步进电机的简单I/O控制(附电机教程,看到即赚到)

一:步进电机简介 步进电机又称为脉冲电机,简而言之,就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩,步进电机的角位移量与输入的脉冲个数严格成正比…

从Mac电脑硬盘驱动器恢复数据的3种方法[终极指南]

如果您的MacBook的启动磁盘损坏,并且您没有另一台Mac来安装恢复软件并恢复数据,该怎么办?相反,您随身携带的是 Windows 操作系统。 起初,您可能会陷入僵局,因为您无法启动到Mac并使用Mac恢复软件恢复数据&…

移动UI:具备什么特征,可以被认定为科技风格。

移动UI设计在科技风格上通常具备以下特征: 1. 清晰简洁的排版: 科技风格的移动UI通常采用清晰简洁的排版,注重信息的层次感和结构化,以便用户能够快速、直观地获取所需信息。 2. 几何形状和线条: 科技风格的移动UI常…

【大模型书籍】从零开始大模型开发与微调:基于PyTorch与ChatGLM(附PDF)

哈喽各位&#xff0c;今天又来给大家分享大模型学习书籍了&#xff0c;今天是这本<从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM 书籍PDF分享>&#xff0c;大模型是深度学习自然语言处理皇冠上的一颗明珠&#xff0c;也是当前AI和NLP研究与产业中最重要的方…

移动UI:任务中心的作用,该如何设计更合理?

任务中心是移动应用中用于展示和管理用户待办任务、提醒事项、用户福利、打卡签到等内容的功能模块。合理设计任务中心可以提升用户体验和工作效率。 以下是一些设计任务中心的合理建议&#xff1a; 1. 易于查看和管理&#xff1a; 任务中心的设计应该使用户能够快速、直观地…

python基础知识点(蓝桥杯python科目个人复习计划69)

做些基础题 第一题&#xff1a;微生物增值 题目描述&#xff1a; 假设有两种微生物x和y。 x出生后每隔3分钟分裂一次&#xff08;数目加倍&#xff09;&#xff0c;y出生后每隔2分钟分裂一次&#xff08;数目加倍&#xff09;。 一个新出生的x&#xff0c;半分钟之后吃掉一…

STM32学习(1)--STM32介绍

STM32介绍 1.STM32简介2.ARM3.STM32F103C8T64.外设5.命名规则6.系统结构7.引脚定义8.启动配置9.最小系统电路 课程知识及代码来源均来自b站 江协科技&#xff0c;下学期即将做毕设&#xff0c;需要用到STM32单片机&#xff0c;在这个假期我将持续学习相关知识 1.STM32简介 ST…

免费压缩归档助手,一键搞定你的文件烦恼!

在这个数字化时代&#xff0c;我们每天都在与各种文件打交道。无论是工作文档、个人照片还是珍贵的视频&#xff0c;管理这些文件成了一项必不可少的任务。但你是否还在为文件的压缩、加密和解压缩而烦恼&#xff1f;别担心&#xff0c;我们为你带来了一款方便好用的免费软件—…

如何降低老年人患帕金森病的风险?

降低老年人患帕金森病风险的方法 避免接触有害物质&#xff1a;长期接触某些化学物质、农药或其他有害物质可能会增加患帕金森病的风险。应减少这些物质的暴露&#xff0c;例如在工作或生活中采取防护措施。 健康饮食&#xff1a;均衡饮食&#xff0c;多吃富含抗氧化剂的食物&a…

Richtek立锜科技可用于智能门铃的电源管理解决方案

新型的智能门铃不仅能满足呼叫、提醒的需要&#xff0c;还能在线监控、远程操作、闯入通知、记录过程&#xff0c;系统构成相对复杂&#xff0c;与传统门铃相比有了很大的改变。 从电源管理的角度来观察&#xff0c;满足这样需求的系统构成也相对复杂&#xff1a; 处于外置状态…

HTML+CSS+JS用户管理(可储存用户数据)

使用cookies记录账号密码信息&#xff0c;可以注册、登录、注销账号。 点赞❤️收藏⭐️关注&#x1f60d; 效果图 源代码在效果图后面 源代码 HTML <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <…

Python while循环

1.while循环格式 while 表达式:循环语句 使用break结束循环。 2.例 i 0 while True:print(i)i i 1if i > 101:break 结果&#xff1a; 这段代码从0循环到100&#xff0c;到101时结束循环。

在 PostgreSQL 里如何处理数据的存储优化和查询复杂度的平衡?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何处理数据的存储优化和查询复杂度的平衡&#xff1f;一、理解数据存储优化和查询复…

网络安全保险产业发展洞察报告(2024)

数字经济高速增长&#xff0c;黑客攻击、数据泄露等网络安全风险可能直接导致企业遭受巨额的财务损失。网络安全保险作为风险转移和风险管理的有效工具&#xff0c;正逐渐成为数字安全框架中不可或缺的一环。 《网络安全保险产业发展洞察报告&#xff08;2024&#xff09;》梳…