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);
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);
いくつかは、私が前にそれを操作するのfloat64画像を変換するために使用することを述べました。すでに試してみましたが、何も変わりませんでした。 また、astype(np.uint8)を使ってfloat64をuint8に変換し、[0..255]外の値を避けました。 MATLABでは、このような問題はありません。
効率的なnumpyコーディングに関する副作用:*ループは非常に遅く、ベクトル化は高速です*。 r(i、j)= img [i、j、j]の代わりに 'for i in range(row):jの代わりに' r [:、:] = img [:、:、0] 0] 'を実行します。 – jadsq
Pythonでは、forループの前にimgをfloatに変換します。 – Miki
@jadsqええ、ありがとうございます。以前気づかなかった –