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

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

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

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

9633閲覧

opencvを使って画像の切り抜き

yosutebito092

総合スコア26

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/11/09 12:14

イメージ説明
例えばこういう小説の文章ページがあって、これの余白の部分だけを切り抜く方法ってないですか?
白い文字の部分だけを避けて下のいわゆる余白であるはずの黒い部分の画像を切り抜きたいです。ついでに文字の上の部分も切り取ってなくしたいです。
ちなみにこれは二値化した画像です。元の画像は普通の小説のページです。
これ見開きなんで片側のページだけでも大丈夫です。

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

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

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

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

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

can110

2018/11/09 23:22

提示された画像は実際に処理する画像ですか?小さく、また2値画像ではなくグレイスケール画像に見えます。また、上部には罫線?下部には罫線+ひし形の背景画像がありますが。
guest

回答1

0

ベストアンサー

より単純な画像での処理コードを書いてみました。

  • findContoursで文字の輪郭を抽出
  • 文字の輪郭群を含む外接矩形を算出
  • 外接矩形で切り抜き

しています。

なお、実際の提示画像には罫線や背景画像がふくまれているようですので、それらを除去する前、中間処理が必要になってくるかと思います。

Python

1import cv2 2 3# 輪郭に外接する矩形を返す 4def get_bounding_rect(img,cnt,rc): # 画像,輪郭,初期矩形 5 l,t,r,b = rc[0][0],rc[0][1],rc[1][0],rc[1][1] 6 for pt in cnt: 7 x,y = pt[0][0],pt[0][1] 8 if x < l: l = x 9 if y < t: t = y 10 if x > r: r = x 11 if y > b: b = y 12 return [(l,t),(r,b)] 13 14def main(): 15 img_src = cv2.imread('src.png') 16 17 # 処理対象をモノクロ画像に 18 img_bin = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY) 19 _,img_bin = cv2.threshold(img_bin, 100, 255, cv2.THRESH_BINARY) 20 21 # 輪郭抽出 22 _,cnts,_ = cv2.findContours(img_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 23 24 # 全文字を含む外接図形 25 import copy 26 rc0 = [[img_bin.shape[1],img_bin.shape[0]],[-1,-1]] # 初期矩形 27 rect_img = copy.deepcopy(rc0) 28 29 for cnt in cnts: # cnt =文字毎の輪郭 30 # 外接矩形を求める 31 rect_img = get_bounding_rect(img_bin,cnt,rect_img) # 全文字を含む 32 rect_cnt = get_bounding_rect(img_bin,cnt,copy.deepcopy(rc0)) # 文字毎 ※チェック用 33 34 cv2.rectangle(img_src, rect_cnt[0], rect_cnt[1], (255,0,0), thickness=1, lineType=cv2.LINE_4) # 文字毎。青 35 36 cv2.rectangle(img_src, rect_img[0], rect_img[1], (0,0,255), thickness=1, lineType=cv2.LINE_4) # 全文字を含む。赤 37 38 img_crop = img_bin[rect_img[0][1]:rect_img[1][1],rect_img[0][0]:rect_img[1][0]] # 抽出領域 39 40 cv2.imwrite('check.png', img_src) 41 cv2.imwrite('dst.png',img_crop) 42 43if __name__ == "__main__": 44 main()

元画像
イメージ説明
結果確認
イメージ説明
クロップ後
イメージ説明

投稿2018/11/09 23:36

can110

総合スコア38233

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問