image = imutils.resize(image, width=300)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
加载了包含信用卡照片的命令行参数图像。 然后,我们将其调整为 width=300 ,保持纵横比,然后将其转换为灰度。 让我们看看我们的输入图像:
接下来是我们的调整大小和灰度操作:
现在我们的图像已经灰度化并且大小一致,让我们进行形态学操作:
apply a tophat (whitehat) morphological operator to find light
regions against a dark background (i.e., the credit card numbers)
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel)
使用我们的 rectKernel 和我们的灰度图像,我们执行 Top-hat 形态学操作,将结果存储为 tophat。
Top-hat操作在深色背景(即信用卡号)下显示浅色区域,如下图所示:
给定我们的高帽图像,让我们计算沿 x 方向的梯度:
compute the Scharr gradient of the tophat image, then scale
the rest back into the range [0, 255]
gradX = cv2.Sobel(tophat, ddepth=cv2.CV_32F, dx=1, dy=0,
ksize=-1)
gradX = np.absolute(gradX)
(minVal, maxVal) = (np.min(gradX), np.max(gradX))
gradX = (255 * ((gradX - minVal) / (maxVal - minVal)))
gradX = gradX.astype(“uint8”)
我们努力隔离数字的下一步是计算 x 方向上高帽图像的 Scharr 梯度。完成计算,将结果存储为 gradX 。
在计算 gradX 数组中每个元素的绝对值后,我们采取一些步骤将值缩放到 [0-255] 范围内(因为图像当前是浮点数据类型)。 为此,我们计算 gradX 的 minVal 和 maxVal,然后计算第 73 行所示的缩放方程(即最小/最大归一化)。 最后一步是将 gradX 转换为范围为 [0-255] 的 uint8。 结果如下图所示:
让我们继续改进信用卡数字查找算法:
apply a closing operation using the rectangular kernel to help
cloes gaps in between credit card number digits, then apply
Otsu’s thresholding method to binarize the image
gradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, rectKernel)
thresh = cv2.threshold(gradX, 0, 255,
cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
apply a second closing operation to the binary image, again
to help close gaps between credit card number regions
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sqKernel)
为了缩小差距,我们执行