2016-05-26 13 views
0

赤と青の間の補間をしたい。このhsvの色間の奇妙な補間?

img

が、単一のラインのようなもの。

私のJavaコード:

private PixelData InterpolateColour(float totalLength, float curLength){ 
    float startColourV[] = new float[3]; 
    Color.RGBtoHSB(m_start.getColour().getR() & 0xFF, m_start.getColour().getG() & 0xFF, m_start.getColour().getB() & 0xFF, startColourV); 

    float endColourV[] = new float[3]; 
    Color.RGBtoHSB(m_end.getColour().getR() & 0xFF, m_end.getColour().getG() & 0xFF, m_end.getColour().getB() & 0xFF, endColourV); 

    float endPercent = curLength/totalLength; 
    float startPercent = 1 - curLength/totalLength; 

    float h = endColourV[0] * endPercent + startColourV[0] * startPercent; 
    float s = endColourV[1] * endPercent + startColourV[1] * startPercent; 
    float b = endColourV[2] * endPercent + startColourV[2] * startPercent; 

    int colourRGB = Color.HSBtoRGB(h, s, b); 

    byte[] ByteArray = ByteBuffer.allocate(4).putInt(colourRGB).array(); 


    return new PixelData(ByteArray[0], ByteArray[3], ByteArray[2], ByteArray[1]); 
} 

と私は取得していた結果がこの

imgです。

緑がすべてどこから来ているのか分かりません。誰か助けてくれますか?

+0

誰かが私を助けることができますか? –

+0

赤は0度、青は240度、緑は120度の中間にあります。その方向を補間すると、緑色になります。おそらく240から360に行ってみるべきです。 – beaker

+0

@beaker Ok iは$ \ frac {4 \ pi} {3} $から$ 2 \ pi $まで補間しました。しかし、もし私が与えられた目的地にどんな色があるのか​​分からなければ、私は何をしますか? –

答えて

0

はなぜこのため、単純な線形補間でちょうどRGBを使用しない:

t=<0.0,1.0>
color(t)=(color0*t)+(color1*(1.0-t)) 

がパラメータです。それで、必要なだけ多くのステップでフルレンジでループしてください。

整数C++/VCL例(申し訳ありませんがないJAVAコーダ):

// borland GDI clear screen 
Canvas->Brush->Color=clBlack; 
Canvas->FillRect(ClientRect); 
// easy access to RGB channels 
union _color 
    { 
    DWORD dd; 
    BYTE db[4]; 
    } c0,c1,c; 
// 0x00BBGGRR 
c0.dd=0x000000FF; // Red 
c1.dd=0x00FF0000; // Blue 
int x,y,t0,t1; 
for (x=0,y=ClientHeight/2;x<ClientWidth;x++) 
    { 
    t0=x; 
    t1=ClientWidth-1-x; 
    c.db[0]=((DWORD(c0.db[0])*t0)+(DWORD(c1.db[0])*t1))/(ClientWidth-1); 
    c.db[1]=((DWORD(c0.db[1])*t0)+(DWORD(c1.db[1])*t1))/(ClientWidth-1); 
    c.db[2]=((DWORD(c0.db[2])*t0)+(DWORD(c1.db[2])*t1))/(ClientWidth-1); 
    c.db[3]=((DWORD(c0.db[3])*t0)+(DWORD(c1.db[3])*t1))/(ClientWidth-1); 
    Canvas->Pixels[x][y]=c.dd; 
    } 

ClientWidth,ClientHeightは私のアプリフォーム解像度は、CanvasフォームのGDIインターフェースへのアクセスとCanvas->Pixels[x][y]では、1つの画素のアクセスがあります(遅いが、この例では十分です)。唯一重要なことはforループです。ここでは、結果として得られる画像:

img

+0

ありがとうございます。実際には、0と2 * piの間の値に変換することで、hsbで正しい補間を実現することができました。今私の問題は、私はアルファチャンネルが失われてhsbにrgbから変換するときです。あなたのコードアルファも正しく補間されているので、私は補間を実装します。だから、それがアルファと一緒に動くかどうか教えてもらえますか?再度、感謝します。 –

+0

@ritwiksinha大雑把に言えばそれは動作しますが、私はそれを今すぐコードに追加したために4チャンネルすべてを補間する必要があります(4番目の補間ライン)。あなたがJAVAへのポートで何か助けを必要とするならば、ただコメントしますが、それは本当に簡単なので、私は問題が起きるのを疑うでしょう。変更できる唯一のことは、RGBAとBGRAのどこかでチャンネルの順序ですが、コードは変わらずにそのまま残っています – Spektre

+0

RGBは補間する恐ろしい色空間です。ガンマ補正されたsRGBの場合、泥が出ます飽和赤と緑との間の茶色。線形RGBの場合、[知覚的に非線形の明るさ勾配](https://en.wikipedia.org/wiki/Gamma_correction#Power_law_for_video_display)が表示されます。知覚的な色補間では、[CIELab](https://en.wikipedia.org/wiki/Lab_color_space) – the8472

0

色補間が原因人間の視覚の仕組みを実際にかなり複雑な話題です。

物理的な強度と波長は、知覚される輝度と色相に直接マッピングされません。すべての人間の目は光子分光器ではないので、強度+ 3つの原色を測定するだけで、感度はそれぞれ異なります。

物理属性の代わりに人間の色知覚を表す線形空間を持つには、CIELabが必要です。ポイント間の補間を行うのは線形メトリックなので、一般的に色相と輝度の間の線形遷移が必要です。

しかし、CIELabは、知覚感度のみをモデル化するため、十分ではない可能性があります。実際の照明に合わせる必要がある場合は、自然の光源がすべての色を均等に照明しないことも考慮する必要があります。

フォトリアリスティックマテリアルに合わせる必要がある場合は、さらに自然光の強度スペクトルを補正する必要があります。私。ろうそくで照らされたものは、ろうそくが反射する可能性のある青色光をほとんど放出しないため、濃い青色成分を持たない。

関連する問題