ITいろいろ

プログラミングやクラウド、データ解析など、ITにかかわることをいろいろと書いています。

画像の配列をいじって色調を変える

OpenCVcv2.imreadで画像を取り込むと、画像1ピクセルごとの色情報が配列で読み取られます。

今回はそれを活用して、色調を変えてみます。

画像の配列について

まずOpenCVで読み取った画像をそのまま出力してみます。

# インポート
import cv2

# 画像ファイルの読み込み
img = cv2.imread("Lenna.jpg")

# 表示
img

すると以下のように3次元の配列で表示されます。

少しわかりずらいので、縦2ピクセル、横3ピクセルの画像で説明すると、こんな配列になります。

[
    [
        [青, 緑, 赤], [青, 緑, 赤], [青, 緑, 赤]
    ],
    [
        [青, 緑, 赤], [青, 緑, 赤], [青, 緑, 赤]
    ]
]

今までも何度か出てきていますが、OpenCVBGRの順番です。間違えやすいので注意。

赤要素をなくす(0にする)

コード紹介

# インポート
import cv2
import matplotlib.pyplot as plt

# 画像ファイルの読み込み
img = cv2.imread("Lenna.jpg")

# サイズを取得
height,width,color = img.shape

# 赤要素を0にする
img[:, :, 2] = 0

# 配列を表示
print(img)
# 画像を出力
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

出力結果

少し解説

img[:, :, 2] = 0で、3次元目の要素2をすべて0にするということになります。 0→青、1→緑、2→赤なので、赤要素を0にするということですね。 1次元目と2次元目の「 : 」は、すべて、という意味になります。

応用

縦0~100ピクセルだけ変える

img[0:100, :, 2] = 0

縦0~100ピクセル、横100~300ピクセルだけ変える

img[0:100, 100:300, 2] = 0

青(0)と赤(2)両方0にする(つまり緑要素だけを取り出す)

img[0:100, 100:300, (0, 2)] = 0