前提
Python3系でopenCVを使ってます。適当な画像をグレースケールに変換する際には、
python
1import cv2 2image = cv2.imread("lena.jpg") 3gly_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
などとすると思います。ここでは、カレントディレクトリにlena画像lena.jpgがあるとしてソースコードを書きました。ここでimageは各ピクセルに(R,G,B)を含むテンソルになっているはずで、実際に
python
1print(image)
とすると、
[[[ 74 111 195]
[ 73 110 194]
[ 75 111 195]
...
[ 30 32 72]
[ 33 34 68]
[ 34 35 63]]
[[ 71 108 192]
[ 72 109 193]
[ 76 112 196]
...
[ 27 28 66]
[ 29 31 62]
[ 30 31 57]]
[[ 73 110 194]
[ 74 110 194]
[ 76 112 196]
...
[ 24 27 58]
[ 29 30 56]
[ 30 31 52]]
...
[[ 50 59 102]
[ 43 54 98]
[ 52 64 112]
...
[ 64 66 100]
[ 57 59 93]
[ 53 54 88]]
[[ 60 69 112]
[ 53 64 108]
[ 48 59 109]
...
[ 62 64 98]
[ 58 61 92]
[ 56 58 89]]
[[ 66 75 118]
[ 60 70 117]
[ 49 60 110]
...
[ 60 63 94]
[ 59 61 92]
[ 60 62 93]]]
というテンソル表現を得ることができます。一方で、gly_imageは各ピクセルに一つの値が割り当てられる行列になっているはずで、実際に
python
1print(gly_image)
とすると、次のような行列表現が得られます。
[[132 131 132 ... 44 44 43]
[129 130 133 ... 39 40 39]
[131 131 133 ... 36 38 37]
...
[ 71 66 77 ... 76 69 64]
[ 81 76 73 ... 74 70 67]
[ 87 83 74 ... 72 70 71]]
疑問
このグレースケールへの変換で何が行われているのでしょうか。OpenCVの公式ページを見ると、グレースケール変換の際には、(R,G,B)は
Y=0.299⋅R+0.587⋅G+0.114⋅B
と変換されるはずです。しかし、うえのlena画像のグレースケール変換前のテンソルとグレースケール変換後の配列の中身を比べると、例えば、1行1列目を見れば、[ 74 111 195]が132になっています。上の公式にあてはめると、
Y=0.29974+0.587111+0.114*195=109.513
なので、132になるのはおかしいのです。
つまり、一見すると、OpenCVの公式ページとは異なる変換が行われているように思えるのですが、これはどういうことでしょうか。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/14 11:06
2018/05/14 11:09
2018/05/14 11:27