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中的“颜色校正”功能为参照…...
软设之系统测试之测试的基本概念及分类
测试的基本概念 尽早,不断地进行测试 程序员避免测试自己设计的程序 既要选择有效,合理的数据,也要选择无效,不合理的数据 修改后应进行回归测试 尚未发现的错误数量与该程序已发现错误其他成正比。 动态测试 黑盒测试(测试…...
Python学习打卡:day06
day6 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day648、函数综合案例49、数据容器入门50、列表的定义语法51、列表的下标索引1、列表的下标(索引)2、列表的下标(…...
支付宝 沙盒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文档中,对用户可见。 <!-- 这是一个HTML显示注释 --> 1.2 隐式注释 隐式注释不会出现在生成的HTML文档中,对用户不可见。 <%-- 这是一个JSP隐式注释 --%> 2 JSP脚本元素 2.1 局部…...
057、PyCharm 运行代码报错:Error Please select a valid Python interpreter
当我们在PyCharm运行代码时,提示如下图错误: 那么问题通常是由于PyCharm未正确配置Python解释器引起的。 我们只需按以下步骤重新配置Python解释器即可: 打开PyCharm设置: 在菜单栏中的点击 “File” -> “Settings”…...
Java实现图书管理系统
一、引言 本篇介绍了一个简易的图书管理系统,面向管理员和普通用户分别给出了不同的菜单,实现了一些基本的图书操作功能,包括图书的增删查改、借阅、归还等 二、图书管理系统框架 图书管理系统,顾名思义,管理的是图…...
使用静态方法接受对象参数
我们先来看一个例子 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加解密(及引入方法) 如果想转请评论留个言并注明原博 Sclifftop 13805064305 阿浚 cocos creator如何使用cryptojs加解密(及引入方法) 步骤 获取库 1. npm install crypto-js -g,加不加…...
安装台式电脑网卡驱动
安装电脑网卡驱动 1. 概述2. 具体方法2.1 先确定主板型号2.2 详细操作步骤如下2.2.1 方法一2.2.2 方法二2.2 主流主板官网地址 结束语 1. 概述 遇到重装系统后、或者遇到网卡驱动出现问题没有网络时,当不知道怎么办时,以下的方法,可以作为一…...
JavaEE-多线程(1)
这篇文章,我们将介绍进程、线程的相关概念以及进程和线程的区别,下篇文章我们将使用Java来编写多线程的代码 进程: 进程(Process)是操作系统中资源分配的基本单位,它是一个正在运行的程序的实例。进程包括…...
【计算机视觉】人脸算法之图像处理基础知识(五)
图像的几何变换 3.图像的旋转 图像的旋转就是让图像按照某一点旋转到指定的角度。需要确定3个参数:图像的旋转中心、旋转角度和缩放因子。在openv中通过getRotationMatrix2D()函数来实现图像的旋转。 import cv2 import numpy as npimgpath "images/img1.j…...
工业 web4.0 的 UI 风格,独树一帜
工业 web4.0 的 UI 风格,独树一帜...
BSP驱动教程-CAN/CANFD/CANopen知识点总结分享
学习知识点整理: CAN 总线的前世今生: https://www.armbbs.cn/forum.php?modviewthread&tid104480 wikibai百科CAN总线: https://en.wikipedia.org/wiki/CAN_bus 瑞萨CAN入门教程: https://www.armbbs.cn/forum.php?m…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
