web-dev-qa-db-ja.com

cv2.imwrite()が写真の色を変更する理由

私は次のコードを持っています:

imgs = glob.glob('/home/chipin/heart/tray.png')
current_img = io.imread(imgs[0])
cv2.imwrite('/home/chipin/heart/01.png', current_img[0:511,0:511])  

画像のサイズは512 * 512です。保存すると、青い画像が黄色に変わります。チャンネルは放棄されているようです。理由は本当にわかりません。

Current_imgの値は次のとおりです。

value of current_img

19
StalkerMuse

あなたの問題は、 skimage.io.imread はイメージをRGB(またはRGBA)としてロードしますが、OpenCVはイメージを BGRまたはBGRA (BGRはデフォルトのOpenCVカラー形式)と想定します。これは、青と赤の面が反転することを意味します。


3チャンネル画像

次の簡単なテストイメージでこれを試してみましょう。

Input image


最初に元のアルゴリズムを試してみましょう:

import skimage.io
import cv2

img = skimage.io.imread('sample.png')
cv2.imwrite('sample_out_1.png', img)

次の結果が得られます。

Result 1

ご覧のとおり、赤と青のチャンネルは目に見えて交換されています。


Skimageを使用して読み取り、cv2を使用して書き込みを行うことを前提とする最初のアプローチは、 cv2.cvtColor RGBからBGRに変換します。

新しいOpenCVドキュメントではPython構文に言及していないため、この場合は 2.4.xの適切な参照 も使用できます。

import skimage.io
import cv2

img = skimage.io.imread('sample.png')
cv2.imwrite('sample_out_2.png', cv2.cvtColor(img, cv2.COLOR_RGB2BGR))    

これで、次の出力が得られます。

Result 2


別の方法は、OpenCVを使用することです- cv2.imread 画像をロードします。この場合、BGRイメージのみで作業しています。

NB:フラグを指定しないということは、cv2.IMREAD_COLORがデフォルトで使用されます。つまり、画像は常に3チャンネル画像としてロードされます(潜在的なアルファチャンネルをドロップします)。

import cv2

img = cv2.imread('sample.png')
cv2.imwrite('sample_out_3.png', img)

Result 3


4チャンネル画像

スクリーンショットから、4チャンネルの画像があるようです。これは、skimageではRGBA、OpenCVではBGRAを意味します。原則は似ています。

  • 色変換コードを使用するcv2.COLOR_RGBA2BGRA
  • またはcv2.imreadフラグ付きcv2.IMREAD_UNCHANGED
47
Dan Mašek