画像処理の最初の知り合い:エントリーから転職まで

最後の失敗の後、私は今回賢くなることを学びました。
私は自分で物を作ることはできません。それは何でもありません。私は他の人をフォローし、他の人のコードをかじり、他の人から学びます。
そのため、今回は銀行カード番号の認識にpythonを使用します。
言うことはあまりありません、始めましょう!

import cv2
import numpy as np

描画機能を定義する

def imshow(name、img):
cv2.imshow(name、img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1
2
3
4
5
6
7
8
cv2.imshow()画像と組み合わせたパンチのセットを描画します。私たち若者は、化学的な髪を受け取った後はそれを我慢できません。まず、機能パッケージを定義しましょう。

テンプレート画像を読む

0は、シングルチャネル画像、つまりグレースケール画像として読み取ることができることを意味します。

ref = cv2.cvtColor(img_num、cv2.COLOR_BGR2GRAY)をグレースケールに変換

img_num = cv2.imread( '画像/ ocr_a_reference.png'、0)
関数imshow( 'img_num'、img_num)
1
2
3
4
5
ここで挿入画像の説明

バイナリイメージに変換

cv2.threshold(入力画像、しきい値、割り当て、メソッド)ここで、メソッドは、しきい値より高い場合は0、しきい値より低い場合は255です。

cv2.thresholdは2つの値を返します2番目の値は必要な処理済み画像です

img_num_bin = cv2.threshold(img_num、10,255、cv2.THRESH_BINARY_INV)[1]
imshow( 'img_num_bin'、img_num_bin)
1
2
3
4次の銀行カード番号は白になり、白に変換さ
れる
ため、ここに画像の説明を挿入します後続のテンプレートマッチングを容易にするための黒い背景

輪郭抽出

cv2.findContours()関数で受け入れられるパラメーターはバイナリイメージです。つまり、白黒(グレースケールではない)です。cv2.RETR_EXTERNALは外側の輪郭のみを検出し、cv2.CHAIN_APPROX_SIMPLEは終点の座標のみを保持します。

返されるリストの各要素は、画像のアウトラインです。

num_cntsリスト、 = cv2.findContours(img_num_bin.copy()、cv2.RETR_EXTERNAL、cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img_num_bin、num_cnts_list、-1、(0,0,255)、3)
imshow_num( 'img_num)
1
2
3
4
5
ここに挿入し
輪郭は表示されていませんが、コントラストが狭くなっていますが、輪郭が自動的に黒くなったためですか?とりあえず、気にしないでください。そうすれば、各アウトラインを丸で囲む必要があります。そうすれば、いつ見るかがわかります。

輪郭の並べ替え
num_rect_list = num_cnts_sort(num_cnts_list)
1
num_cnts_sortは、輪郭を並べ替えて特定の順序で返すカスタム関数です。

def num_cnts_sort(list、right = 1、up = 0):

up = 1は上から下、right = 1は左から右、-1はその逆を意味します。

reverse = False
if up==-1 or right== -1:
    reverse = True

if up == 0:
    # 左右方向排序 权重选x
    i = 0

if right == 0:
    i = 1

# 找到的轮廓用外接矩形框起来 cv2.boundingRect(c)返回x,y,w,h
boundingBoxs = [cv2.boundingRect(c) for c in list] #生成器
# sorted(输入序列,排序规则,reverse=True 由小到大否则由大到小)
# lambda 匿名函数 输入序列的每个元素 输出b[i]
boxs = sorted(boundingBoxs,key= lambda b: b[i],reverse=reverse )

return boxs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
順番に矩形を外接各輪郭を描き

num_rect_listのnum_rectの場合:
(x、y、w、h)= num_rect
num_rect_img = cv2.rectangle(img_num_bin.copy()、(x、y)、(x + w、y + h)、(255,0,0 )、2)
imshow( 'num_rect_img'、num_rect_img)

1
2
3
4
5
ここに画像の説明を挿入して
並べ替えも問題ありません。次に、対応するデジタルテンプレートを番号に対応するように切り取ります。

写真を数字に合わせる

num_rect_dic = {}
for(i、num_rect)in enumerate(num_rect_list):(
x、y、w、h)= num_rect

num_rect_item = img_num_bin[y:y+h,x:x+w]
num_rect_item = num_resize(num_rect_item,h_size=88)
# 把数字和截下来的图像对应
num_rect_dic[i]=num_rect_item
imshow('num_rect_item', num_rect_item)

1
2
3
4
5
6
7
8
9
10
num_resizeはカスタム関数です。高さまたは幅を入力して、ズームを自動的に計算します

def num_resize(img、w_size = 0、h_size = 0):(
w、h)= img.shape#size戻る回总要素A数和matlab不一的
if w_size == 0:
r = h_size / float(h)
w_size = INT(R H)
であればh_size == 0:
R = w_size /フロート(W)
h_size = INT(W
H)
リサイズ= cv2.resize(IMG、(w_size、h_size))
リサイズリターン

1
2
3
4
5
6
7
8
9
10
11
銀行カードの画像前処理の対

銀行カード画像の前処理

画像を読む

bank_img = cv2.imread( 'images / credit_card_01.png')
bank_img_gray = cv2.cvtColor(bank_img、cv2.COLOR_BGR2GRAY)
imshow( 'bank_img'、bank_img)
imshow( 'bank_img_gray'、bank_img_gray)

畳み込みカーネルを定義する

rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT、(9、3))#長方形の畳み込みカーネル
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT、(5,5))

トップハット操作は明るい部分を強調します

bank_img_tophat = cv2.morphologyEx(bank_img_gray、cv2.MORPH_TOPHAT、rectKernel)
関数imshow( 'bank_img_tophat'、bank_img_tophat)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
インサート
の水平線画像記述番号ここでは、私が考える、暗すぎます二値化を実行する場合は、適切なパラメータを選択するか、エッジ検出を実行します。

エッジ検出

X方向エッジ検出処理

bank_img_grad = cv2.Sobel(bank_img_tophat、cv2.CV_32F、1,0、ksize = -1)
imshow( 'bank_img_tophat'、bank_img_grad)

正規化

bank_img_grad_abs = np.absolute(bank_img_grad)
(max、min)=(np.max(bank_img_grad_abs)、np.min(bank_img_grad_abs))
bank_img_grad_abs =(255 *(bank_img_grad_abs-min)/(max-min))
bank_img_grad_ab astype( 'uint8')
imshow( 's'、bank_img_grad_abs)

二値化cv2.THRESH_OTSUは、二値化の適切なしきい値を選択しますcv2.thresholdは2つの要素を返し、2番目は処理された画像です

bank_img_bin = cv2.threshold(bank_img_grad_abs、0、255、cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

imshow( 's'、bank_img_bin)

おすすめ

転載: blog.51cto.com/14308903/2550977