前言
当我们分割银行卡字符的时候,会遇到银行卡照片过于模糊,而且我们的算法无法提取,这样的情况下我们就会用到我们自己去手动寻找银行卡卡号的位置。
提示:以下是本篇文章正文内容,下面案例可供参考
一、代码
import cv2 as cv;
import numpy as np
def shoudong(img1):
roi = cv.selectROI(windowName="roi", img=img1, showCrosshair=True, fromCenter=False)
x, y, w, h = roi
if roi != (0, 0, 0, 0):
crop = img[y:y + h, x:x + w]
cv.imshow('crop', crop)
return image_process(crop)
def image_process(img):
# img = cv.imread(file_path, 0)
blur = cv.GaussianBlur(img, (3, 3), 0) # 高斯模糊
gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY) # 将图像变为灰路图像
ret, binary = cv.threshold(gray, 50, 255, cv.THRESH_BINARY) # 二值化
# kernel = np.ones((1, 50), np.uint8)
# erosion = cv.erode(binary, kernel) # 膨胀
# dilation = cv.dilate(erosion, kernel) # 腐蚀
cv.imshow("dddd",binary)
return num_split(binary)
def num_split(img):
kernel = np.ones((1, 50), np.uint8)
erosion = cv.erode(img, kernel) # 膨胀
dilation = cv.dilate(erosion, kernel) # 腐蚀
height, width = dilation.shape
v = [0] * width
z = [0] * height
a = 0
# 垂直投影:统计并存储每一列的黑点数
for x in range(0, width):
for y in range(0, height):
if img[y, x] == 255:
continue
else:
a = a + 1
v[x] = a
a = 0
# 创建空白图片,绘制垂直投影图
l = len(v)
emptyImage = np.full((height, width), 255, dtype=np.uint8)
for x in range(0, width):
for y in range(0, v[x]):
emptyImage[y, x] = 0
#分割字符
Position = []
Wstart = 0
Wend = 0
W_Start = 0
W_End = 0
v[0], v[len(v)-1] = 0, 0
for j in range(len(v)):
if v[j] > 0 and Wstart == 0:
W_Start = j
Wstart = 1
Wend = 0
if v[j] <= 0 and Wstart == 1:
W_End = j
Wstart = 0
Wend = 1
if Wend == 1:
Position.append([W_Start, 0, W_End, height])
Wend = 0
data = []
for m in range(len(Position)):
temp_img = img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]]
h1, w1 = temp_img.shape
if w1 > h1:
return []
#temp_img = cv.resize(temp_img, (16, 16))
h0, w0 = temp_img.shape
temp_data = []
for hx in range(h0):
for wx in range(w0):
temp_data.append(float(temp_img[hx, wx]))
data.append(temp_data)
for m in range(len(Position)-18):
cv.imshow("1", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-17):
cv.imshow("2", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-16):
cv.imshow("3", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-15):
cv.imshow("4", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-14):
cv.imshow("5", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-13):
cv.imshow("6", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-12):
cv.imshow("7", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-11):
cv.imshow("8", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-10):
cv.imshow("9", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-9):
cv.imshow("10", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-8):
cv.imshow("11", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-7):
cv.imshow("12", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-6):
cv.imshow("13", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-5):
cv.imshow("14", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-4):
cv.imshow("15", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-3):
cv.imshow("16", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-2):
cv.imshow("17", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)-1):
cv.imshow("18", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
for m in range(len(Position)):
cv.imshow("19", img[Position[m][1]:Position[m][3], Position[m][0]:Position[m][2]])
return temp_img
img = cv.imread(r"D:\\1.png")
cv.imshow('roi', img)
shoudong(img)
cv.waitKey(0)
cv.destroyAllWindows()
二、代码实现结果
总结
这里对文章进行总结:
虽然我们可以自己去选择银行卡号的位置,但是部分银行卡片的银行号码还是无法进行分割,原因是因为银行卡的照过于模糊,或者又是银行卡的号码颜色与银行卡面的颜色过于接近,无法分离开。