web-dev-qa-db-ja.com

Python、OpenCVのスライシングを使用して画像から領域を抽出する

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

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を抽出することを考えました。各チャネルからこの領域をスライスし、それらを結合して戻しますが、もっと短い方法があります。

53
Booyaches

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を使用:

enter image description here

OpenCVを使用:

enter image description here

121
Abid Rahman K

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

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

汎用性の高い

cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
44
Israel Unterman