質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • Python

    6911questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • OpenCV

    971questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

openCVにおいてグレースケールに変換する際に何が起きているのか。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 216

physics303

score 28

 前提

Python3系でopenCVを使ってます。適当な画像をグレースケールに変換する際には、

import cv2
image = cv2.imread("lena.jpg")
gly_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)


などとすると思います。ここでは、カレントディレクトリにlena画像lena.jpgがあるとしてソースコードを書きました。ここでimageは各ピクセルに(R,G,B)を含むテンソルになっているはずで、実際に

print(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は各ピクセルに一つの値が割り当てられる行列になっているはずで、実際に

print(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.299*74+0.587*111+0.114*195=109.513

なので、132になるのはおかしいのです。
つまり、一見すると、OpenCVの公式ページとは異なる変換が行われているように思えるのですが、これはどういうことでしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

BGRなので

b, g, r = 74, 111, 195
y = 0.299 * r + 0.587 * g + 0.114 * b
print(y)  # 131.898


と考えると辻褄が合うように思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/14 20:06

    ものすごい恥ずかしいのですが、カラー画像で各ピクセルに割り当てられる数字は(R,G,B)ではなく(B,G,R)なのでしょうか?

    キャンセル

  • 2018/05/14 20:09

    COLOR_BGR2GRAY
    というフラグはもし順番がR,G,Bになっているのであれば
    COLOR_RGB2GRAY
    という名前にしただろうと思います。つまりそういうことではないでしょうか。
    レナの画像だとわかりにくいですが、真っ赤、真っ青などの単純画像を読み込ませると納得できると思います。多分!

    キャンセル

  • 2018/05/14 20:27

    ありがとうございますorz..

    キャンセル

+1

Pythonはわからないけども、RGBじゃなくBGRだから、
Y=0.299*195+0.587*111+0.114*74=131.898
な、だけじゃないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/14 20:06

    ものすごい恥ずかしいのですが、カラー画像で各ピクセルに割り当てられる数字は(R,G,B)ではなく(B,G,R)なのでしょうか?

    キャンセル

  • 2018/05/14 20:39

    Jpegの様な圧縮ファイルだとわかり辛いですが、
    非圧縮なBitmapだと、基本的にB,G,Rの順番で格納されます。
    ペイント等で24bitBitmapに変換して、バイナリエディタで画像領域を見ると、
    よくわかります。

    キャンセル

  • 2018/05/18 20:19 編集

    FIY: BGR順を用いるのはWindowsとOpenCVの歴史的な事情ですね。他システムでは素直なRGBも見受けられます。

    https://www.learnopencv.com/why-does-opencv-use-bgr-color-format/

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    PythonのOpenCVでアフィン変換

    前提・実現したいこと 元の画像を回転させた画像を得たい。 得られた画像は、回転させた画像がちょうど収まるサイズで、余白は黒で埋める。 発生している問題・エラーメッセージ

  • 解決済

    ファルダ内の画像を読み込むときNoneが返ってくる問題について

    opencvでファルダ内の画像を読み込もうとしたら、Noneが返ってくるのですが、なぜなのでしょうか? ちなみに、ファルダのパスは間違っていません。 for i in os

  • 受付中

    pythonでopencvからの画像連結

    いまpythonでopencvを使用して複数枚の画像を連結させたいと考えています。 from PIL import Image _bg = Image.new("RGB",

  • 解決済

    PythonとOpenCVを用いて物体を白色で抽出したい

    前提・実現したいこと 最近、趣味でプログラミングを始めました。 PythonとOpenCVを用いて何も映っていない背景と物体を映した前景で差分をとり、物体だけを白色で抽出したいです

  • 解決済

    ヒストグラムでの画像比較

    前提・実現したいこと ヒストグラムによる画像処理をしたいです。 発生している問題・エラーメッセージ いくつかの画像で試したのですが、出力されるdの値が1.0のまま動きません

  • 解決済

    ラベリングごとに画像を保存

    現在、機械学習用のデータセットを作成しております。それで、白背景を透過処理し、ラベリングしやすい形に現在は処理済みです。 ここから、画像をラベリング処理し、ラベルごとに画像を抽

  • 受付中

    カメラで撮影した画像を連番ファイルで保存したい

    キーを押すごとに撮影した画像をsampleフォルダに連番ファイルとして保存したいと思っています こちらを参考にしました http://naga-tsuzuki.sblo.jp/ar

  • 解決済

    ハフ変換の直線検出がうまくいきません

    ハフ変換による直線検出を勉強しています。 ここのサイトを参考に、同じ画像で同じコードを使ってもサイトのような直線検出を表示できませんでした。 どのようにすれば検出できるのでしょ

同じタグがついた質問を見る

  • Python

    6911questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • OpenCV

    971questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。