Python初心者です.
現在,書面上のかすれ文字を読み取るプログラムを作成しています.
読み込んだ画像全体で2値化処理を行った場合,かすれ文字がうまく出てきません.
そこで,文字領域を抽出した後,その領域内で大津の2値化を行おうと考えているのですが,
どのようにプログラムを書いたらいいのか分からなくて困っています.
皆さんの知識をお借りしたい次第であります.
よろしくお願いします.
また,以下に作製途中のソースコードを載せておきます.
import cv2 import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Polygon ## 画像の読み込み img = cv2.imread("moji.jpg") ## RGBからグレ―スケールに変換 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) kernel = np.ones((4,6), np.uint8) ## 収縮処理 erosion = cv2.erode(gray, kernel, iterations = 1) ## 2値化処理(大津) ret2, img_otsu = cv2.threshold(erosion, 0, 255, cv2.THRESH_OTSU) ## 閾値がいくつになったか確認 print("ret2: {}".format(ret2)) ## 白黒反転 img_otsu2 = cv2.bitwise_not(img_otsu) ## 輪郭の抽出 contours, hierarchy = cv2.findContours(img_otsu2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) print("contours={}, ".format(len(contours))) print("hierarchy={}".format(len(hierarchy))) min_area = img.shape[0] * img.shape[1] * 1e-9 tmp = img2 if len(contours) > 0: for i, contour in enumerate(contours): ## 外接短形 x,y,w,h = cv2.boundingRect(contour) # 点群に外接する傾いていない短形を求める。 if w < 3 or h < 3: continue ## 領域の面積 area = cv2.contourArea(contour) # 輪郭が囲む領域の面積を求める。 if area < min_area: continue ## 長方形の描画 cv2.rectangle(tmp, (x,y), (x+w,y+h), (0, 255, 0), 2) ## 画像の表示 cv2.imshow("Show Image_result", tmp) cv2.waitKey() cv2.imwrite("out-put1.jpg", tmp)
サンプル画像
これはレシートに直接手書きで緑の枠線を書いています.
同様の処理をプログラムではできています.
この1つ1つの領域内で,2値化処理ができないかと考えています.
Q.1 このままだと何に困っているのか伝わってこないため、うまくいかない状態のサンプル画像を掲載することは可能ですか?
Q.2 cv2.erode()は通常二値化画像(グレースケールで0か255の画像)に対して使われる関数と理解しています。通常のグレースケールの状態で使うメリットは何かあるのでしょうか?
Q1への回答:扱っている書面の一部に個人情報が含まれているため,サンプルの添付はできません.申し訳ありません.
Q2への回答:cv2.erode()を使った意図としては,文字を滲ますために使用してます.
印刷された文字一つ一つを□で描画するのも考えたんですが,その際文字が小さい場合,うまくいかなかったので,滲ますことで文字がある領域を□で描画しています.
ダミーでも良いのでどれくらいのかすれ感か伝わるものがあれば、回答が得られやすくなります。参考まで。
分かりました。
サンプル画像を作ります。
回答1件
あなたの回答
tips
プレビュー