JKになりたい

何か書きたいことを書きます。主にWeb方面の技術系記事が多いかも。

めっちゃ粗い画像の数字を認識したい-試行錯誤編-

この画像↓を鮮鋭化するために試行錯誤するで。粗いなあ・・5か6かわからんで・・。
f:id:deeptoneworks:20160920003646p:plain
知り合いの人に色々なフィルタリング方法を教えてもらったんや。それをほぼそのまま貼るで。

アンシャープマスキング

k = 4.0
op = np.array([
[-k, -k, -k],
[-k, 1 + 8 * k, -k],
[-k, -k, -k] ])
img_tmp = cv2.filter2D(img, –1, op)
img_dst = cv2.convertScaleAbs(img_tmp)
plt.imshow(img_dst)

f:id:deeptoneworks:20160920033250p:plain

ソーベルフィルタ

img_tmp_x = cv2.Sobel(img, cv2.CV_32F, 1, 0)
img_dst_x = cv2.convertScaleAbs(img_tmp_x)
img_tmp_y = cv2.Sobel(img, cv2.CV_32F, 0, 1)
img_dst_y = cv2.convertScaleAbs(img_tmp_y)
image = cv2.addWeighted(img_dst_x,1.0,img_dst_y,1.0,0)
plt.imshow(image)

f:id:deeptoneworks:20160920034412p:plain

色々な2値化

im_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
th1 = cv2.adaptiveThreshold(im_gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2)
blur = cv2.bilateralFilter(im_gray,6,12,3)
ret,th2 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
ret,th3 = cv2.threshold(blur,70,255,cv2.THRESH_BINARY_INV)
plt.subplot(2,2,1),plt.imshow(img,‘gray’)
plt.title(‘input image’)
plt.subplot(2,2,2),plt.imshow(th1,‘gray’)
plt.title(‘Adaptive Gaussian Thresholding’)
plt.subplot(2,2,3),plt.imshow(th2,‘gray’)
plt.title(u"filter+ootsu")
plt.subplot(2,2,4),plt.imshow(th3,‘gray’)
plt.title(u"only filter")
plt.show()

f:id:deeptoneworks:20160920034752p:plain

ヒストグラム平滑化

img_gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_eqh = cv2.equalizeHist(img_gry)
plt.imshow(img_eqh)

f:id:deeptoneworks:20160920034916p:plain

モルフォロジー演算(収縮・膨張)

kernel = np.ones((5,5),np.uint8)
im_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,th2 = cv2.threshold(im_gray,180,255,cv2.THRESH_BINARY)
img_dst = cv2.erode(th2,kernel,iterations = 3)
img_dst = cv2.dilate(img_dst,kernel,iterations = 3)
plt.imshow(img_dst)

f:id:deeptoneworks:20160920035209p:plain

モルフォロジー演算、もっといい線いくと思ったんやけどなあ・・。あかんかったわ。
ヒストグラム平滑化は1つの数字の範囲を算出するのに使えそうや。自分で数字認識させるんやったらまず各数字の分離をせんとあかんからなあ。