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

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

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

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

Python

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

Q&A

1回答

3169閲覧

画像の特定箇所を切り出し、別の画像にずらして合成する手法はありませんか

komanndap

総合スコア5

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/03/16 10:48

前提・実現したいこと

イメージ説明

二つの線グラフの画像を、片方の画像のグラフの最後尾に合わせて切り出したもう一方を合成するようなプログラムを作りたいです。

試したこと

画像処理にPythonが使えないかと調査したところ、OpenCVというライブラリが画像処理に使えそうだということはわかりましたが、
特定の色の箇所の矩形を切り出したり、ベースとなる画像にずらして画像を合成する手法を見つけられませんでした。

補足情報(FW/ツールのバージョンなど)

今Pythonの環境をPCにいれているので、できればPythonで実現できればありがたいですが、他の方法でも可能であればぜひご教授いただけると幸いです。

よろしくお願いします。

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

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

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

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

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

fana

2020/03/17 01:59

やりたいことは本当に「画像の切り貼り」なのでしょうか? 例えば,目的が「2つのグラフを統合した1つのグラフを作る」であれば, 質問内の絵のように軸の線(黒い横線)までコピーされていると「1つのグラフ」としてはかなり見苦しいのでは?とか思うのですが.
komanndap

2020/03/17 02:30

fanaさん ご回答ありがとうございます! 本当はベースとなるグラフに二つ目のグラフの線だけを合成できれば最高なのですが、とても難しそうだったのでこの質問にしました。 質問の合成が実現できたらさらにきれいに合成できるようにまでしたいと思います!
guest

回答1

0

グラフが描かれている画像を切り貼りしたいということですよね。
どこらへんまでの知識があるのかわからないので、少し詳し目に説明いたします。

[画像の切り取り] ⇒ (参考)https://qiita.com/yori1029/items/a0ddd25c9571b28f3e1c
・image2 = image1[(上端):(下端), (左端):(右端)]で、
image1を切り取り、image2に代入できます。

[画像の貼り付け] ⇒ (参考)https://www.mathpython.com/ja/opencv-image-add/
・image3[(上端):(下端), (左端):(右端)] = image2で、
image2をimage3の該当箇所に貼り付けられます。

例ですが、おおまかに以下のように画像を切り出したり、貼り付けたりできます。
その位置を適宜指定(leftとかrightとか書いているところ)すれば、
質問にあるような図も作成できます。

Python

1import cv2 2 3image1 = cv2.imread("ファイル名") 4 5image3 = np.zeros((500,500), dtype = np.uint8) # 真っ黒な画像を用意。ここに画像を貼り付けます。 6 7# 画像を切り取る 8left, right, top, bottom = [100, 200, 150, 250] 9image2 = image1[top:bottom, left:right] 10 11# 画像を貼り付ける 12left_, right_, top_, bottom_ = [10, 110, 200, 300] 13image3[top_:bottom_, left_:right_] = image2 14 15# 別のところを切り取る 16left, right, top, bottom = [0, 100, 0, 150] 17image2 = image1[top:bottom, left:right] 18 19# 画像を貼り付ける 20left_, right_, top_, bottom_ = [110, 210, 200, 350] 21image3[top_:bottom_, left_:right_] = image2 22 23 24cv2.imshow("a", image3) # 画像を表示する 25 26cv2.waitKey() 27cv2.destroyAllWindows() 28

イメージ説明

投稿2020/03/16 13:51

Matsui_hero

総合スコア346

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

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

komanndap

2020/03/17 00:19

Matsui_heroさん ご回答いただきありがとうございます! 画像の合成についてはまさに探していた方法です! さらに画像の切り出しまで自動化したいのですが、そういった手法はありませんか? 実際のグラフの画像も質問に乗せたようにオレンジや青といった線で描かれているので、「オレンジ、青、緑」といったグラフを構成する色を指定して、グラフの始まりと終わりの座標やグラフを囲むような矩形で切り出しができればすごくうれしいです。 よろしくお願いします!
fana

2020/03/17 01:53

やりたいことが具体的にわかっているのだから,話の全体を完全に丸投げするんじゃなくて,少しは考えてみればよいのでは… 「矩形範囲さえ指定すれば切り貼りできる」という回答が得られているのだから,矩形の範囲を決められればよい. →切り出す範囲は?  →グラフの色がわかっているのだからその色の範囲.   質問用の画像を作る際に手作業で切り出した際の切出し範囲はどうやって決めたのか?   それが切出し範囲を決めるアルゴリズムそのものになり得るのでは? →貼り付ける範囲は?  →グラフが繋がるようにしたい   すなわち,貼り付け先画像のグラフの先端の座標と,貼り付ける切出し画像のグラフの(左側の)先端の座標が一致するように貼り付け先範囲を決めれば良い.   →「先端の座標」とは画素値を見れば決められるハズ →懸念点は?  →「貼り付ける範囲」が貼り付け先の画像範囲の外側にはみ出すことになっても大丈夫なのだろうか? とか. …という感じ順序立てて考えて,どこかに何か難題が存在するのであれば,そこの部分を具体的に訊けばよいでしょう. あるいは実際にやってみて出てきた問題について,とか.
komanndap

2020/03/17 02:33

fanaさん ご回答ありがとうございます! 画素値というものがあるのですね。 画僧の画素値を取得して緑の画素値とかと比較すればグラフの端が分かりそうな気がしました! ありがとうございます!
fana

2020/03/17 03:13

OpenCVには「何かいろんな処理」が用意されてはいますが,とりあえずそれはそれとして, 画像の各画素の値を読み書きすることさえできれば,自前でそういった「いろんな処理」を書けるわけです(もちろん 時間,能力,その他諸々 が必要になるかもですが). まずそこから考えて「でもこの処理ってわざわざ自前で実装しなくてもOpenCVに用意されていないかな?」あるいは「用意されているいくつかの処理を組み合わせて実現できないかな?」と探すと良いかと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問