2016-10-15 4 views
4

RGB 이미지를 YIQ 이미지로 변환하고 viceversa로 변환하겠습니다. 문제는 파이썬이 이상한 이미지를 제공하는 반면, MATLAB은 올바른 이미지를 보여줍니다. 내가 틀린 것을 생각하기 위해 몇 시간을 보냈지 만 나는 아직도 모른다.Python OpenCV와 MATLAB 사이의 다른 색상 결과

OpenCV 3.1.0 및 MATLAB R2016a에서 Python 3.5.2를 사용합니다. RGB2YIQ에 대한

파이썬 코드 : RGB2YIQ에 대한

import cv2 as cv 
import numpy as np 

def rgb2yiq(img): 
    row, col, ch = img.shape 
    Y = np.zeros((row,col)) 
    I = np.zeros((row,col)) 
    Q = np.zeros((row,col)) 
    for i in range(row): 
     for j in range(col): 
     Y[i,j] = 0.299 * img[i,j,2] + 0.587 * img[i,j,1] + 0.114 * img[i,j,0] 
     I[i,j] = 0.596 * img[i,j,2] - 0.274 * img[i,j,1] - 0.322 * img[i,j,0] 
     Q[i,j] = 0.211 * img[i,j,2] - 0.523 * img[i,j,1] + 0.312 * img[i,j,0] 
    yiq = cv.merge((Y,I,Q)) 
    return yiq.astype(np.uint8) 

def main(): 
    img = cv.imread("C:/Users/Kadek/Documents/MATLAB/peppers.jpg") 
    img = rgb2yiq(img) 
    cv.imwrite("YIQ.jpg",img) 
    cv.namedWindow('Image', cv.WINDOW_NORMAL) 
    cv.imshow('Image', img) 
    cv.waitKey(0) 
    cv.destroyAllWindows() 

main() 

MATLAB 코드 : YIQ2RGB에 대한

img = imread('peppers.jpg'); 
[row col ch] = size(img); 

for x=1:row 
    for y=1:col 
     Y(x,y) = 0.299 * img(x,y,1) + 0.587 * img(x,y,2) + 0.114 * img(x,y,3); 
     I(x,y) = 0.596 * img(x,y,1) - 0.274 * img(x,y,2) - 0.322 * img(x,y,3); 
     Q(x,y) = 0.211 * img(x,y,1) - 0.523 * img(x,y,2) + 0.312 * img(x,y,3); 
    end 
end 

yiq(:,:,1) = Y; 
yiq(:,:,2) = I; 
yiq(:,:,3) = Q; 

figure, imshow(yiq); 

Result for RGB2YIQ

파이썬 코드 :

import cv2 as cv 
import numpy as np 

def yiq2rgb(img): 
    row, col, ch = img.shape 
    r = np.zeros((row,col)) 
    g = np.zeros((row,col)) 
    b = np.zeros((row,col)) 
    for i in range(row): 
     for j in range(col): 
     r[i,j] = img[i,j,0] * 1.0 + img[i,j,1] * 0.9562 + img[i,j,2] * 0.6214 
     g[i,j] = img[i,j,0] * 1.0 - img[i,j,1] * 0.2727 - img[i,j,2] * 0.6468 
     b[i,j] = img[i,j,0] * 1.0 - img[i,j,1] * 1.1037 + img[i,j,2] * 1.7006 
    rgb = cv.merge((b,g,r)) 
    return rgb.astype(np.uint8) 

def main(): 
    img = cv.imread("YIQ.jpg") 
    img = yiq2rgb(img) 
    cv.imwrite("test.jpg",img) 
    cv.namedWindow('Image', cv.WINDOW_NORMAL) 
    cv.imshow('Image', img) 
    cv.waitKey(0) 
    cv.destroyAllWindows() 

main() 

M YIQ2RGB에 대한 애 트랩 코드 :

img = imread('YIQ.jpg'); 
[row col ch] = size(img); 

for x=1:row 
    for y=1:col 
     R(x,y) = 1.0 * img(x,y,1) + 0.9562 * img(x,y,2) + 0.6214 * img(x,y,3); 
     G(x,y) = 1.0 * img(x,y,1) - 0.2727 * img(x,y,2) - 0.6468 * img(x,y,3); 
     B(x,y) = 1.0 * img(x,y,1) - 1.1037 * img(x,y,2) + 1.7006 * img(x,y,3); 
    end 
end 

rgb(:,:,1) = R; 
rgb(:,:,2) = G; 
rgb(:,:,3) = B; 

imwrite(rgb,'YIQ2RGB.jpg'); 

figure, imshow(rgb); 

Result for YIQ2RGB

일부는 내가 이미지를 조작하기 전에 float64로 변환하는 데 사용했다. 이미 시도했지만 아무것도 변경되지 않았습니다. 또한 astype (np.uint8)을 사용하여 float64를 uint8로 변환하여 [0..255] 이외의 값을 피하기도했습니다. MATLAB에는 그런 문제가 없습니다.

+1

효과적인 numpy 코딩에 대한 보조 노트 : * 루프가 매우 느리고 벡터화가 빠릅니다. 범위 (열)에 대해 i 대신에'r [:, :] = img [:, :, 0]'이라고 쓰십시오 : 범위 (col)의 j : r [i, j] = img [i, j, 0]'을 선택하십시오. – jadsq

+0

파이썬에서 for 루프를 사용하기 전에 img를 float로 변환하십시오. – Miki

+0

@jadsq 예, 조언 해 주셔서 감사합니다. 전에는 눈치 채지 못했습니다. –

답변

0

계산 된 구성 요소가 [0,255] 범위를 초과하여 분명히 채도 문제가 발생합니다. 값을 클램핑하거나 게인을 조정하십시오.

그런 다음 어딘가에서 구성 요소를 교체하는 것처럼 보입니다.

+0

따라서, 저는 astype (np.uint8)을 사용하여 float64를 uint8로 변환했습니다. MATLAB에는 그런 문제가 없습니다. –