2012-11-11 12 views
7

शायद मैं सही रंग शब्दावली का उपयोग नहीं कर रहा हूं लेकिन मैं मूल रूप से संलग्न तस्वीर के समान रंगों को स्केल करने में सक्षम होना चाहता हूं। मैं ऐसा करने के लिए संतृप्ति की खोज कर रहा हूं, क्योंकि ऐसा लगता है कि सही संस्करण बाएं का एक कम संतृप्त संस्करण है।रंग को डिसाइनेट कैसे करें?

enter image description here

मैं इस कोशिश कर रहा था (मैंने पाया है) लेकिन यह बिल्कुल सही नहीं लग रही है:

Public Shared Function GetDesaturatedColor(color As Color) As Color 
    Const kValue As Double = 0.01R 

    Dim greyLevel = (color.R * 0.299R) + _ 
        (color.G * 0.587R) + _ 
        (color.B * 0.144R) 

    Dim r = greyLevel * kValue + (color.R) * (1 - kValue) 
    Dim g = greyLevel * kValue + (color.G) * (1 - kValue) 
    Dim b = greyLevel * kValue + (color.B) * (1 - kValue) 

    ' ColorUtils.ToByte converts the double value 
    ' to a byte safely 
    Return color.FromArgb(255, _ 
          ColorUtils.ToByte(r), _ 
          ColorUtils.ToByte(g), _ 
          ColorUtils.ToByte(b)) 
End Function 

किसी को भी कुछ एल्गोरिथ्म है कि यह कर सकते हैं के बारे में पता है?

+1

खोजें यहां आरजीबी के लिए एचएसएल के लिए और आप विषय पर कई पदों मिल जाएगा। – Brad

उत्तर

2

@Brad के रूप में आपकी पोस्ट पर टिप्पणियों में उल्लेख किया गया है, आपका पहला कदम आरजीबी से रंगों को HSL or HSV में परिवर्तित करना है। वहां से, संतृप्ति को कम करना मामूली है - इसे कम करने के लिए संतृप्ति को घटाकर या घटाएं।

उसके बाद, अपने एचएसएल/एचएसवी रंग को आरजीबी में वापस परिवर्तित करें और यह उपयोग के लिए तैयार है।

How to change RGB color to HSV? में ऐसा करने का एक अच्छा उदाहरण है, जैसा कि Manipulating colors in .net करता है।

2

यह प्रयोग द्वारा प्रकट होता है कि चित्र में दिखाए गए परिणाम प्राप्त करने के लिए बस संतृप्ति को कम करना पर्याप्त नहीं है। मैंने नीचे दिखाए गए कोड में ओपी के प्रश्न से रंगों का उपयोग किया।

enter image description here

आप भी अल्फा को कम हैं/नए रंग की अस्पष्टता, आप एक बेहतर परिणाम प्राप्त कर सकते हैं::

enter image description here

मैं तुम सिर्फ संतृप्ति को कम है, तो आप क्या मिलता है मैं मानता हूं कि क्या आप पैरामीटर के साथ खेलते हैं, तो आपको एक आदर्श मैच प्राप्त करने में सक्षम होना चाहिए। बदलते reducedSaturation2 के लिए alpha प्रयास करें (वर्तमान में 40 =) और GetSaturation विभक्त (वर्तमान में 1.3 =)

यहाँ मेरी कोड नमूना है:

Public Function HSVToColor(ByVal H As Double, ByVal S As Double, ByVal V As Double) As Color 
    Dim Hi As Integer = (H/60) Mod 6 
    Dim f As Double = H/60 Mod 1 
    Dim p As Integer = V * (1 - S) * 255 
    Dim q As Integer = V * (1 - f * S) * 255 
    Dim t As Integer = V * (1 - (1 - f) * S) * 255 
    Select Case Hi 
    Case 0 : Return Color.FromArgb(V * 255, t, p) 
    Case 1 : Return Color.FromArgb(q, V * 255, p) 
    Case 2 : Return Color.FromArgb(p, V * 255, t) 
    Case 3 : Return Color.FromArgb(p, V * 255, q) 
    Case 4 : Return Color.FromArgb(t, p, V * 255) 
    Case 5 : Return Color.FromArgb(V * 255, q, p) 
    End Select 
End Function 

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    Dim normalSaturation As Color = Color.FromArgb(255, 216, 53, 45) 
    Me.CreateGraphics.FillRectangle(New SolidBrush(normalSaturation), 100, 0, 100, 100) 
    Dim reducedSaturation As Color = HSVToColor(normalSaturation.GetHue, normalSaturation.GetSaturation/1.3, normalSaturation.GetBrightness) 
    Dim reducedSaturation2 As Color = Color.FromArgb(40, reducedSaturation) 
    Me.CreateGraphics.FillRectangle(New SolidBrush(reducedSaturation2), 0, 0, 100, 100) 
End Sub 
+1

मैंने यह भी देखा। जिस तरह से मैंने इसे हल करने की कोशिश की थी वह संतृप्ति और चमक (मूल्य) को कम कर देगी। मैं अपनी तस्वीर के समान कुछ ठीक से प्राप्त करने में सक्षम था। हालांकि, धन्यवाद, मैं तुम्हारा प्रयास करूंगा। – test

+0

@reedparkes: मैंने ब्रिगेनेस के साथ खेलने की कोशिश की - समस्या कुछ है कि यह काफी अधिक हो जाती है (= 255), तो आप इसे और नहीं कर सकते हैं। यह वह जगह है जहां अल्फा मदद कर सकता है। असल में, आप वांछित परिणाम प्राप्त करने के लिए शायद तीनों का उपयोग कर सकते हैं। – Neolisk

9

उन है कि एचएसएल/एचएसवी और वापस करने के लिए सब कुछ परिवर्तित करने से बचने के लिए, इस समुचित रूप से काम करता है (अगर सही ढंग से एक सोचता है कि क्या "सही" असंतृप्त छवि है पर निर्भर करता है नहीं):

f = 0.2; // desaturate by 20% 
L = 0.3*r + 0.6*g + 0.1*b; 
new_r = r + f * (L - r); 
new_g = g + f * (L - g); 
new_b = b + f * (L - b); 
+0

एक आकर्षण की तरह काम किया – CatalinBerta

+0

इस एल्गोरिदम के लिए स्पष्टीकरण क्या है? क्या इसके लिए कोई नाम है? छवि प्रसंस्करण एटीएम सीखने की कोशिश कर रहा है। – kosinix

+0

यह सामान्य धारणा का उपयोग करके आर, जी, बी को ग्रेस्केल में परिवर्तित कर रहा है कि हरे, लाल और नीले क्रमशः घटते अनुपात के [लुमा] (https://en.wikipedia.org/wiki/Grayscale#Luma_coding_in_video_systems) से मेल खाते हैं । तो 'एल' एक ग्रेस्केल छवि है और फिर 'एफ' इनपुट आरजीबी छवि और उस ग्रेस्केल छवि के बीच रैखिक रूप से इंटरपोलेटिंग है। –

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