当前位置: 首页 > news >正文

OpenCV练习(1)签名修复

1.目的

在学校的学习过程中,需要递交许多材料,且每份材料上都需要对应负责人签名,有时候找别人要签名,然后自己粘贴的话,会出现签名模糊,背景不是纯白透明。为此以word中的“颜色+校正”功能为参照,进行OpenCV代码实现。

举例 

手写的一个签名:

图像会有阴影,且字体模糊 

 

2. 解决思路

首先通过算法来完成前景与背景的分离,再使用形态学方法来恢复图像清晰度。

  • 使用canny边缘检测来获取图像中字迹的轮廓
  • 使用形态学方法来恢复图像清晰度
  • 使用颜色反转来获得白底黑字的签名

代码:

import cv2# 读取图像
image = cv2.imread(r'D:\papercode\AI\Ai-Dentist-Sample-Code-main\opencv\image\02.jpg')width = image.shape[1] // 2
height = image.shape[0] // 2
image = cv2.resize(image,(width, height),interpolation = cv2.INTER_AREA )
# cv2.imshow('a',image)
# 将图像转换为灰度
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# cv2.imshow('gray',gray_image)edges = cv2.Canny(gray_image, 100, 200)
# cv2.imshow('canny',edges)
# 创建一个结构元素,通常使用一个圆形的结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))# 应用膨胀操作
edges = cv2.dilate(edges, kernel, iterations=1)
# cv2.imshow('canny1',edges)
#尝试腐蚀来断偏旁部首的粘连
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
# edges = cv2.erode(edges, kernel, iterations=1)
# cv2.imshow('canny02',edges)
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (4, 4))
closing = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel1)
# cv2.imshow('canny2',closing)
# # 应用高斯模糊
# blurred_image = cv2.GaussianBlur(closing, (5, 5), 0)
# cv2.imshow('blurred_image',blurred_image)
# # 应用 Laplacian 锐化
# sharpened_image = cv2.Laplacian(closing, cv2.CV_64F)
# cv2.imshow('l',sharpened_image)
# 应用中值滤波
# smoothed_image = cv2.medianBlur(blurred_image, 5)
# cv2.imshow('se',smoothed_image)background = cv2.bitwise_not(closing)# 显示结果
cv2.imshow('Background', background)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.1 canny边缘检测

edges = cv2.Canny(gray_image, 100, 200) 

参数分别为输入图像,最小阈值和最大阈值

结果如下:自己轮廓提取的效果还是不错的。因为OpenCV中一般白色为前景,所以需要将白色轮廓进行填充,需要用到形态学方法

 

2.2 膨胀操作

edges = cv2.dilate(edges, kernel, iterations=1)

可以看到,字迹有一定的填充,担任存在一些小的空洞,这个就需要用到闭运算了,来消除白色区域中的小黑块

 

2.3 闭运算
closing = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel1)

 可以看到,几乎多有的小黑块都被填充完毕,但是出现意料外的情况。在“图”字中,外面的口和里面的冬连在了一起,因为本身原图片中这两个结构就挨得很近,且为了最大限度地填充小黑块,进行膨胀时就容易粘连在一起了。

 

2.4 颜色反转
background = cv2.bitwise_not(closing)

为了得到白底黑字的效果,还需要进行颜色反转,效果如下图。由于形态学变换中的核取值过大,字迹出现了毛刺,且笔画不流畅。

 

3. 不足与尝试

代码中有使用高斯滤波和中值滤波来尝试去除毛刺。但是高斯滤波后,笔画流畅了字迹却又模糊了,且中值滤波效果不大。

高斯滤波结果:

中值滤波结果:

双边滤波结果:

 

 

相关文章:

OpenCV练习(1)签名修复

1.目的 在学校的学习过程中,需要递交许多材料,且每份材料上都需要对应负责人签名,有时候找别人要签名,然后自己粘贴的话,会出现签名模糊,背景不是纯白透明。为此以word中的“颜色校正”功能为参照&#xf…...

软设之系统测试之测试的基本概念及分类

测试的基本概念 尽早,不断地进行测试 程序员避免测试自己设计的程序 既要选择有效,合理的数据,也要选择无效,不合理的数据 修改后应进行回归测试 尚未发现的错误数量与该程序已发现错误其他成正比。 动态测试 黑盒测试(测试…...

Python学习打卡:day06

day6 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day648、函数综合案例49、数据容器入门50、列表的定义语法51、列表的下标索引1、列表的下标(索引)2、列表的下标&#xff08…...

支付宝 沙盒demo使用

简介:支付宝沙箱环境是一个为开发者提供的模拟测试环境,用于在应用上线前进行接口功能开发和联调。在这个环境中,开发者可以模拟开放接口,进行开发调试工作,以确保应用上线后能顺利运行。 1. 配置沙盒 1. 1 沙箱控制…...

ConcurrentHashMap如何保证线程安全?

ConcurrentHashMap 是 HashMap 的多线程版本,HashMap 在并发操作时会有各种问题,比如死循环问题、数据覆盖等问题。而这些问题,只要使用 ConcurrentHashMap 就可以完美解决了,那问题来了,ConcurrentHashMap 是如何保证…...

spring属性注入的不细心错误

属性注入问题 个人博客:www.zgtsky.top 同个的对象,在一个类中注入成功,在另一个类中注入为null 问题:在检测各个需要的类上已经打上注解后,出现了在一个类A1中注入B属性成功了,但在另一个类A2中注入B属性却失败了。…...

JVM 根可达算法

Java中的垃圾 Java中"垃圾"通常指的是不再被程序使用和引用的对象,具体表现在没有被栈、JNI指针和永久代对象所引用的对象。Java作为一种面向对象的编程语言,它使用自动内存管理机制,其中垃圾收集器负责检测和回收不再被程序引用的…...

Kafka基础架构与核心概念?有哪些应用场景?

Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。架构特点是分区、多副本、多生产者、多订阅者,性能特点主要是高吞吐,低时延。 Kafka主要设计…...

内网不能访问网站怎么办?

内网不能访问网站是在网络使用过程中常见的问题之一。当我们使用局域网连接时,有时候会遇到无法访问特定网站的情况。这可能是因为网络环境复杂,或者受到了某些限制。本篇文章将介绍一种解决内网不能访问网站问题的产品——天联组网。 天联组网是一款由…...

python-求f(x,n)

[题目描述] 输入: 输入 𝑥和 𝑛。输出: 函数值,保留两位小数。样例输入1 4.2 10 样例输出1 3.68 来源/分类(难度系数:一星) 完整代码如下: x,nmap(eval,input().split(…...

java值jsp语法笔记

1 JSP注释 1.1 显示注释 显示注释会出现在生成的HTML文档中&#xff0c;对用户可见。 <!-- 这是一个HTML显示注释 --> 1.2 隐式注释 隐式注释不会出现在生成的HTML文档中&#xff0c;对用户不可见。 <%-- 这是一个JSP隐式注释 --%> 2 JSP脚本元素 2.1 局部…...

057、PyCharm 运行代码报错:Error Please select a valid Python interpreter

当我们在PyCharm运行代码时&#xff0c;提示如下图错误&#xff1a; 那么问题通常是由于PyCharm未正确配置Python解释器引起的。 我们只需按以下步骤重新配置Python解释器即可&#xff1a; 打开PyCharm设置&#xff1a; 在菜单栏中的点击 “File” -> “Settings”&#xf…...

Java实现图书管理系统

一、引言 本篇介绍了一个简易的图书管理系统&#xff0c;面向管理员和普通用户分别给出了不同的菜单&#xff0c;实现了一些基本的图书操作功能&#xff0c;包括图书的增删查改、借阅、归还等 二、图书管理系统框架 图书管理系统&#xff0c;顾名思义&#xff0c;管理的是图…...

使用静态方法接受对象参数

我们先来看一个例子 public class MyInteger { private int value; // 构造函数 public MyInteger(int value) { this.value value; } // 实例方法 public boolean isEven() { return value % 2 0; } // 静态方法接受int参数 public static boolean isEvenStatic…...

cocos creator如何使用cryptojs加解密(及引入方法)

cocos creator如何使用cryptojs加解密&#xff08;及引入方法&#xff09; 如果想转请评论留个言并注明原博 Sclifftop 13805064305 阿浚 cocos creator如何使用cryptojs加解密&#xff08;及引入方法&#xff09; 步骤 获取库 1. npm install crypto-js -g&#xff0c;加不加…...

安装台式电脑网卡驱动

安装电脑网卡驱动 1. 概述2. 具体方法2.1 先确定主板型号2.2 详细操作步骤如下2.2.1 方法一2.2.2 方法二2.2 主流主板官网地址 结束语 1. 概述 遇到重装系统后、或者遇到网卡驱动出现问题没有网络时&#xff0c;当不知道怎么办时&#xff0c;以下的方法&#xff0c;可以作为一…...

JavaEE-多线程(1)

这篇文章&#xff0c;我们将介绍进程、线程的相关概念以及进程和线程的区别&#xff0c;下篇文章我们将使用Java来编写多线程的代码 进程&#xff1a; 进程&#xff08;Process&#xff09;是操作系统中资源分配的基本单位&#xff0c;它是一个正在运行的程序的实例。进程包括…...

【计算机视觉】人脸算法之图像处理基础知识(五)

图像的几何变换 3.图像的旋转 图像的旋转就是让图像按照某一点旋转到指定的角度。需要确定3个参数&#xff1a;图像的旋转中心、旋转角度和缩放因子。在openv中通过getRotationMatrix2D()函数来实现图像的旋转。 import cv2 import numpy as npimgpath "images/img1.j…...

工业 web4.0 的 UI 风格,独树一帜

工业 web4.0 的 UI 风格&#xff0c;独树一帜...

BSP驱动教程-CAN/CANFD/CANopen知识点总结分享

学习知识点整理&#xff1a; CAN 总线的前世今生&#xff1a; https://www.armbbs.cn/forum.php?modviewthread&tid104480 wikibai百科CAN总线&#xff1a; https://en.wikipedia.org/wiki/CAN_bus 瑞萨CAN入门教程&#xff1a; https://www.armbbs.cn/forum.php?m…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...