Pythonの学習の過程とか

学習の記録をつけておきましょう。Python3に少しずつ移行していきます。過去の記事のソースを2から3に、、、と考えましたが、新しいことをやったほうがいいですね。

Python OpenCVの基礎 画素へのアクセス

Numpyによる画素へのアクセス

画像を読み込むことは前回まででOKですね。

それでは今回もこちらを参考にしながら勉強してまいります

OpenCV: Basic Operations on Images

画像を読み込んで、任意の画素の値をみてみよう

前回の記事でやったように、画像を読み込みます

peaceandhilightandpython.hatenablog.com

画素へのアクセスは単に座標を指定するだけです

pixelValue = img[Y座標, X座標]

画素へのアクセス

#coding: utf-8

import cv2
import numpy as np

# readImage
img = cv2.imread('sample.jpg')

pixelValue = img[10, 20]
print 'pixelValue = ' + str(pixelValue)

画像を読み込んで、y座標10, x座標20の画素のBGR値を取得します。

RGBではなくBGRであるところに注意ですね!

結果

pixelValue = [172 209 235]

  • B:172
  • G:209
  • R:235

という結果になりました。簡単ですね。

ここで疑問なのは、img[y,x]が返したpixelValueの型は何なのかということですね。 というかそもそもimgは?

試しにtype()で見てみましょう。

imgやpixelValueの型は何でしょう?

print type(img)
print type(pixelValue)

結果

type 'numpy.ndarray'

type 'numpy.ndarray'

numpy.ndarrayということでした。ndarrayはnampyの基本的な配列の事になります。 詳しくは以下を参照されたし。

https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

画素を色ごとに取得する

pixelValue = img[Y座標, X座標, 色]

色は0:B 1:G: 2:R

blue = img[10, 20, 0]
green = img[10, 20, 1]
red = img[10, 20, 2]

print 'blue = ' + str(blue)
print 'green = ' + str(green)
print 'red = ' + str(red)

print type(blue)

BGRを一括で取得していた時にはimg[y, x]でしたが、色を指定することで、色ごとの画素値を取得することができました。

blue = 172

green = 209

red = 235

type 'numpy.uint8'

一括取得のときと同じ結果です。

このとき、numpy.ndarrayからnumpy.uint8になっているようですね。

Numpyのメソッドを使って画素を取得する

これまでにimg[y, x]はいいのですが、やっぱり遅いみたいです。Speedを測っていないのですが、画像内の特定の画素値を検索していくような処理を入れたらかなりイライラするかも?

そこでNumpyのメソッドを使っていきます。こんな感じで使えるみたいです。

blue = img.item(10, 20, 0)
green = img.item(10, 20, 1)
red = img.item(10, 20, 2)

print 'blue = ' + str(blue)
print 'green = ' + str(green)
print 'red = ' + str(red)

print type(blue)

結果

blue = 172

green = 209

red = 235

tupe 'int'

同じ結果を得ることができました。良かったですね。しかし、型はintになっています。このあたりは間違えやすいかもしれないですね。要注意です。

画素の書き換え

画素単位で値を書き換えたい場合はどうしましょう?これもアクセスの延長のような感じでできます。しかし、ちょっぴり時間がかかるかもしれないですね。

配列による書き換え

色ごとの書き換え

img[10, 20, 0] = 255
img[10, 20, 1] = 255
img[10, 20, 2] = 255

画素の一括書き換え

img[10, 20] = [255, 255, 255]

メソッドによる書き換え

ここでもNumpyのメソッドを使うことができます。

色ごとの書き換え

img.itemset(10, 20, 0), 255)

これで同じ結果を得ることができます。一括書き換えの方法が、、、、ちょっと分かりませんでした、すみません。

今回のコードはコチラ

OpenCV and Numpy ImageRead

今回はこれまで!

詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識

詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識