MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/
はじめに
の
MATLAB,Python,Scilab,Julia比較 第3章 その12【グレースケール④】
を書き直したもの。
グレースケール化処理を各ツール、各言語で実施。
今回はPython(NumPy)で実施する。
使用する画像
まずは、使用する画像を再掲。
ファイル名はdog.jpgとする。
今回は、Python(NumPy)によるグレースケール化の実施
Pythonコード
Pythonコードは以下になる。
import numpy as np
import cv2
# 入力画像の読み込み
img = cv2.imread("dog.jpg")
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
# RGB平均グレースケール
gray_ave = np.array(r/3 + g/3 + b/3, dtype='uint8')
# グレースケール画像の書き込み
cv2.imwrite("dog_gray_ave.jpg", gray_ave)
# SDTVグレースケール
gray_sdtv = np.array(0.2990 * r + 0.5870 * g + 0.1140 * b, dtype='uint8')
# グレースケール画像の書き込み
cv2.imwrite("dog_gray_sdtv.jpg", gray_sdtv)
gray_cv = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite("dog_gray_ocv.jpg", gray_cv)
処理結果
そして処理結果。
dog_gray_ave.jpg(RBG平均)
dog_gray_sdtv.jpg(SDTV)
dog_gray_ocv.jpg(OpenCV)
考察
Pythonでは、3つのグレースケールを出力してみた。
最後のはOpenCVによるグレースケール化。
OpenCVのグレースケールはSDTVらしいが、完全一致という感じではなかった。
これはOpenCVのドキュメントにそれらしいことが書いてあった。
When using IMREAD_GRAYSCALE, the codec’s internal grayscale conversion will be used, if available. Results may differ to the output of cvtColor()
https://docs.opencv.org/4.7.0/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56
↓日本語訳
IMREAD_GRAYSCALE を使用する場合、コーデック内部のグレースケールコンバージョンが使用されます(使用可能な場合)。結果は、cvtColor()の出力と異なる場合があります。
https://docs.opencv.org/4.7.0/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56
ここはあまり踏み込まず、こういう情報があるって程度で留めておいた方が良いだろう。
あとは、np.arrayで画像データを定義する際にdtype=’uint8’を指定しているのは1チャンネル1ピクセル辺りのデータ長が8bitなため。
まとめ
- Python(NumPy)でRGB平均とSDTVのグレースケール化実施。
- 次いでにOpenCVによるグレースケール化も。
- OpenCVによるグレースケール化はコーデック依存な面がある。
- 画像データはの1チャンネル1ピクセルは8bit長。
MATLAB、Python、Scilab、Julia比較ページはこちら
コメント