【opencv RGBとBGRの超分かりやすい解説】RGBモードとBGRモードの違いと相互変換方法は?

1. BGR と RGB の 2 つのチャネルがあるのはなぜですか?

まず、RGBもBGRも本質的な違いはなく、画像を読み込むためのOpenCVとPILのフォーマットはそれぞれBGRとRGBです。

OpenCV を使用して画像を読み取ると、読み取られた配列が実際にはBGR形式であり、最もよく使用されるRGB形式ではないこともわかるはずですでは、RGB チャネルの代わりに BGR チャネルを使用して画像を記述するのはなぜでしょうか?

OpenCVのデフォルトチャネルはBGR です。これは、ハードウェア レベルに基づいている場合があります。ライブラリの最も初期の最も人気のあるバッチの代表である caffe は opencv を使用し、opencv のデフォルト チャネルは bgr であるためです。これはopencvの入り口の1つです.bgrは歴史的な問題です.初期のいくつかのハードウェアと互換性を保つために,opencvは元に戻すのは簡単ではありません. 実際、rgb は自分自身のトレーニングに使用できます。新しいライブラリは基本的に bgr や rgb の問題はなく、順序を入れ替えるだけです。ただし、古いトレーニング済みモデルを使用する場合は、古いモデルの bgr と互換性がなければなりません。

【公式サイトでの詳しい説明】 RGBはバイトオーダーです。しかし、ほとんどのバニラ グラフィックス ライブラリの意図的な実装の選択は、色を 3 つ (または 4 つ、多くの場合、アルファを含む) のコンポーネントが整数にパックされた符号なし 32 ビット整数として内部的に扱うことです。リトルエンディアン マシン (x86 など) では、整数 0x01020304 は実際には 0x04030201 としてメモリに格納されます。したがって、0x00BBGGRR は 0xRRGGBB00 として格納されます。したがって、BGR (および BGRA など) という用語は、色コンポーネントに直接アクセスするコードを読みやすくするために、グラフィックス ライブラリが整数の論理的な順序付けを解釈する漏れやすい抽象化です。通常、ビットマップはプロセッサよりもハードウェアの多くの部分からアクセスされ、従来のディスプレイ アダプタで指定されたエンディアンは必ずしも CPU のエンディアンと同じではないことに注意してください。ピクセル内のチャネルを操作するレベルでは、CPU はフィールドの順序に関係なくフィールドを抽出できます。これは、純粋にプログラマがラベルを理解するかどうかの問題です。

2. 簡単な検証例

次の画像をそれぞれ OpenCV と PIL で読み取って表示し、結果を比較してみましょう。

cv2

import cv2
img_path = 'dataset1/train/ants_img/0013035.jpg'
img = cv2.imread(img_path)
print(img)

ピル

from PIL import Image
img_path = 'dataset1/train/ants_img/0013035.jpg'
img = Image.open(img_path)
img_arr = np.array(img)
print(img_arr)

結果は次のとおりです。

                                          

簡単に言えば、最初の[]から分析すると、cv2 [233 151 80]と PIL [80 151 233]がそれぞれ GBR と RGB に対応していることがわかります。

2 つのカラー チャネルが異なるため、下の図に示すように、同じ画像に表示される結果も異なるはずです。

               

3. RGB を BGR に変換する方法

[:,:,:::-1] を実行すると、配列が左右に回転し、相互変換の効果が得られるので、cv2 で読み取った画像で実験します。具体的なコードは次のとおりです。 :

img_path = 'dataset1/train/ants_img/0013035.jpg'
img = cv2.imread(img_path)
img = img[:, :, ::-1]#BGR转为RGB
print(img)
plt.imshow(img)
plt.show()

 結果は次のとおりです。

 

 最終的に、img[:, :, ::-1] を介して BGR から RGB への変換を実現したことがわかりました。

 4.メモまとめ

以下は、他の人を参照することのより良い要約です。元のリンクは以下にあります

1.
img = Image.open(ImgPath) で開く画像は PIL タイプで、デフォルトは RGB です。
PIL 型を numpy 型に変換します: im = numpy.array(img) は、
(高さ、幅、チャネル) の配列である形状属性を表示し、チャネルのチャネル データは RGB です。


2. cv2.imread(パス, 読み取り方法):
パス: 画像のパス;
読み取り方法: cv2.IMREAD_COLOR: カラー画像を読み取る; cv2.IMREAD_GRAYSCALE: グレースケール モードで画像を読み取る; cv2.IMREAD_UNCHANGED: 画像を読み込む、そのアルファ チャネルを含みます。
デフォルトは cv2.IMREAD_COLOR です。
返り値は(高さ、幅、チャンネル)の配列で、チャンネルの順番はBGR順


3. 2 つの
PIL イメージ間の OpenCV 形式への相互変換:
img = Image.open()
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
OpenCV から PIL イメージ形式へ:
img = cv2 .imread()
img2 = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.imshow() および cv2.imshow()


4. この表示は読みとは逆です。つまり、通常の RGB 形式を視覚化する場合、plt.imshow() の画像は RGB 形式で、cv2.imshow() の画像はbgr形式の画像で。普段はほとんど cv2.imshow() を使っていないので plt.imshow() について詳しく述べます。plt.imshow() では、受け入れられるイメージ タイプは、np.ndarray、テンソル、PIL イメージのいずれのタイプでもかまいません。
 

 


  参考URL:

[PyTorch] 画像解析: RGB と BGR の変換 - ほとんど知っている

[openCV の BGR と RGB] img[:,:,::-1] と img[:, :, (2, 1, 0)] は画像を操作します

おすすめ

転載: blog.csdn.net/weixin_52527544/article/details/128008221