2016-07-23 1 views
2

이미지의 채널 (특히 빨강 및 파랑)을 바꿀 때 약간의 문제가 있습니다. Opencv 3.0.0과 Python 2.7.12를 사용하고 있습니다. 다음은 채널 같은 (아마도) 작업을 통해받은 같은 이미지는 두 개의 서로 다른 출력을주고있다 왜 알아낼 수 없습니까 OpenCV를 사용하여 이미지의 파랑 및 녹색 채널을 바꾸는 방법

import cv2 

img = cv2.imread("input/car1.jpg") 

#The obvious approach 
Cimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 

#Manual Approach 
red = img[:,:,2] 
blue = img[:,:,0] 

img[:,:,0] = red 
img[:,:,2] = blue 

cv2.imshow("frame",Cimg) 
cv2.imshow("frame2", img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

교환에 대한 내 코드입니다. 누군가가 잘못되어 가고있는 것에 대해 밝힐 수 있습니까?

감사합니다.

원본 이미지 The original Image

수동 운전 The manual operation

COLOR_BGR2RGB는 The cv2.COLOR_BGR2RGB operation

답변

2

redblue은 이미지의 단지 도면이다. img[:,:,0] = red을 수행하면 img이 변경되고 blue은 복사가 아니라 단지 뷰 (기본적으로 하위 배열 img[:,:,0] 참조) 일 뿐이므로 원래의 파란색 채널 값이 느슨해집니다. 기본적으로 임시 복사본이 있다고 가정합니다. .copy()을 추가하면 제대로 작동합니다.

img = np.arange(27).reshape((3,3,3)) 

red = img[:,:,2].copy() 
blue = img[:,:,0].copy() 

img[:,:,0] = red 
img[:,:,2] = blue 

print("with copy:\n", img) 

img = np.arange(27).reshape((3,3,3)) 

red = img[:,:,2] 
blue = img[:,:,0] 

img[:,:,0] = red 
img[:,:,2] = blue 

print("without copy:\n",img) 

결과 :

with copy: 
[[[ 2 1 0] 
    [ 5 4 3] 
    [ 8 7 6]] 

[[11 10 9] 
    [14 13 12] 
    [17 16 15]] 

[[20 19 18] 
    [23 22 21] 
    [26 25 24]]] 

without copy: 
[[[ 2 1 2] 
    [ 5 4 5] 
    [ 8 7 8]] 

[[11 10 11] 
    [14 13 14] 
    [17 16 17]] 

[[20 19 20] 
    [23 22 23] 
    [26 25 26]]] 

참고 : 당신은 실제로 단지 1 개 채널의 1 임시 사본이 필요합니다. 당신이 그것을 다시 할당하지 않는 한 아니면 단순히이 다시보기를 만들 것이다 img[:,:,::-1] 할 수 있지만, 교환 채널, img은 변하지 남아있을 것입니다 :

img = np.arange(27).reshape((3,3,3)) 

print(img[:,:,::-1]) 
print(img) 
img = img[:,:,::-1] 
print(img) 

결과 :

[[[ 2 1 0] 
    [ 5 4 3] 
    [ 8 7 6]] 

[[11 10 9] 
    [14 13 12] 
    [17 16 15]] 

[[20 19 18] 
    [23 22 21] 
    [26 25 24]]] 


[[[ 0 1 2] 
    [ 3 4 5] 
    [ 6 7 8]] 

[[ 9 10 11] 
    [12 13 14] 
    [15 16 17]] 

[[18 19 20] 
    [21 22 23] 
    [24 25 26]]] 


[[[ 2 1 0] 
    [ 5 4 3] 
    [ 8 7 6]] 

[[11 10 9] 
    [14 13 12] 
    [17 16 15]] 

[[20 19 18] 
    [23 22 21] 
    [26 25 24]]] 
+0

이 근무! 감사 :) –

관련 문제