web-dev-qa-db-ja.com

ロード時にカラー画像に間違った色を与えるOpenCV

私はPython OpenCVでカラー画像を読み込んで、それをプロットしています。しかし、私が得る画像は、色がすべて混ざっています。

コードは次のとおりです。

import cv2
import numpy as np
from numpy import array, arange, uint8 
from matplotlib import pyplot as plt


img = cv2.imread('lena_caption.png', cv2.IMREAD_COLOR)
bw_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

images = []
images.append(img)
images.append(bw_img)

titles = ['Original Image','BW Image']

for i in xrange(len(images)):
    plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

plt.show()

元の画像は次のとおりです。 enter image description here

そして、ここにプロットされた画像があります: enter image description here

48
bholagabbar

OpenCVは画像のデフォルトの色順としてBGRを使用し、matplotlibはRGBを使用します。 matplotlibにOpenCvでロードされた画像を表示すると、チャンネルは前から後ろになります。

これを修正する最も簡単な方法は、グレースケール画像を作成するときと同じように、OpenCVを使用して明示的にRGBに戻すことです。

RGB_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

そして、それをプロットで使用します。

98
TobyD

前の答えの代替として、使用することができます(わずかに高速)

img = cv2.imread('lena_caption.png')[...,::-1]

%timeit [cv2.cvtColor(cv2.imread(f), cv2.COLOR_BGR2RGB) for f in files]
ループあたり231 ms±3.08 ms (7回の実行の平均±標準偏差、それぞれ1ループ)

%timeit [cv2.imread(f)[...,::-1] for f in files]
ループあたり220 ms±1.81 ms (7回の実行の平均±標準偏差、それぞれ1ループ)

10
OKK