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. 不足与尝试

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

高斯滤波结果:

中值滤波结果:

双边滤波结果:

 

 

相关推荐

  1. jeecgboot访问签名修改

    2024-06-16 22:34:03       25 阅读
  2. Python OpenCV 牛刀小试(练习

    2024-06-16 22:34:03       45 阅读
  3. OpenCV 1 - 加载 显示 修改 保存图像

    2024-06-16 22:34:03       48 阅读
  4. 代码签名证书可以修改签名者信息吗?

    2024-06-16 22:34:03       47 阅读
  5. opencv案例实战:表格修复

    2024-06-16 22:34:03       56 阅读
  6. Android 打包V1 / V2签名

    2024-06-16 22:34:03       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 22:34:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 22:34:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 22:34:03       87 阅读
  4. Python语言-面向对象

    2024-06-16 22:34:03       96 阅读

热门阅读

  1. OSPF协议详解(一)

    2024-06-16 22:34:03       37 阅读
  2. Web前端开发PPT:深入探索与实战应用

    2024-06-16 22:34:03       29 阅读
  3. Mysql的事务

    2024-06-16 22:34:03       27 阅读
  4. web前端筛选器:深度解析与高效应用

    2024-06-16 22:34:03       27 阅读
  5. 什么是中断?STM32F407中断处理

    2024-06-16 22:34:03       33 阅读
  6. 2024年,计算机相关专业还值得选择吗?

    2024-06-16 22:34:03       28 阅读
  7. 复合语句、数值交换、三个数的最值与排序

    2024-06-16 22:34:03       30 阅读
  8. IP路由的原理

    2024-06-16 22:34:03       33 阅读
  9. 实现一个简单的mybatis:SimpleMyBatis

    2024-06-16 22:34:03       34 阅读
  10. 程序员应该具备哪些良好的习惯

    2024-06-16 22:34:03       29 阅读
  11. 【洛谷题解】P5704 【入门1】顺序结构 字母转换

    2024-06-16 22:34:03       34 阅读
  12. Web前端中表示上标:深度解析与实战技巧

    2024-06-16 22:34:03       26 阅读
  13. 设计模式之享元模式

    2024-06-16 22:34:03       33 阅读
  14. carbondata连接数优化

    2024-06-16 22:34:03       32 阅读
  15. 【C++】计算代码中程序的时间差

    2024-06-16 22:34:03       33 阅读
  16. 10:Hello, World!的大小

    2024-06-16 22:34:03       31 阅读
  17. Shell 学习笔记 - 变量的类型 + 变量的赋值

    2024-06-16 22:34:03       24 阅读