LoginSignup
0
0

More than 3 years have passed since last update.

Python(numpy, cv2) で画像データに対する画素位置操作のメモ

Posted at

背景

  • github などにある他者の python(numpy, cv2)で画像データを処理しているコードが読解できない
  • [...,::-1] とかで記号的なので検索もしづらい :cry:

BGR -> RGB

cv2 だと標準で BGR 画像として処理するようです. 保存や matplotlib で表示時に RGB に並び替える必要あります.

(H, W, C) な配列とします.

[:, :, ::-1] で C 次元(チャンネル)の要素が入れ替わります.

: は slice((start, end, step)) でその次元の全要素を指す (None, None, 1)(?) or (0, n-1, 1) 相当.

::-1 も slice で (0, n-1, -1) で end から start へと逆方向に 1 づつ進む.

RGB(3 要素) の場合は [2, 1, 0] のインデクシングとなる.

したがって BGR -> RGB と並び替えができます.

...

img[...,::-1] なケース.
初見者からすると謎すぎてまったくわかりません.

... は検索性低くてつらいですね.

... = :, : の省略形でした. 各次元で全要素選択という感じでしょうか.

[..., ::-1] = [:, :, ::-1] = [:, :, [2, 1, 0]] という感じです.

特定の channel だけに処理をしたい

たとえば G channel だけ 1 を設定したいなど

img[:, :, 1] = 1

とします.

alpha を RGB にブロードキャストしたい

numpy だけかも.

rgb(3 channels) と alpha(1 channel) の画像があるときに, 単純に rgb * alpha では乗算できません.

alpha の値を RGB にブロードキャスト(複製)する必要があります.

fg * alpha[:, :, None] として, None を指定するとブロードキャストしてくれます. :thinking:

None = np.newaxis として次元を一つ増やす振る舞いになっています(わかりずらい...)

ast(構文木)をきちんと考慮しているようで,

bg * (1 - alpha[:, :, None]) みたいになにか演算してから RGB と乗算もうまく行きます.

画素要素を判定して代入するなど

for i in range(len(pixels)):
   pixels[i] = pixels[i] < 0.5 ? 0 : pixels[i]

みたいな操作をしたい.

pixels[pixels < 0.5] = 0

とすると, 全画素で処理してくれます.

shape(画像サイズやチャネル数)があっていれば, 他の ndarray を使うのも可能です.

e.g.

alpha[trimap_np[:, :, 0] == 1] = 0

alpha 画像で, trimap_np の R channel が 1 の画素位置の値を 0 にする

fg[alpha == 1] = image_np[alpha == 1]

T.B.W.

画像を部分領域(tile)に分割する

slice 記法では, step で 4 ピクセルおきなどは指定できますが, 4 pixel づつというのはできないので, for 文などで slide (start, end, 1) で start, end をそれぞれ指定するか, numpy, cv2 あたりで部分領域に分割する関数を使います.
(ちなみに numpy.tile は画像を tile 状にリピートして並べる関数なので分割には使えない)

その他

視覚的に説明してくれている記事

Numpy’s indexing and slicing notation explained visually
https://medium.com/@buch.willi/numpys-indexing-and-slicing-notation-explained-visually-67dc981c22c1

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0