質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

908閲覧

描画した領域内での二値化

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/22 14:23

編集2020/01/22 23:41

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値化処理ができないかと考えています.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/22 18:11

Q.1 このままだと何に困っているのか伝わってこないため、うまくいかない状態のサンプル画像を掲載することは可能ですか? Q.2 cv2.erode()は通常二値化画像(グレースケールで0か255の画像)に対して使われる関数と理解しています。通常のグレースケールの状態で使うメリットは何かあるのでしょうか?
退会済みユーザー

退会済みユーザー

2020/01/22 23:15

Q1への回答:扱っている書面の一部に個人情報が含まれているため,サンプルの添付はできません.申し訳ありません. Q2への回答:cv2.erode()を使った意図としては,文字を滲ますために使用してます. 印刷された文字一つ一つを□で描画するのも考えたんですが,その際文字が小さい場合,うまくいかなかったので,滲ますことで文字がある領域を□で描画しています.
退会済みユーザー

退会済みユーザー

2020/01/22 23:27

ダミーでも良いのでどれくらいのかすれ感か伝わるものがあれば、回答が得られやすくなります。参考まで。
退会済みユーザー

退会済みユーザー

2020/01/22 23:42

分かりました。 サンプル画像を作ります。
guest

回答1

0

ベストアンサー

かすれ文字がある領域がわかっているなら、その範囲だけコピーすると、全領域2値化ができる。
その後、元の位置にコピーする。

投稿2020/01/22 23:41

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/23 00:10

もう少し詳しく聞きたいです。 cv2.findContours の返り値(contours)を使って、処理箇所を限定するって事ですか?
Q71

2020/01/23 02:14

そうです。
退会済みユーザー

退会済みユーザー

2020/01/23 03:05

なるほど. 早速,試してみます. ありがとうございます.
Q71

2020/01/23 06:07

調べてみると、リージョンが取れるのではなく、グルっと回る座標の配列が取れるのですね。その座標配列のx、yについて、最小と最大を探せば、外接する四角、対象を含む範囲になります。 画像は、3次元の配列になっています。カラーの部分は全部と、x, yは先に求めた最小から最大の範囲をコピーすれば、かすれた文字だけ取り出せるということです。
退会済みユーザー

退会済みユーザー

2020/01/23 12:11

無事完成させることができました! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問