2017-10-28 11 views
-1

クラスについては、RGB画像をYIQに変換する必要があります。 我々は変換がすることによって行うことができると言われていますnumpy RGB画像をYIQカラースペースに変換する

transforming rgb to yiq

私は行列の乗算を持つようにループを有するマッシーコードを書き始め、その後、私は機能を見つけた

skimage.color.yiq2rgb(imYIQ) 

彼らが何をしているのかを見るために内部を見たとき、私は次のように言う(私はものをコピーしているので、より明確になる)。

yiq_from_rgb = yiq_from_rgb = np.array([[0.299,  0.587,  0.114], 
           [0.59590059, -0.27455667, -0.32134392], 
           [0.21153661, -0.52273617, 0.31119955]]) 
return np.dot(arr, yiq_from_rgb.T.copy()) 

の場合arrはマトリックスとしてのRGBピクチャだけです

これはなぜ機能するのですか?彼らはなぜトランスポーズマトリックスを取るのですか? (.T) arrの形状がyiq_from_rgbと異なる場合、ドット製品はどのくらい正確に機能しますか?

+0

[docs](https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html#numpy.dot) - '2次元配列の場合は、行列の乗算と同じです、 '。 – wwii

+0

画像配列が必要な変換仕様から転置*されているため、転置する必要がありますか? – wwii

+0

[座標慣習](http://scikit-image.org/docs/dev/user_guide/numpy_images.html#coordinate-conventions) - イメージ配列の次元は(row、col、ch)です。したがって、5×10画像は(10,5,3)の形状を有する。赤色のチャンネルは 'arr [:、:、0]'、青色は 'arr [:、:、1]' ... – wwii

答えて

1

変換行列を含む参照図では、変換行列はRGBチャネルの左側にあります。 (y1y,y1i,y1q)がどこにある

y1y = (0.299*p1r + 0.587*p1g + 0.114*p1b) 
y1i = (0.596*p1r - 0.275*p1g - 0.321*p1b) 
y1q = (0.212*p1r - 0.523*p1g + 0.311*p1b) 

:だから、あなたのRGB画像の最初のピクセルのために、のは、Bチャネルは、それぞれ、我々は変換行列を掛けるなどの結果を合計する必要がR、G、に対応する(p1r, p1g, p1b)それを呼びましょうintを四捨五入して得られたYIQ画像の最初のピクセルの値。我々は、RGB画像全体の全ての画素に対して同じ種類の乗算を行い、所望のYIQ画像を得る。

ここでは、np.dot(arr, yiq_from_rgb.T)を使用してこの全体の実装を行うため、重み付けを正しく行うには、変換行列を転置する必要があります。 copyは、この変換のために転置された変換行列を専用に持つことです。

また、np.dot()では、あなたの図とは逆に、RGBアレイが変換マトリックスの左側にあることに注意してください。

+0

私はいくつかの*表示を見てきました*結果は255で除算する必要もあります。 – wwii

関連する問題