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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

NumPy

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

OpenCV

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

Python 3.x

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

Python

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

Q&A

解決済

1回答

2007閲覧

分割した画像を結合したい

JamesJohn

総合スコア4

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

NumPy

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

OpenCV

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2020/10/17 05:19

編集2020/12/09 00:35

前提・実現したいこと

pythonである画像を分割し,画像ごとのHSV値の大小に条件を設けることでそれぞれの画像の色を変えました.
今は9分割しており,色変更後の9枚の画像を結合,1枚の画像にしたいです.
どなたかご教示お願い致します.

発生している問題・エラーメッセージ

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-16-dcc3b2ab874e> in <module> 96 d.append(pic_show(x) for x in sub_imgs) 97 img_x = np.vstack((np.hstack(d[0:3]), ---> 98 np.hstack(d[3:6]), 99 np.hstack(d[6:9]) 100 )) <__array_function__ internals> in hstack(*args, **kwargs) ~\anaconda3\lib\site-packages\numpy\core\shape_base.py in hstack(tup) 343 return _nx.concatenate(arrs, 0) 344 else: --> 345 return _nx.concatenate(arrs, 1) 346 347 <__array_function__ internals> in concatenate(*args, **kwargs) ValueError: need at least one array to concatenate

該当のソースコード

python

1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4 5def split_imgs(img, hsplits=3, vsplits=3): #画像分割 6 h, w = img.shape[:2] 7 crop_img = img[: h // vsplits * vsplits, : w // hsplits * hsplits] 8 9 return np.array( 10 [x for h_img in np.vsplit(crop_img, vsplits) for x in np.hsplit(h_img, hsplits)] 11 ) 12 13def pic_show(img): #分割画像を色変更し表示する 14 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 15 # チャンネルごとに分解 16 h, s, v = cv2.split(hsv) 17 mean1 = h.mean() 18 mean2 = s.mean() 19 mean3 = v.mean() 20 21 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 22 img_array = np.asarray(img) 23 24 if 95 < mean1 < 100: 25 img_array[:,:, (1)]=50 26 elif 100 < mean1 < 105: 27 img_array[:,:, (1)]=100 28 elif 105 < mean1 < 110: 29 img_array[:,:, (1)]=150 30 elif 110 < mean1 < 115: 31 img_array[:,:, (1)]=200 32 elif 115 < mean1 < 120: 33 img_array[:,:, (1)]=250 34 35 plt.imshow(img_array) 36 plt.show() 37 38# 画像を読み込む。 39hsplits = 3 # 横方向の分割数 40vsplits = 3 # 縦方向の分割数 41img = cv2.imread("test.jpg") 42 43# 画像を分割する。 44sub_imgs = split_imgs(img, hsplits, vsplits) 45print(sub_imgs.shape) 46 47d = [] 48d.append(pic_show(x) for x in sub_imgs) 49img_x = np.vstack((np.hstack(d[0:3]), 50 np.hstack(d[3:6]), 51 np.hstack(d[6:9]) 52 )) 53 54cv.imshow(img_x)

試したこと

空のリストを準備して,その中にそれぞれの画像のnp.asarrayを縦横で大きさを指定しながら追加していくことで,
元の画像のように結合できるのでは,と思ったのですが思うように出来ませんでした

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

python 3.7.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

d = []

d.append(pic_show(x) for x in sub_imgs)

ここがうまくリストに追加出来ておりません。
この場合、appendするのではなく直接内包表記自体をリストとして定義しましょう。

python

1d = [pic_show(x) for x in sub_imgs]

しかしこれではpic_show関数を実行しても戻り値が何もない為戻り値も設定します。

python

1def pic_show(img): #分割画像を色変更し表示する 2 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 3 # チャンネルごとに分解 4 h, s, v = cv2.split(hsv) 5 mean1 = h.mean() 6 mean2 = s.mean() 7 mean3 = v.mean() 8 9 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 10 img_array = np.asarray(img) 11 12 if 95 < mean1 < 100: 13 img_array[:,:, (1)]=50 14 elif 100 < mean1 < 105: 15 img_array[:,:, (1)]=100 16 elif 105 < mean1 < 110: 17 img_array[:,:, (1)]=150 18 elif 110 < mean1 < 115: 19 img_array[:,:, (1)]=200 20 elif 115 < mean1 < 120: 21 img_array[:,:, (1)]=250 22 23 #plt.imshow(img_array) 24 #plt.show() 25 return img_array

cv.imshow(img_x)

最終行のこちらも色々と惜しいです。cv2としたかったのでしょうか。
いずれも間違いで正しくはpltでしょう。

python

1plt.imshow(img_x) 2plt.show()

投稿2020/10/17 08:57

nto

総合スコア1438

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

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

JamesJohn

2020/10/17 12:38 編集

ご回答ありがとうございます。 なるほどです,apeend内で繰り返す場合は直接リストとして定義するといいのですね。 また本題と関係なく[None None...None]と表示されており戻り値としてどうすればいいか悩んでおりましたが,それにもお答えいただきありがとうございます。 無事実行・表示させることができました,本当にありがとうございます。 非常に助かりました。
nto

2020/10/19 11:57 編集

内包表記で生成したものはジェネレータとして生成されます。 それらを[]または()で囲ってあげる事でとリストやタプルにする事が出来ます。 今回の場合append内でジェネレータを生成し、そのジェネレータをリスト内に追加するというコードになってしまっておりいわば二次元リストの様な状態になってしまっています。 その為リスト内の要素数は1、その後の処理でエラーが生じてしまいます。 せっかく内包表記での書き方が出来ているので、それを直接[]で囲って変数に代入してあげる事で、正常なリストを作成する事ができるのです。 ちょっと説明下手でごめんなさい。
JamesJohn

2020/10/19 11:54

なるほど、改めて説明して頂いて非常によくわかりました。 本当にありがとうございます。大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問