私は次のコードを持っています:
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の値は次のとおりです。
あなたの問題は、 skimage.io.imread
はイメージをRGB(またはRGBA)としてロードしますが、OpenCVはイメージを BGRまたはBGRA (BGRはデフォルトのOpenCVカラー形式)と想定します。これは、青と赤の面が反転することを意味します。
次の簡単なテストイメージでこれを試してみましょう。
最初に元のアルゴリズムを試してみましょう:
import skimage.io
import cv2
img = skimage.io.imread('sample.png')
cv2.imwrite('sample_out_1.png', img)
次の結果が得られます。
ご覧のとおり、赤と青のチャンネルは目に見えて交換されています。
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))
これで、次の出力が得られます。
別の方法は、OpenCVを使用することです- cv2.imread
画像をロードします。この場合、BGRイメージのみで作業しています。
NB:フラグを指定しないということは、cv2.IMREAD_COLOR
がデフォルトで使用されます。つまり、画像は常に3チャンネル画像としてロードされます(潜在的なアルファチャンネルをドロップします)。
import cv2
img = cv2.imread('sample.png')
cv2.imwrite('sample_out_3.png', img)
スクリーンショットから、4チャンネルの画像があるようです。これは、skimageではRGBA、OpenCVではBGRAを意味します。原則は似ています。
cv2.COLOR_RGBA2BGRA
cv2.imread
フラグ付きcv2.IMREAD_UNCHANGED