PythonのOpencvを扱うときの 自分用メモです。
概要などは参考サイトを見てください。
ファイル操作
画像読み込み時
cv2.imreadを使うことで画像を読み込むことができる。
パスに注意。
img = cv2.imread("ファイル名")
Python
import cv2
img = cv2.imread("sample.jpg")
読み込み確認
画像が存在するか確認したいときは、以下のように記述することで確認することができる。
Python
import os
filepath = "sample.jpg"
print("カレントパス", os.getcwd())
print("filepath が指す絶対パス", os.path.abspath(filepath))
print("ファイルが存在するかどうか", os.path.isfile(filepath))
結果
カレントパス /Users/hogehoge/development/imgs
filepath が指す絶対パス /Users/hogehoge/development/imgs/sample.jpeg
ファイルが存在するかどうか True
画像書き込み
cv2.imwriteを使うことで画像を出力できる
cv2.imwrite('ファイル名', 出力するファイル)
Python
import cv2
cv2.imwrite('sample.jpg', img)
画像操作
1920×1080のグレースケール画像を作成
np.zerosで配列の中身を0にする。
sizeが2×2なら、[[0 0][0 0]]のようになる
参考サイト
Python
import cv2
import numpy as np
size=(1920, 1080)
# 配列の中身を0にする。uint8は符号なし8ビットの数値(256通り)
black_img=np.zeros(size, np.uint8)
cv2.imwrite('black.jpg', black_img)
# 白画像はcv2.imwriteの前に「white_img=black_img+255」を追加。
# cv2.imwrite('black.jpg',black_img) -> cv2.imwrite('white.jpg',white_img)に変更
1920×1080のカラー画像を作成
np.zerosで配列の中身を0にする。
sizeが2×2なら、 [[[0 0 0][0 0 0]][[0 0 0][0 0 0]]]のようになる
Python
import cv2
import numpy as np
size=(1920, 1080, 3)
# 配列の中身を0にする。uint8は符号なし8ビットの数値(256通り)
black_img=np.zeros(size, np.uint8)
cv2.imwrite('black.jpg', black_img)
画像の縦と横の長さ(サイズ)を求める。
20×60の画像を読み込んだ場合。
参考サイト
Python
import cv2
import numpy as np
img = cv2.imread(filename, 0)
height, width = img.shape[:2]
print(height) # 20
print(width) # 60
# (縦,横,チャンネル)
print(img.shape) # (20, 60, 3)
# 縦*横*チャンネル
print(img.size) # 3600
RGB値を表示
Python
import cv2
import numpy as np
img = cv2.imread("sample.jpg")
# 色配置の変換 BGR→RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# numpyで扱える配列をつくる
img_array = np.asarray(img)
print(img_array[0, 0, :])
[255 255 255]#R,G,B
生成した画像のBGR→RGB変換する関数
cv2.cvtColorを使ってBGR→RGB変換することができる。
Python
import cv2
# 色配置の変換 BGR→RGB
black_img = cv2.cvtColor(black_img, cv2.COLOR_BGR2RGB)
3次元配列の要素を入れ替えることでも実現できる。
Python
import numpy as np
img_size = (16, 16, 3)
black_img = np.zeros(img_size, np.uint8)
#ここから変換
for i in range(len(black_img)):
for j in range(len(black_img[i])):
print(black_img[i, j])
black_img[i, j, 0], black_img[i, j, 2] = black_img[i, j, 2], black_img[i, j, 0]
このように記述することで[[[128 0 0]][[0 0 128]]]から[[[0 0 128]][[128 0 0]]]のようになる。
その他
16進数カラーコードからRGBに変換
ターミナルに背景色を表示させる
参考サイト
Python
import matplotlib.colors as mcolors
color_rgb = tuple(int(c * 255) for c in mcolors.to_rgb('#aa0000'))
print(color_rgb)
結果
(170, 0, 0)
これをカラー画像に代入することにより色の変更ができる。
Python
color_rgb = tuple(int(c * 255) for c in mcolors.to_rgb('#aa0000'))
sample_img[0, 0] = color_rgb
ANSIエスケープシーケンス
ターミナルに背景色を表示させる
Python
str1 = "\033[48;5;"
# str2の「m \」の空白が1バイトなら1バイト分背景色が変わる。
str2 = "m \033[0m"
text = str1 + str(166) + str2
print(text)