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);
파이썬 코드 :
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);
일부는 내가 이미지를 조작하기 전에 float64로 변환하는 데 사용했다. 이미 시도했지만 아무것도 변경되지 않았습니다. 또한 astype (np.uint8)을 사용하여 float64를 uint8로 변환하여 [0..255] 이외의 값을 피하기도했습니다. MATLAB에는 그런 문제가 없습니다.
효과적인 numpy 코딩에 대한 보조 노트 : * 루프가 매우 느리고 벡터화가 빠릅니다. 범위 (열)에 대해 i 대신에'r [:, :] = img [:, :, 0]'이라고 쓰십시오 : 범위 (col)의 j : r [i, j] = img [i, j, 0]'을 선택하십시오. – jadsq
파이썬에서 for 루프를 사용하기 전에 img를 float로 변환하십시오. – Miki
@jadsq 예, 조언 해 주셔서 감사합니다. 전에는 눈치 채지 못했습니다. –