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

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

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

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

Python

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

Q&A

解決済

1回答

2258閲覧

python OpenCVを用いた画像合成

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/10/29 16:09

pythonでopencvを用いて画像処理の勉強をしています。
イメージ説明
上記の画像の白部分のみに
イメージ説明
この画像をタイル状に描写したいのですが、どうしたらよいでしょうか。

python

1import cv2 2 3google_img = cv2.imread('google.png') 4baboon_img = cv2.imread('baboon.jpg') 5 6g_height, g_width, g_channel = google_img.shape 7b_height, b_width, b_channel = baboon_img.shape 8print(google_img.shape) 9print(baboon_img.shape) 10 11 12 13for x in range(g_height): 14 for y in range(g_width): 15 g, b, r = google_img[x, y] 16#白部分を黒く 17 if (b, g, r) == (255, 255, 255): 18 google_img[x, y] = 0, 0, 0 19 20 21cv2.imshow("google", google_img) 22 23cv2.waitKey(0) 24cv2.destroyAllWindows()

このような感じで白部分を認識することはできたのですが、 #白部分を黒く のところで下記を試したりしたのですがエラーとなってしまってうまくできませんでした。

python

1google_img[x, y] = baboon_img[x, y]

何か良いやり方はないのでしょうか??

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

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

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

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

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

guest

回答1

0

ベストアンサー

今回のケースでは、google.pngとbaboon.jpgのwidth/heightはそれぞれ異なるサイズとなる為
サイズがオーバーしている場合の例外処理なども併せて必要になると思います。
範囲外の場合には処理は行わない、繰り返しbaboon.jpgを表示させるなど様々です。

追記

もっとスマートな書き方はあるでしょうが、わかりやすく書いていきます。
この場合bx,byと2枚目の画像の座標をカウントする変数も用意しておくと良いでしょう。
処理はx=0, y=0 → x=0, y=1 →→ x=0, y=511 → x=1, y=0 →→ x=1, y=511という順に処理が行われます。
プログラミングとは関係がないですが、処理の動作順としては織り物をしている様なイメージですね。

まず最初に起こりうるエラーはy列によるindexエラーである為
except節内ではif by >= b_heightとして、もしもb_heightを上回る数値を指定していた場合には
byを0にリセットしてあげます。そうする事で連続して2枚目以降の画像の描写の処理が行われます。
その次に起こりうるエラーがx列によるindexエラーである為
上記のexcept節内で入れ子の様に書いてあげればy列に続きx列の処理も行っていけます。

これで上下左右連続して画像の表示が可能です。
(以下サンプルコードとなりますが、ロゴ部分が一部乱れてしまっておりますが飽くまでも例なのでご容赦ください)

python

1bx = 0 2for x in range(g_height): 3 by = 0 4 for y in range(g_width): 5 g, b, r = google_img[x, y] 6 if (b, g, r) == (255, 255, 255): 7 try: 8 google_img[x, y] = baboon_img[bx, by] 9 except IndexError: 10 if by >= b_height: 11 by = 0 12 try: 13 google_img[x, y] = baboon_img[bx, by] 14 except IndexError: 15 if bx >= b_width: 16 bx = 0 17 try: 18 google_img[x, y] = baboon_img[bx, by] 19 except: 20 pass 21 by += 1 22 bx += 1

投稿2020/10/30 04:22

編集2020/11/01 03:42
nto

総合スコア1438

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

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

退会済みユーザー

退会済みユーザー

2020/10/30 05:39

回答ありがとうございます???? BGRごとにlistにappendしたのですがx,yの座標を指定するにはどうしたら良いでしょうか?
nto

2020/10/30 06:02

コード自体は間違えたりしているわけではないんです。 ただ、部分的な例外の処理が不足しているだけの状態です。 baboonのwidth/heightは512ですが、現状ではgoogleの処理に併せて512以降をbaboon[x, y]として指定しようとしている為インデックスエラーが生じてしまうのです。 例えばif文でもtry文でも構いませんが try: google_img[x, y] = baboon_img[x, y] except: pass としてあげるだけでも、インデックスエラーが生じた場合には処理をパスする為 正しくbaboon.jpgは表示される様になります。 上記であれば、1枚だけ左上詰めで表示されますが これを何枚も敷き詰める様に表示させたい場合には、xやyの値がbaboonのwidthがオーバーした場合~heightがオーバーした場合などと例外の処理を分岐させる事で敷き詰める事ができる様になります。
退会済みユーザー

退会済みユーザー

2020/10/30 06:43

お返事ありがとうございます???? 例外処理を利用して無事一枚のみ左上に表示させることができました。全て敷き詰めるには例外処理の分岐とありますが、具体的にどのようにしたら良いのか教えていただきますと幸いです
nto

2020/10/30 07:06

ちなみにですが拙い解説となってしまいましたが上記で解説したエラーの原因についてはご理解は頂けましておりますでしょうか?
退会済みユーザー

退会済みユーザー

2020/10/30 07:11

はい。例外処理もjavaでも少し習ったので軽く理解しております。
nto

2020/10/30 08:29

例外処理の書き方というよりは、エラーの原因が大きなポイントです。 x > b_widthまたはy > b_height、あるいは両者の状態である場合に baboon_img[x, y]としてもエラーになりますよね? ならば、x > b_widthまたはy > b_heightとなった場合に、質問者様の目的の為に必要な処理を書いていく必要があります。
退会済みユーザー

退会済みユーザー

2020/10/30 11:29

baboon_imgの座標をどうやって元に戻せばいいのでしょうか、、もう少しヒントいただけると助かります泣
nto

2020/10/30 11:46

あまり噛み合っていない様ですが、そもそもbaboon_imgの座標というものは変動していないはずです。 またヒントというか、既に行わなければいけない処理はご回答差し上げているつもりです。 恐らくは未だ「なぜエラーが生じたのか」という点についてご理解頂けていらっしゃらないご様子ですので、そこからご理解を得たい所です。 先程も回答した様に「x > b_widthまたはy > b_height、あるいは両者の状態である場合に baboon_img[x, y]としてもエラーになりますよね?」という所がエラーの原因になっています。 まずは今一度現状のコードがどういった流れで動いているのかを確認してみてください。
退会済みユーザー

退会済みユーザー

2020/10/30 14:48

x > b_widthまたはy > b_height、あるいは両者の状態である場合にbaboon_img[x, y]としてもエラー これはbaboon_imgのBGRの範囲外になったのでエラーという認識で良いのでしょうか?
nto

2020/11/01 03:39 編集

ご返答が遅くなり申し訳ありません。 少し違います。範囲外というのはあっているのですが、厳密にはBGRではなくwidthまたはheightを超えてしまった場合にエラーが生じているのです。 google_imgのwidthは1280、heightは640です。 baboon_imgのwidthは512、heightは512です。 質問のコードの場合、for文にてgoogle_imgのwidthやheightからとったx,yに合わせて処理を行おうとしている為、xやyの値がbaboonの持つ最大値である512を超えた時点でエラーになるのです。 その為、except節でそれ以降の処理をpassする事で画像は1枚だけ表示できるのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問