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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

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

Q&A

解決済

1回答

2478閲覧

任意の範囲の画像の切り出し方。

zuzu1984

総合スコア31

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

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

0グッド

0クリップ

投稿2019/03/02 06:17

座標(?)と言うのか分からないですが、
座標が分からない場合でも【画像A】から【ゴール】画像の範囲を切り出したいです。

座標指定する場合の切り抜きは分かるのですが、
・座標が分からない場合の座標の求め方
・もしくは座標云々ではなく、他のアプローチの仕方が適しているのか

今までは、Pyautoguiでテンプレ画像を先に持っていて、それを画面から検索→座標の取得、という方法を行っていました。
が、今回はPythonはPythonでも他の方法で何とか任意の範囲が切り出せないかと考えています。

座標が分からない場合の、任意の範囲の切り出し方法について色々調べてはいるのですが、現状答えも糸口も見つけられていません。
何卒ご教授頂けますようお願い致します。

【画像A】
イメージ説明

【ゴール】
イメージ説明

初歩の初歩ですが、これしかコードが掛けていません。。。

from PIL import Image def main(): pass if __name__ == '__main__': main() im = Image.open('img_base.jpg') im_crop = im.crop((40, 24, 240, 86)) im_crop.save('img_base_cut.jpg', quality=95)

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

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

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

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

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

tiitoi

2019/03/02 06:20

Pyautogui で実現できているようですが、なにか問題点があって別の方法を探しているのでしょうか? 手法はそれぞれ利点、欠点があるので、それが明らかでないと他の手法を勧めてもまた別の問題が生じるかもしれません。
zuzu1984

2019/03/02 06:31

今回Pyautoguiを使わない方向で考えている理由は以下です。 ・他のアプローチからも画像を切り抜けるのであれば、試してみたい。 ・Pyautoguiは切り出し元の画像を、画面上に表示しなくてはいけない。  (今回は常に画面に切り出し元の画像を表示しておくディスプレイ上の余裕がないです) ・元の画像はデザインは変わりませんが、都度倍率、角度が微妙に異なる。  (説明下手ですみませんが、1日目はこの範囲と決めたら例えば100回その範囲を使って画像を切り出す。2日目は1日目と倍率などが異なるので、新たに範囲を決めて、その範囲で例えば100回その範囲を切り出す。)
tiitoi

2019/03/02 06:41

範囲を決める作業は毎日手動で行うということでよろしいのでしょうか?
zuzu1984

2019/03/02 11:32

出来れば、何かを目印にするとかできればいいのですが。 Pyautoguiの考え方から抜けきらないので恐縮ですが、例えばx=上辺の黒とグレーの上境目×3行目の枠になっている左側の角、y=3行目の枠になっている右側の角×下辺の黒とグレーの境目、というような。。。
zuzu1984

2019/03/02 11:33

毎回手動ではなく、デザインの特徴をとらえて自動検知が望ましいと思っています。
tiitoi

2019/03/02 11:37

自動でやる場合、色や形などの基準で画像処理で検出する必要があります。 回答に記載したやり方ではなにか問題がありますか?
zuzu1984

2019/03/02 13:45

すみません、回答の方を見ていませんでした。。。 早速自分で試してみようと思います。 ありがとうございます。
guest

回答1

0

ベストアンサー

画像処理でやるなら、色を目印にして2値化後に輪郭抽出を行い、切り出しですね。

・座標が分からない場合の座標の求め方

切り出す部分を色や形などなんらかの基準で定義し、画像処理で探す。

・もしくは座標云々ではなく、他のアプローチの仕方が適しているのか

切り出す以上、切り出す範囲の座標は必要です。(手動で設定するのであれ、自動で決めるのであれ)

サンプルコード

コメントは入れましたが、画像処理に関する知識があるという前提で書いているので、わからない場合はまず画像処理に関する勉強をするとよいでしょう。

python

1import cv2 2import numpy as np 3 4# 画像読み込み 5img = cv2.imread('sample.jpg') 6# 2値化 7gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 8ret, binary = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY) 9# 輪郭抽出 10contours = cv2.findContours( 11 binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0] 12# 面積が最大の輪郭を選択する。 13cnt = max(contours, key=lambda x: cv2.contourArea(x)) 14# 外接矩形を取得する。 15x, y, width, height = cv2.boundingRect(cnt) 16# 切り出す。 17roi = img[y:y + height, x:x + width] 18cv2.imwrite('output.png', roi)

イメージ説明
輪郭抽出結果

イメージ説明
切り出し後

このやり方の場合、倍率が変わったり、傾いていたりしても切り出し可能です。

投稿2019/03/02 06:54

編集2019/03/02 07:03
tiitoi

総合スコア21954

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

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

zuzu1984

2019/03/02 14:11

早速自分で試し、書いて頂いていたことを理解しました。 今は範囲を調整して見たり、というアレンジしかできませんが、早く自分でしっかり考えて、書けるように勉強頑張ります。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問