• OpenCV练习(1)签名修复


    1.目的

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

    举例 

    手写的一个签名:

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

     

    2. 解决思路

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

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

    代码:

    1. import cv2
    2. # 读取图像
    3. image = cv2.imread(r'D:\papercode\AI\Ai-Dentist-Sample-Code-main\opencv\image\02.jpg')
    4. width = image.shape[1] // 2
    5. height = image.shape[0] // 2
    6. image = cv2.resize(image,(width, height),interpolation = cv2.INTER_AREA )
    7. # cv2.imshow('a',image)
    8. # 将图像转换为灰度
    9. gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    10. # cv2.imshow('gray',gray_image)
    11. edges = cv2.Canny(gray_image, 100, 200)
    12. # cv2.imshow('canny',edges)
    13. # 创建一个结构元素,通常使用一个圆形的结构元素
    14. kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    15. # 应用膨胀操作
    16. edges = cv2.dilate(edges, kernel, iterations=1)
    17. # cv2.imshow('canny1',edges)
    18. #尝试腐蚀来断偏旁部首的粘连
    19. # kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
    20. # edges = cv2.erode(edges, kernel, iterations=1)
    21. # cv2.imshow('canny02',edges)
    22. kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (4, 4))
    23. closing = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel1)
    24. # cv2.imshow('canny2',closing)
    25. # # 应用高斯模糊
    26. # blurred_image = cv2.GaussianBlur(closing, (5, 5), 0)
    27. # cv2.imshow('blurred_image',blurred_image)
    28. # # 应用 Laplacian 锐化
    29. # sharpened_image = cv2.Laplacian(closing, cv2.CV_64F)
    30. # cv2.imshow('l',sharpened_image)
    31. # 应用中值滤波
    32. # smoothed_image = cv2.medianBlur(blurred_image, 5)
    33. # cv2.imshow('se',smoothed_image)
    34. background = cv2.bitwise_not(closing)
    35. # 显示结果
    36. cv2.imshow('Background', background)
    37. cv2.waitKey(0)
    38. 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. 不足与尝试

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

    高斯滤波结果:

    中值滤波结果:

    双边滤波结果:

     

     

  • 相关阅读:
    使用idea,操作git创建分支,回滚版本,合并分支 ---全流程配图---
    RabbitMQ
    C++ vector使用方法
    SCADA的总体设计(一)
    下载文件流
    JAVA基础(JAVA SE)学习笔记(四)IDEA安装、使用、设置、断点、乱码汇总
    java面试之基础问题
    Java枚举你真的会用吗
    231 基于matlab的北斗信号数据解析
    docker 安装 minio (单体架构)
  • 原文地址:https://blog.csdn.net/PLANTTHESON/article/details/139692402