[英]How to extract signature from an image (python script)?
我本人只是剛開始使用Python,但認為我可以解決一個問題-提出了以下建議:
#!/usr/bin/python2
import cv2
import numpy as np
file_name = "/tmp/signature.jpg" # your signature image...
image = cv2.imread(file_name, 1)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGBA)
# note: [R,G,B,255] below, so first 3 numbers [255,255,255] are your white
# background pixels to be converted to RGBA setting of [0,0,0,0] (transparent)
image[np.all(image == [255, 255, 255, 255], axis=2)] = [0, 0, 0, 0]
cv2.imwrite("/tmp/signature-transparent.png", image)
該腳本將抓取您的signature.jpg,使用找到的所有白色像素作為透明背景,然后將其寫入signature.png。
看起來像這樣:
但是,它的邊緣不是很干凈! 外面有人可以排序嗎?
您應該考慮以下步驟:例如,假裝它是您的用戶圖像:
現在執行以下步驟:
cv::namedWindow("result", cv::WINDOW_FREERATIO);
cv::Mat signatureImg = cv::imread(R"(izrMq.jpg)");
cv::Mat userImg = cv::imread(R"(user_image.jpg)");
// make a mask
cv::Mat mask;
cv::cvtColor(signatureImg, mask, cv::COLOR_BGR2GRAY);
cv::threshold(mask, mask, 150, 255, cv::THRESH_BINARY_INV);
// now copy
cv::Mat submat = userImg(cv::Rect(userImg.cols-signatureImg.cols, userImg.rows-signatureImg.rows, signatureImg.cols, signatureImg.rows));
signatureImg.copyTo(submat, mask);
cv::imshow("result", userImg);
cv::waitKey();
結果是:
希望能幫助到你!
這是一個相當大的過程,主要是因為有很多步驟可以在不同大小的圖像之上添加圖像。 我建議您檢查以下代碼中的所有中間步驟,以了解會發生什么。
我使用HSV色彩空間將簽名與背景分開,如果簽名或背景具有其他顏色,這很容易適應。
我沒有找到@BahramdunAdil使用的copyTo()
-方法的python綁定。 您可以改用numpy.copyto()
功能。 為此,我將引導您參考此答案 。
我使用了另一種技術:將圖像添加到另一個圖像之上,首先創建一個與簽名大小相同的子圖像。 可以將簽名添加到子圖像,然后將其放回主圖像中。
或者,您可以采用閾值簽名並使用@ renedv1的方法來保存Alpha圖像。 sign_masked
使用sign_masked
圖像。 由於具有HSV范圍,您可以創建更清晰的結果。 (注意:考慮到sign_masked具有黑色背景這一事實)
碼:
import numpy as np
import cv2
# load image
sign = cv2.imread("sign.jpg")
bg_img = cv2.imread("green_area.jpg")
# Convert BGR to HSV
hsv = cv2.cvtColor(sign, cv2.COLOR_BGR2HSV)
# define range of HSV-color of the signature
lower_val = np.array([0,0,0])
upper_val = np.array([179,255,150])
# Threshold the HSV image to get a mask that holds the signature area
mask = cv2.inRange(hsv, lower_val, upper_val)
# create an opposite: a mask that holds the background area
mask_inv= cv2.bitwise_not(mask)
# create an image of the signature with background excluded
sign_masked = cv2.bitwise_and(sign,sign,mask=mask)
# get the dimensions of the signature
height, width = sign.shape[:2]
# create a subimage of the area where the signature needs to go
placeToPutSign = bg_img[0:height,0:width]
# exclude signature area
placeToPutSign_masked = cv2.bitwise_and(placeToPutSign, placeToPutSign, mask=mask_inv)
# add signature to subimage
placeToPutSign_joined = cv2.add(placeToPutSign_masked, sign_masked)
# put subimage over main image
bg_img[0:height,0:width] = placeToPutSign_joined
# display image
cv2.imshow("result", bg_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.