OpenCV를 사용하여 종이에 누른 인감을 전자화 해 보았습니다.
Motive
Excel 시트나 word로 자신의 인감을 날인하는 부분이 있거나 합니다. 조금 중요한 서류라면 시청에 등록되어 있는 인감 증명과 같은 것을 사용하고 싶을 때가 있습니다만, 이전에는 한번 편의점에서 종이를 인쇄해 날인해, 다시 스캔으로 pdf화해 제출을 했습니다.
상당한 아날로그 처리를 하고 있었던 것입니다만, 인감을 이미지화해 시트에 붙여 넣을 수 있으면 편의점에 가는 수고가 없어져 좋을까라고 생각하는 방법을 생각해 보았습니다.
처음에는 인감을 촬영하고, PowerPoint나 프리의 이미지 편집 툴을 사용해 배경색을 투과하려고 했습니다만 종이 질에 의해서 모두를 변환하는 것은 할 수 없고 단념해 버렸습니다.
그래서 시행착오해서 결국 OpenCV에서 이미지 처리를 몇 줄 써서 문제를 해결했으므로 비망록으로 남겨 둡니다.
Dataset
액세어 에 있던 인감 샘플을 사용했습니다.
Method
액세어 에 있던 인감 샘플을 사용했습니다.
Method
개발
import cv2
import sys
import numpy as np
if __name__ == '__main__':
if len(sys.argv) != 2:
sys.exit()
window_name = "sample"
img_path = sys.argv[1]
mat = cv2.imread(img_path)
gray = cv2.cvtColor(mat, cv2.COLOR_BGR2GRAY)
cv2.imwrite("gray.png", gray)
#二値化
ret2, mono = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)
cv2.imwrite("mono.png", mono)
#マスキング処理
dst = cv2.bitwise_and(mat,mat,mask=mono)
cv2.imwrite("dst.png", dst)
#channelを3 -> 4に変更
alpha = cv2.cvtColor(dst, cv2.COLOR_BGR2BGRA)
#背景が黒い部分のみ透過
for i,col in enumerate(dst):
for j,row in enumerate(col):
color = dst[i][j]
if (color == np.array([0,0,0])).all():
alpha[i][j][3] = 0
cv2.imshow(window_name, alpha)
cv2.imwrite("out.png", alpha)
cv2.waitKey(0)
cv2.destroyWindow(window_name)
이번에는 도중까지 처리한 화상 데이터도 출력하고 있습니다.
Result
처리 흐름
output
원본 데이터
흑백
이진화 + 반전
마스킹
배경색 투명(처리 종료)
Future
cv2.bitwise_and
를 이용하면 배경투과는 간단하게 작성할 수 있습니다.
툴을 사용해 시간이 걸릴 것 같으면 이쪽이 좋을 것 같습니다.
Reference
import cv2
import sys
import numpy as np
if __name__ == '__main__':
if len(sys.argv) != 2:
sys.exit()
window_name = "sample"
img_path = sys.argv[1]
mat = cv2.imread(img_path)
gray = cv2.cvtColor(mat, cv2.COLOR_BGR2GRAY)
cv2.imwrite("gray.png", gray)
#二値化
ret2, mono = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)
cv2.imwrite("mono.png", mono)
#マスキング処理
dst = cv2.bitwise_and(mat,mat,mask=mono)
cv2.imwrite("dst.png", dst)
#channelを3 -> 4に変更
alpha = cv2.cvtColor(dst, cv2.COLOR_BGR2BGRA)
#背景が黒い部分のみ透過
for i,col in enumerate(dst):
for j,row in enumerate(col):
color = dst[i][j]
if (color == np.array([0,0,0])).all():
alpha[i][j][3] = 0
cv2.imshow(window_name, alpha)
cv2.imwrite("out.png", alpha)
cv2.waitKey(0)
cv2.destroyWindow(window_name)
처리 흐름
output
원본 데이터
흑백
이진화 + 반전
마스킹
배경색 투명(처리 종료)
Future
cv2.bitwise_and
를 이용하면 배경투과는 간단하게 작성할 수 있습니다.
툴을 사용해 시간이 걸릴 것 같으면 이쪽이 좋을 것 같습니다.
Reference
액세어
Reference
이 문제에 관하여(OpenCV를 사용하여 종이에 누른 인감을 전자화 해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/satsukiya/items/82e1ff40f2f5d751a94e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)