61

画像があり、そこから領域を抽出したいと考えています。この領域の左上隅と右下隅の座標があります。グレースケールでは、次のようにします。

I = cv2.imread("lena.png")
I = cv2.cvtColor(I, cv2.COLOR_RGB2GRAY)
region = I[248:280,245:288]
tools.show_1_image_pylab(region)

カラーでのやり方がわかりません。R、G、Bの各チャンネルを抽出することを考えました。各チャネルからこの領域をスライスし、それらをマージして戻しますが、もっと短い方法が必要です。

4

3 に答える 3

147

OpenCV と Matplotlib では、ピクセルの順序にわずかな違いがあります。

OpenCV は BGR の順序に従いますが、matplotlib は RGB の順序に従う可能性があります。

そのため、pylab 関数を使用して OpenCV に読み込まれた画像を表示する場合、RGB モードに変換する必要がある場合があります。(簡単な方法があるかどうかはわかりません)。以下のメソッドはそれを示しています:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('messi4.jpg')
b,g,r = cv2.split(img)
img2 = cv2.merge([r,g,b])
plt.subplot(121);plt.imshow(img) # expects distorted color
plt.subplot(122);plt.imshow(img2) # expect true color
plt.show()

cv2.imshow('bgr image',img) # expects true color
cv2.imshow('rgb image',img2) # expects distorted color
cv2.waitKey(0)
cv2.destroyAllWindows()

NB : BGR と RGB の間のより良い変換方法については、以下の @Amro のコメントを確認してください。img2 = img[:,:,::-1]. とてもシンプルです。

このコードを実行して、結果の違いを自分で確認してください。以下は私が得たものです:

Matplotlib の使用:

ここに画像の説明を入力

OpenCV の使用:

ここに画像の説明を入力

于 2013-02-25T19:21:15.583 に答える
50

まだ言及されていない2つのオプション:

img[..., ::-1] # same as the mentioned img[:, :, ::-1] but slightly shorter

そして多才

cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
于 2016-03-01T22:46:46.153 に答える