के

2012-12-20 17 views
22

में रंग तापमान की गणना करें मैंने रंगों के साथ काम करने के लिए एक lib लिखा है और Tc(k) की गणना करने की कोशिश कर रहा है। CIE 1931XYZ रंग स्थान में काम करने के तरीके से मैंने जो पढ़ा है, उससे xyY का उपयोग करके प्राप्त किया जा सकता है।के

अब तक मैं सब कुछ सही x और y से पता लगाना की बात करने का सही उत्तर दिया है:

  X     Y 
x = ____________ y = ____________ 
    (X + Y + Z)  (X + Y + Z) 

संख्या ज्यादा चार्ट करने के लिए, लेकिन नहीं कर सकते कुछ भी विवरण है कि कैसे आप x से जाना लगता है और yTc(K) को

enter image description here

जैसे: FF0000 # के लिए मैं निम्नलिखित मिलता है।

x: 0.64007449945677 
y: 0.32997051063169 

मैं विषय पर कागजात और litterally सभी विकिपीडिया लेख के एक नंबर पढ़ा है। सभी प्रश्न मैं पर सामने आने वाले अतः बस, रंग पर एक विकी लेख से लिंक एक की गणना Tc(k)

+1

आप इनमें से एक [रंग तापमान के लिए अनुमान] [http://en.wikipedia.org/wiki/Color_temperature#Approximation) को आजमा सकते हैं। दूसरी तरफ आप [प्लैंकियन लोकस] (http://en.wikipedia.org/wiki/Planckian_locus#Approximation) की तलाश में हैं। – user7116

+0

एक काले शरीर का रंग वास्तव में एक स्पेक्ट्रम है, शुद्ध वर्णक्रमीय रंग नहीं। उदाहरण के लिए, रंग सफेद हो सकता है, भले ही शिखर रंग हरा हो। किसी भी सूत्र में छड़ और आंखों के शंकुओं की प्रतिक्रिया का विश्लेषण करके समकक्ष सीआईई रंग का निर्धारण करना होगा। – UncleO

उत्तर

1

मैंने कुछ ओपन सोर्स ऐप्स में कुछ खुदाई की और यूएफआरओ में कुछ पाया। मुझे बिल्कुल पता नहीं चला है कि वास्तव में क्या चल रहा है।

भी paper मिला जो कि विषय को अच्छी तरह से कवर करता है।

परिवर्तित php के लिए और यह है कि क्या मैं अब तक है:

$temp = array(9500, 7000, 5500, 3750, 3000, 2700, 2250, 1800, 1500); 
$hex = array('9DBEFF', 'E4EEFF', 'FFE4BE', 'FFA04C', 'FF7A26', 'FF6A19', 'FF500B', 'FF3403', 'FF2300'); 

echo '<h3>K -> RGB</h3>'; 
foreach ($temp as $k) { 
    $rgb = ColourConverter::temperature2rgb($k); 
    echo sprintf('<div style="background-color:rgb(%s); text-align: center; width: 100px; height: 25px; clear: both;">%s</div>', implode(', ', $rgb), $k); 
} 

echo '<h3>RGB -> K</h3>'; 
foreach ($hex as $v) { 
    $rgb = array_values(ColourConverter::hex2rgb($v)); 
    $k = round(ColourConverter::rgb2temperature($rgb[0], $rgb[1], $rgb[2])); 
    echo sprintf('<div style="background-color:rgb(%s); text-align: center; width: 100px; height: 25px; clear: both;">%s</div>', implode(', ', $rgb), $k); 
} 

Reference

मेरे उत्पादन:

output

बहुत करीब नहीं बल्कि 100% अभी तक। (मिले मेरी कोड में एक bug और यह अब लगभग पूर्ण है)

  • रंग थोड़ा बंद कश्मीर से जा रहे हैं -> आरजीबी
  • यह कर कश्मीर काम नहीं करता है -> आरजीबी -> कश्मीर। आप एक ही मूल्य पर वापस नहीं आते हैं।

कोड

UFRaw line 246-294

void Temperature_to_RGB(double T, double RGB[3]) 
{ 
    int c; 
    double xD, yD, X, Y, Z, max; 
    // Fit for CIE Daylight illuminant 
    if (T <= 4000) { 
     xD = 0.27475e9/(T * T * T) - 0.98598e6/(T * T) + 1.17444e3/T + 0.145986; 
    } else if (T <= 7000) { 
     xD = -4.6070e9/(T * T * T) + 2.9678e6/(T * T) + 0.09911e3/T + 0.244063; 
    } else { 
     xD = -2.0064e9/(T * T * T) + 1.9018e6/(T * T) + 0.24748e3/T + 0.237040; 
    } 
    yD = -3 * xD * xD + 2.87 * xD - 0.275; 

    // Fit for Blackbody using CIE standard observer function at 2 degrees 
    //xD = -1.8596e9/(T*T*T) + 1.37686e6/(T*T) + 0.360496e3/T + 0.232632; 
    //yD = -2.6046*xD*xD + 2.6106*xD - 0.239156; 

    // Fit for Blackbody using CIE standard observer function at 10 degrees 
    //xD = -1.98883e9/(T*T*T) + 1.45155e6/(T*T) + 0.364774e3/T + 0.231136; 
    //yD = -2.35563*xD*xD + 2.39688*xD - 0.196035; 

    X = xD/yD; 
    Y = 1; 
    Z = (1 - xD - yD)/yD; 
    max = 0; 
    for (c = 0; c < 3; c++) { 
     RGB[c] = X * XYZ_to_RGB[0][c] + Y * XYZ_to_RGB[1][c] + Z * XYZ_to_RGB[2][c]; 
     if (RGB[c] > max) max = RGB[c]; 
    } 
    for (c = 0; c < 3; c++) RGB[c] = RGB[c]/max; 
} 

void RGB_to_Temperature(double RGB[3], double *T, double *Green) 
{ 
    double Tmax, Tmin, testRGB[3]; 
    Tmin = 2000; 
    Tmax = 23000; 
    for (*T = (Tmax + Tmin)/2; Tmax - Tmin > 0.1; *T = (Tmax + Tmin)/2) { 
     Temperature_to_RGB(*T, testRGB); 
     if (testRGB[2]/testRGB[0] > RGB[2]/RGB[0]) 
      Tmax = *T; 
     else 
      Tmin = *T; 
    } 
    *Green = (testRGB[1]/testRGB[0])/(RGB[1]/RGB[0]); 
    if (*Green < 0.2) *Green = 0.2; 
    if (*Green > 2.5) *Green = 2.5; 
} 
+4

हाय दोस्त, लिंक टूटा हुआ है, क्या आप इस उत्तर को अपडेट कर सकते हैं? – khaintt

1

अगर मैं तुम्हें सही ढंग से समझ कृपया इस pdf देखने के लिए वास्तविक सूत्र है कि नहीं देखा जहां विधियों (संक्षिप्त के एक नंबर:() में वर्णित इस पीडीएफ से:।

[CCT1] गणना CIE 1960 वर्दी रंग स्थान यू निर्देशांक और वी निर्देशांक यू और वी सूत्रों का उपयोग x और y से प्राप्त कर रहे का उपयोग कर प्रदर्शन कर रहे हैं:। यू = 4x/(12y-2x + 3) और v = 6y/(12y-2x + 3) सहसंबंधित रंग तापमान को तापमान के रूप में परिभाषित किया जाता है एक ब्लैकबेड का परीक्षण स्रोत के यू, वी निर्देशांक के सबसे नज़दीक है। दो अलग-अलग तरीके परिणाम प्रदान करते हैं: एक परिभाषा के आधार पर एक पुनरावृत्ति विधि है, और दूसरा आमतौर पर 30 की पूर्व-गणना u, v और उलटा-ढलान पैरामीटर की तालिका के आधार पर इंटरपोलेशन शामिल रॉबर्टसन की विधि का उपयोग करता है। पुनरावृत्ति अमेरिका और बनाम एक परीक्षण स्रोत के लिए मान रहे हैं, और केन्द्र शासित प्रदेशों और वीटी टी तापमान पर काले मूल्यों कर रहे हैं, सहसंबद्ध रंग तापमान टी का मूल्य है, जहां:

sqrt((uS - uT)^2 + (vS - vT)^2) 

कम किया गया है। इस कार्य के न्यूनतम प्राप्त करने के लिए तापमान टी समायोजित करना स्प्रेडशीट्स (क्वात्रो प्रो 8 और एक्सेल 97) का उपयोग करके किया गया था। दोनों स्प्रैडशीट्स ने समान मान दिए।

यह नहीं पता कि यह वास्तव में आपकी सहायता करता है या नहीं।

0

विकिपीडिया कहा गया है कि रंग तापमान, यू-वी वर्णविज्ञान, नहीं एक्स-y पर विचार करके की जाती है ताकि आप एक अनुवाद प्रदर्शन करने के लिए किया है। उस ने कहा, मैं @sixlettervariables द्वारा सुझाए गए अनुमान के अनुसार एक अनुमान (विकिपीडिया में भी समझाया गया) का उपयोग करने की सलाह देता हूं।

असली सवाल यह है कि आप रंग का तापमान ढूंढने की कोशिश कर रहे हैं? मुझे आरजीबी रंगों में एक संदर्भ (# एफएफ 0000) दिखाई देता है, जो रंगीन जगह बताए बिना व्यर्थ हैं। मान लीजिए कि आप एसआरबीबी में हैं (इसलिए मैं point you at Wikipedia फिर से कर सकता हूं), आपको पहले XYZ पर जाने से पहले रैखिक आरजीबी समन्वय प्राप्त करना होगा।

1

विकिपीडिया लेख के आधार पर मैं

=(-449*((R1-0,332)/(S1-0,1858))^3)+(3525*((R1-0,332)/(S1-0,1858))^2)-(6823,3*((R1-0,332)/(S1-0,1858)))+(5520,33)

R1 is color space x coordinate from 0 to 1 
S1 is color space y coordinate from 0 to 1 

वर्क्स ठीक के रूप में एक्सेल में Color Temperature गणना के लिए अनुमानित सूत्र में प्रवेश किया!

0

मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन मैं भी एक जवाब खोजने के लिए संघर्ष कर रहा था। मैं अंत में इस nifty calculator में आए इस प्रकार वह भी सूत्र पोस्ट:

एन = (एक्स-0,3320)/(0,1858-वाई)

CCT = 437 * n^3 + 3601 * n^2 + 6861 * एन + 5517

आशा है कि यह किसी और की मदद करता है जो अभी भी देख रहा है।

संबंधित मुद्दे