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

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

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

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

Q&A

解決済

1回答

1632閲覧

画像をRGB表示した転置前、後のnumpy行列に対し、G,B,R成分のみをそれぞれ取り出し、範囲内の数字の個数を取得したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/04/20 04:35

編集2021/04/20 09:15

各行について、その個数の和を求めてlistに格納したいのです。
例えば、250~300の範囲内にある数字が、1行目に10個あれば、10、
2行目に20個あれば、20・・・
(10,20・・・
という風に。

自分が書いたコードは以下です、Google collavoratory使用。

python

1from google.colab import drive 2drive.mount('/content/drive') 3 4import numpy as np 5from PIL import Image 6 7# PILで開いたうえでデータをNumpy形式にする 8# (例えばJPEGは圧縮されていてNumpyな配列になっていないので、 9# そこからNumpyのデータ空間(?)に持ってくる必要がある) 10img = np.asarray(Image.open("drive/My Drive/mnist_dataset/rei.jpg")) 11 12# 元画像のshape (PILではchはRGB) 13# print(img.shape) 14 15# カラー画像の時Gだけ抜き取りたい 16if len(img.shape) == 3: 17 h, w, ch = img.shape 18 19 # RGBのGだけ抜き取りたい 20 img_g = img[:,:,1] 21 img_b = img[:,1,:] 22 img_r = img[1,:,:] 23 24np.set_printoptions(threshold=1000) 25print(img) 26 27v_max, v_min, gimgrows, glenrows, gimgcolumns, glencolumns = 300, 200, [], [], [], [] 28 29for (img, imgt) in zip(img_g, img_g.T): 30 rows = img[(v_min<img)&(v_max>img)] 31 columns = imgt[(v_min<imgt)&(v_max>imgt)] 32 gimgrows.append(rows) 33 glenrows.append(len(rows)) 34 gimgcolumns.append(columns) 35 glencolumns.append(len(columns)) 36 37print(glenrows) 38print(glencolumns) 39 40bimgrows, blenrows, bimgcolumns, blencolumns = [], [], [], [] 41 42for (img, imgt) in zip(img_b, img_b.T): 43 brows = img[(v_min<img)&(v_max>img)] 44 bcolumns = imgt[(v_min<imgt)&(v_max>imgt)] 45 bimgrows.append(brows) 46 blenrows.append(len(brows)) 47 bimgcolumns.append(bcolumns) 48 blencolumns.append(len(bcolumns)) 49 50print(blenrows) 51print(blencolumns) 52 53rimgrows, rlenrows, rimgcolumns, rlencolumns = [], [], [], [] 54 55for (img, imgt) in zip(img_r, img_r.T): 56 rrows = img[(v_min<img)&(v_max>img)] 57 rcolumns = imgt[(v_min<imgt)&(v_max>imgt)] 58 rimgrows.append(rrows) 59 rlenrows.append(len(rrows)) 60 rimgcolumns.append(rcolumns) 61 rlencolumns.append(len(rcolumns)) 62 63print(rlenrows) 64print(rlencolumns)

出力結果は以下です。

Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
[[[243 255 255]
[246 255 255]
[242 255 255]
[232 255 255]
[226 255 255]
[228 255 255]
[211 222 242]
[ 3 0 16]
[ 7 0 12]
[ 6 0 12]
[ 4 0 12]
[ 3 0 9]]

[[139 218 249]
[155 222 241]
[166 216 227]
[174 207 226]
[177 208 239]
[177 214 241]
[155 193 204]
[ 0 7 2]
[ 4 0 0]
[ 11 0 0]
[ 7 0 0]
[ 1 1 0]]

[[ 0 158 236]
[ 42 147 195]
[ 91 101 128]
[132 82 111]
[135 78 123]
[118 87 128]
[109 91 107]
[206 166 158]
[252 179 164]
[255 174 162]
[255 177 165]
[249 180 165]]

[[ 0 182 255]
[ 65 147 221]
[163 49 82]
[240 27 47]
[226 22 55]
[201 34 77]
[205 37 73]
[219 21 44]
[230 14 27]
[229 15 27]
[223 16 32]
[223 16 34]]

[[ 0 176 255]
[ 87 141 213]
[219 30 58]
[255 13 5]
[255 15 19]
[253 19 44]
[255 12 44]
[255 12 35]
[255 13 32]
[255 12 37]
[255 11 41]
[255 11 41]]

[[ 0 173 242]
[ 83 142 186]
[158 37 54]
[216 20 21]
[196 21 18]
[179 38 29]
[187 46 28]
[200 46 22]
[196 43 25]
[191 44 37]
[194 42 39]
[199 41 32]]

[[161 255 255]
[187 235 245]
[233 218 225]
[248 196 208]
[253 211 213]
[202 206 171]
[ 79 128 49]
[ 80 146 49]
[ 86 141 58]
[ 95 134 71]
[100 131 72]
[ 98 134 64]]

[[255 228 220]
[255 241 235]
[255 236 243]
[255 239 255]
[255 232 239]
[212 236 200]
[ 54 159 74]
[ 15 171 61]
[ 19 169 69]
[ 33 160 79]
[ 37 158 81]
[ 30 162 76]]

[[203 19 9]
[191 17 16]
[197 23 33]
[202 24 38]
[160 2 3]
[146 53 35]
[125 120 80]
[182 242 190]
[158 238 185]
[159 237 189]
[159 236 192]
[156 237 194]]

[[255 24 24]
[255 18 29]
[255 11 23]
[255 17 17]
[255 16 9]
[233 29 28]
[209 75 84]
[255 234 246]
[255 248 250]
[254 255 249]
[251 255 252]
[255 253 255]]

[[244 25 29]
[247 22 38]
[253 16 36]
[255 14 22]
[255 22 19]
[232 19 25]
[217 63 87]
[255 225 253]
[255 243 255]
[255 251 255]
[255 252 255]
[255 249 255]]]
[7, 6, 0, 0, 0, 0, 5, 6, 5, 5, 5]
[4, 4, 4, 3, 4, 4, 1, 3, 3, 3, 3]
[3, 2, 0]
[4, 4, 6]
[2, 2, 2]
[0, 6, 7]

使用画像は以下です。
イメージ説明

Gに関しては、転置前、転置後ともに問題なく動いており、Gと同じようなことをB,Rにも行いたいのですが、できていません。

Bなんですが、
[3, 2, 0]
[4, 4, 6]
なわけがなく、その後のRも
[2, 2, 2]
[0, 6, 7]
なわけがないです。
まずなぜ3成分なのか?個数は0なら「0」と表示されるはずです、
そもそも、どちらも、どの行も範囲内の数値は平均して5個ぐらいあるはずです。
以前、変数を使いまわしていたミスがあったのですが、それでしょうか?
どこがおかしいのか説明お願いします。

ちなみに、

python

1 # RGBのGだけ抜き取りたい 2 img_b = img[:,:,1] 3 img_g = img[:,1,:] 4 img_r = img[1,:,:]

とすると、
[3, 2, 0]
[4, 4, 6]
[7, 6, 0, 0, 0, 0, 5, 6, 5, 5, 5]
[4, 4, 4, 3, 4, 4, 1, 3, 3, 3, 3]
[2, 2, 2]
[0, 6, 7]
となるので、Gに関しては正しく出力されているようです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因は、numpyのndarrayの転置の仕様を誤解していることです。

python

1>>> img.shape 2(11, 12, 3) 3>>> img.T.shape 4(3, 12, 11)

というようにshapeを逆順にするのが転置の仕様です。
これを、(12,11,3)だと誤解しているのでこのような結果になります。

投稿2021/04/20 08:40

ppaul

総合スコア24668

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

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

退会済みユーザー

退会済みユーザー

2021/04/20 08:58

でも、最初のGについては、予想通りの結果が出ているのですが。 ベクトルの転置はそうなるんですか?知らなかったですが、 今行列の転置なので、高校数学で習うやつと一緒ですよね?
退会済みユーザー

退会済みユーザー

2021/04/20 09:40

解決しました・・・。 1の位置を変えるんじゃなくて、 1を、Rなら0に、Bなら2にするんですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問