2016-10-15 2 views
4

RGB画像をYIQ画像とその逆に変換します。問題はPythonが私に奇妙なイメージを与えるのに対し、MATLABは正しいイメージを示しています。何が間違っているかを理解するのに何時間も費やしましたが、私はまだ考えていません。Python OpenCVとMATLABの色結果が異なる

私はOpenCV 3.1.0とMATLAB R2016aでPython 3.5.2を使用します。

RGB2YIQためのPythonコード: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

Pythonコード:

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ためATLABコード:

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コーディングに関する副作用:*ループは非常に遅く、ベクトル化は高速です*。 r(i、j)= img [i、j、j]の代わりに 'for i in range(row):jの代わりに' r [:、:] = img [:、:、0] 0] 'を実行します。 – jadsq

+0

Pythonでは、forループの前にimgをfloatに変換します。 – Miki

+0

@jadsqええ、ありがとうございます。以前気づかなかった –

答えて

0

計算されたコンポーネントが[0,255]の範囲を超えているため、明らかに飽和問題に直面しています。値をクランプしたり、ゲインを調整したりします。

次に、コンポーネントをどこかに交換しているようです。

+0

したがって、私はastype(np.uint8)を使ってfloat64をuint8に変換しました。 MATLABでは、このような問題はありません。 –

関連する問題