【问题标题】:Extract objects (fingerprint and signature) from an image using OpenCV and python使用 OpenCV 和 python 从图像中提取对象(指纹和签名)
【发布时间】:2020-10-03 21:38:33
【问题描述】:

在我的网站上,我收到一张包含用户指纹和签名的图片,我不想提取这两条信息。

例如: Original Image

import os
import cv2
import numpy as np

def imshow(label, image):
    cv2.imshow(label, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#read image
rgb_img = cv2.imread('path')
rgb_img = cv2.resize(rgb_img, (900, 600))
gray_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY)

Gray Image

#canny edge detection
canny = cv2.Canny(gray_img, 50, 120)

canny edge image

# Morphology Closing
kernel = np.ones((7, 23), np.uint8)
closing = cv2.morphologyEx(canny, cv2.MORPH_CLOSE, kernel)

Morphology Closing

# Find contours 
contours, hierarchy = cv2.findContours(closing.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)

# Sort Contors by area and then remove the largest frame contour
n = len(contours) - 1
contours = sorted(contours, key=cv2.contourArea, reverse=False)[:n]

copy = rgb_img.copy()

# Iterate through contours and draw the convex hull
for c in contours:
    if cv2.contourArea(c) < 750:
        continue
    hull = cv2.convexHull(c)
    cv2.drawContours(copy, [hull], 0, (0, 255, 0), 2)
    imshow('Convex Hull', copy)    

Image divided to parts

现在我的目标是:

  1. 知道哪一部分是签名,哪一部分是指纹
  2. 解决轮廓重叠(如果存在)

P.S:我不确定前面的步骤是否是最终步骤,如果您有更好的步骤,请告诉我。

这些是我可能想要处理的一些困难的例子

【问题讨论】:

  • 指纹的颜色好像不一样,可以用其中一种分割方法来分离指纹。对于签名,你可以通过一些文本检测算法删除上面不断打印的文字,剩下的就是签名了。
  • 我希望它这么简单,但是指纹颜色可能会因用户使用的 inc 颜色而异(或者如果图像被扫描仪扫描),并且文本检测在手写并输入文字。

标签: matlab opencv image-processing computer-vision opencv3.0


【解决方案1】:

您可以使用形态学进行指纹和签名选择。 举例:

import cv2 
import numpy as np
img = cv2.imread('fhZCs.png')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
img=cv2.bitwise_not(img) #negate image

#color definition
blue_upper = np.array([130,255,255])
blue_lower = np.array([115,0,0])

#blue color mask (sort of thresholding, actually segmentation)
mask = cv2.inRange(hsv, blue_lower, blue_upper)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (20,20))
finger=cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)

mask2=cv2.morphologyEx(finger, cv2.MORPH_DILATE, kernel)
signature=cv2.compare(mask2, mask, cv2.CMP_LT)
signature=cv2.morphologyEx(signature, cv2.MORPH_DILATE, kernel)

signature=cv2.bitwise_and(img, img, mask=signature)
signature=cv2.bitwise_not(signature)

finger=cv2.bitwise_and(img, img, mask=finger)
finger=cv2.bitwise_not(finger)

cv2.imwrite('finger.png', finger)
cv2.imwrite('signature.png',signature)

【讨论】:

  • 感谢 Alex 的努力,您的回答很好,但它假设指纹和签名是某种蓝色,但情况并非总是如此,我认为它有时会失败,因为签名的形状是椭圆。
猜你喜欢
  • 2019-12-14
  • 2019-10-29
  • 2018-08-26
  • 2013-04-13
  • 2019-02-02
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
相关资源
最近更新 更多