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. 不足与尝试
代码中有使用高斯滤波和中值滤波来尝试去除毛刺。但是高斯滤波后,笔画流畅了字迹却又模糊了,且中值滤波效果不大。
高斯滤波结果:
中值滤波结果:
双边滤波结果: