दिलचस्प पोस्ट
एंड्रॉइड स्टूडियो में डिबग.कीस्टोर कहां है कैसे जावास्क्रिप्ट में एक सरणी की लंबाई को इनिशियलाइज़ करने के लिए? सभी जावास्क्रिप्ट घटनाओं की सूची जेक्जरी का उपयोग कर किसी पेज पर वायर्ड करें HTML5 वीडियो लूप नहीं होगा लेआउट के साथ एक दृश्य कैसे बढ़ाना JQuery का उपयोग करके मैं एक तत्व का आईडी कैसे प्राप्त करूं? सामग्री के आधार पर गतिशील रूप से ट्विटर बूटस्ट्रैप मोडल का आकार बदलने का तरीका सी # कन्स्ट्रक्टर चेनिंग? (यह कैसे करना है?) पायथन 3 के साथ पीपी कैसे स्थापित करें? डेस्कटॉप और मोबाइल दृश्यों के लिए वस्तुओं को पुन: व्यवस्थित करने के लिए फ्लेक्स ऑर्डर की सुविधा का उपयोग करना कैसे बास में स्ट्रिंग चर को जोड़ने के लिए? अक्षर अक्षर की जगह नहीं लेना "गलत स्ट्रिंग मान" त्रुटियाँ कैसे ठीक करें? बड़ा सेट मिटाने के लिए टाइमटाइम () "ब्रेक" क्यों करता है? Eigen और std :: वेक्टर

छवि में किसी विशेष रंग को कैसे बदलना है?

मेरा प्रश्न यह है कि अगर मेरे पास शेर की छवि है तो मैं केवल शेर का रंग ही पृष्ठभूमि रंग से बदलना चाहता हूं। इसके लिए मैंने इस SO प्रश्न का संदर्भ दिया लेकिन यह पूरी छवि का रंग बदल गया। इसके अलावा छवि बहुत अच्छी नहीं लग रही है मुझे फ़ोटोशॉप की तरह रंग बदलने की आवश्यकता है। क्या यह कोर ग्राफिक्स में करना संभव है या मुझे किसी भी अन्य पुस्तकालय का उपयोग करना होगा

संपादित करें: मुझे iQuikColor ऐप की तरह रंग बदलने की आवश्यकता है

यहां छवि विवरण दर्ज करें

वेब के समाधान से एकत्रित समाधान "छवि में किसी विशेष रंग को कैसे बदलना है?"

इसके बजाय नीचे दिए गए उत्तर देखें मेरा एक पूर्ण समाधान प्रदान नहीं करता है


यहां OpenCV का उपयोग कर संभव समाधान का स्केच है:

  • cvCvtColor का उपयोग करके आरजीबी से cvCvtColor में छवि को परिवर्तित करें (हम केवल रंग बदलना चाहते हैं)
  • एक विशिष्ट सहिष्णुता निर्दिष्ट करने के लिए cvThreshold साथ एक रंग को अलग करें (आप रंगों की एक सीमा चाहते हैं, एक सपाट रंग नहीं)।
  • एक ब्लॉब डिटेक्शन लायब्रेरी जैसे cvBlobsLib का उपयोग करके न्यूनतम आकार के नीचे रंग के क्षेत्रों को त्यागें। इस दृश्य में समान रंग के डॉट्स से छुटकारा मिल जाएगा।
  • cvInRangeS साथ रंग मास्क और नए रंग को लागू करने के लिए परिणामी मुखौटा का उपयोग करें।
  • cvMerge नई छवि के साथ नए रंग के साथ एक छवि जो संतृप्ति और चमक चैनल है जो आप एक कदम में बचाया द्वारा रचित।

नेट में कई ओपनसीवी आईओएस पोर्ट हैं, जैसे: http://www.eosgarden.com/en/opensource/opencv-ios/overview/ मैंने खुद को यह नहीं करने की कोशिश की है, लेकिन एक अच्छा शोध दिशा लगता है।

यह समझने में काफी समय लग गया, मुख्यतः क्योंकि मैं इसे उठाना चाहता था और स्विफ्ट में कोर इमेज और सीआईसीलोर क्यूब का उपयोग करना चाहता था।

@ मिगुएल के स्पष्टीकरण को "ह्यू एंगल रेंज" को दूसरे "ह्यू ऐंगल रेंज" के साथ बदलने की आवश्यकता के बारे में पता चलता है। आप ह्यू एंगल रेंज क्या है पर विवरण के लिए उपरोक्त अपनी पोस्ट पढ़ सकते हैं।

मैंने एक त्वरित ऐप बनाया है जो नीचे दिए गए डिफ़ॉल्ट नीले ट्रक को बदल देता है, जो भी आप ह्यू स्लाइडर पर चुनते हैं।

यहां छवि विवरण दर्ज करें

आप स्लाइडर को ऐप बता सकते हैं कि आप किस रंग ह्यू को नीले रंग के साथ बदलना चाहते हैं।

मैं ह्यू रेंज को 60 डिग्री तक कठोर कर रहा हूं, जो आमतौर पर किसी विशेष रंग को घेरता है लेकिन आप इसे संपादित कर सकते हैं यदि आपको इसकी आवश्यकता है

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

ध्यान दें कि यह टायर या पूंछ रोशनी का रंग नहीं करता है क्योंकि यह ट्रक की डिफ़ॉल्ट नीली रंग की 60 डिग्री सीमा के बाहर है, लेकिन यह उचित रूप से छायांकन को संभालता है

पहले आपको आरजीबी को एचएसवी (ह्यू वैल्यू) में कनवर्ट करने की आवश्यकता है:

 func RGBtoHSV(r : Float, g : Float, b : Float) -> (h : Float, s : Float, v : Float) { var h : CGFloat = 0 var s : CGFloat = 0 var v : CGFloat = 0 let col = UIColor(red: CGFloat(r), green: CGFloat(g), blue: CGFloat(b), alpha: 1.0) col.getHue(&h, saturation: &s, brightness: &v, alpha: nil) return (Float(h), Float(s), Float(v)) } 

फिर आपको एचएसवी को आरजीबी में परिवर्तित करना होगा। आप इस का उपयोग तब करना चाहते हैं जब आप अपने इच्छित रंग की रेंज (उर्फ, डिफॉल्ट ट्रक के रंग का एक ही रंग वाला रंग) में किसी भी बदलाव को सहेजने के लिए एक रंग खोजते हैं।

 func HSVtoRGB(h : Float, s : Float, v : Float) -> (r : Float, g : Float, b : Float) { var r : Float = 0 var g : Float = 0 var b : Float = 0 let C = s * v let HS = h * 6.0 let X = C * (1.0 - fabsf(fmodf(HS, 2.0) - 1.0)) if (HS >= 0 && HS < 1) { r = C g = X b = 0 } else if (HS >= 1 && HS < 2) { r = X g = C b = 0 } else if (HS >= 2 && HS < 3) { r = 0 g = C b = X } else if (HS >= 3 && HS < 4) { r = 0 g = X b = C } else if (HS >= 4 && HS < 5) { r = X g = 0 b = C } else if (HS >= 5 && HS < 6) { r = C g = 0 b = X } let m = v - C r += m g += m b += m return (r, g, b) } 

अब आप केवल एक पूर्ण आरजीबीए रंग क्यूब के माध्यम से पाश और अपने नए वांछित रंग से "डिफ़ॉल्ट नीला" रंग की रेंज में किसी भी रंग को समायोजित करें। फिर छवि में अपने समायोजित रंग क्यूब को लागू करने के लिए कोर छवि और CicolorCube फ़िल्टर का उपयोग करें।

 func render() { let centerHueAngle: Float = 214.0/360.0 //default color of truck body blue let destCenterHueAngle: Float = slider.value let minHueAngle: Float = (214.0 - 60.0/2.0) / 360 //60 degree range = +30 -30 let maxHueAngle: Float = (214.0 + 60.0/2.0) / 360 var hueAdjustment = centerHueAngle - destCenterHueAngle let size = 64 var cubeData = [Float](count: size * size * size * 4, repeatedValue: 0) var rgb: [Float] = [0, 0, 0] var hsv: (h : Float, s : Float, v : Float) var newRGB: (r : Float, g : Float, b : Float) var offset = 0 for var z = 0; z < size; z++ { rgb[2] = Float(z) / Float(size) // blue value for var y = 0; y < size; y++ { rgb[1] = Float(y) / Float(size) // green value for var x = 0; x < size; x++ { rgb[0] = Float(x) / Float(size) // red value hsv = RGBtoHSV(rgb[0], g: rgb[1], b: rgb[2]) if hsv.h < minHueAngle || hsv.h > maxHueAngle { newRGB.r = rgb[0] newRGB.g = rgb[1] newRGB.b = rgb[2] } else { hsv.h = destCenterHueAngle == 1 ? 0 : hsv.h - hueAdjustment //force red if slider angle is 360 newRGB = HSVtoRGB(hsv.h, s:hsv.s, v:hsv.v) } cubeData[offset] = newRGB.r cubeData[offset+1] = newRGB.g cubeData[offset+2] = newRGB.b cubeData[offset+3] = 1.0 offset += 4 } } } let data = NSData(bytes: cubeData, length: cubeData.count * sizeof(Float)) let colorCube = CIFilter(name: "CIColorCube")! colorCube.setValue(size, forKey: "inputCubeDimension") colorCube.setValue(data, forKey: "inputCubeData") colorCube.setValue(ciImage, forKey: kCIInputImageKey) if let outImage = colorCube.outputImage { let context = CIContext(options: nil) let outputImageRef = context.createCGImage(outImage, fromRect: outImage.extent) imageView.image = UIImage(CGImage: outputImageRef) } } 

आप यहां नमूना प्रोजेक्ट डाउनलोड कर सकते हैं । यह Xcode 7 और स्विफ्ट 2.0 का उपयोग कर रहा है।

मैं इस धारणा को बनाऊँगा कि आप ये जानते हैं कि ये बुनियादी संचालन कैसे करें, तो ये मेरे समाधान में शामिल नहीं होंगे:

  • एक छवि लोड करें
  • भारित छवि के दिए गए पिक्सेल के आरजीबी मूल्य प्राप्त करें
  • किसी दिए गए पिक्सेल के आरजीबी मूल्य सेट करें
  • एक भरी हुई छवि प्रदर्शित करें, और / या इसे डिस्क पर वापस सहेजें।

सबसे पहले, मान लें कि आप स्रोत और गंतव्य रंगों का वर्णन कैसे कर सकते हैं। स्पष्ट रूप से आप इन्हें सटीक आरजीबी मूल्यों के रूप में निर्दिष्ट नहीं कर सकते, क्योंकि एक तस्वीर में रंग में थोड़ी भिन्नताएं होंगी। उदाहरण के लिए, आपके द्वारा पोस्ट किए गए ट्रक चित्र में हरी पिक्सल बिल्कुल हरे रंग की समान छाया नहीं हैं मूल रंग विशेषताओं को व्यक्त करने में आरजीबी रंग मॉडल बहुत अच्छा नहीं है, इसलिए यदि आप पिक्सल को एचएसएल में परिवर्तित करते हैं तो आपको बेहतर परिणाम मिलेंगे। आरजीबी को एचएसएल और पीठ में कनवर्ट करने के लिए सी फंक्शन हैं I

एचएसएल रंग मॉडल रंग के तीन पहलुओं का वर्णन करता है:

  1. ह्यू – मुख्य माना जाता रंग – यानी लाल, हरा, नारंगी, आदि।
  2. संतृप्ति – कैसे "पूर्ण" रंग है – यानी पूर्ण रंग से कोई रंग नहीं
  3. चमक – रंग कितना उज्ज्वल है

उदाहरण के लिए, यदि आप तस्वीर में सभी हरे रंग के पिक्सल खोजना चाहते हैं, तो आप प्रत्येक पिक्सेल को आरजीबी से एचएसएल में परिवर्तित कर देंगे, फिर हरे रंग के रंगों के लिए कुछ सहिष्णुता के साथ हरे रंग की एच मान देखें। नीचे एक ह्यू चार्ट है, विकिपीडिया से:

तो आपके मामले में आप उन पिक्सेल को देख रहे होंगे जिनमें ह्यू का 120 डिग्री +/- कुछ राशि है रेंज जितनी अधिक रंग का चयन किया जाएगा उतना बड़ा होगा। यदि आप अपनी सीमा को बहुत चौड़ा बनाते हैं तो आप पीले और सियान पिक्सल का चयन करना शुरू कर देंगे, इसलिए आपको सही श्रेणी ढूंढनी होगी, और आप इस श्रेणी का चयन करने के लिए उपयोगकर्ता को अपने ऐप नियंत्रण का भी प्रस्ताव देना चाहेंगे।

ह्यू द्वारा चुनने के अलावा, आप संतृप्ति और लाइटनेस के लिए रेंज की अनुमति देना चाह सकते हैं, ताकि आप वैकल्पिक रूप से पिकाखे तक अधिक सीमाएं डाल सकें जो आप रंगाई के लिए चयन करना चाहते हैं।

अंत में, आप उपयोगकर्ता को "लसो चयन" खींचना करने की क्षमता प्रदान कर सकते हैं ताकि चित्र के विशिष्ट भाग को रंगाई से बाहर छोड़ा जा सके। ऐसा है कि आप ऐप को बता सकते हैं कि आप हरी ट्रक के शरीर चाहते हैं, लेकिन हरे रंग का पहिया नहीं।

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

पिक्सेल को रंगीन करने का सबसे आसान तरीका सिर्फ ह्यू को बदलना है, मूल पिक्सेल से संतृप्ति और चमक को छोड़कर। उदाहरण के लिए, यदि आप हरे रंग के पिक्सेल मैजेन्टा बनाना चाहते हैं तो आप चयनित पिक्सल के सभी ह्यू मानों में 180 डिग्री जोड़ देंगे (यह सुनिश्चित कर लें कि आप मॉड्यूलो 360 गणित का उपयोग कर रहे हैं)।

यदि आप अधिक परिष्कृत करना चाहते हैं, तो आप संतृप्ति में परिवर्तन भी लागू कर सकते हैं और यह आपको उन टननों की एक विस्तृत श्रृंखला देगा जो आप कर सकते हैं। मुझे लगता है कि लाइटनेस बेहतर अकेला छोड़ दिया जाता है, आप छोटे समायोजन करने में सक्षम हो सकते हैं और छवि अभी भी अच्छी दिखती है, लेकिन अगर आप मूल से बहुत दूर जाते हैं तो आप हार्ड किनारों को देख सकते हैं, जहां पृष्ठभूमि पिक्सल के साथ प्रक्रिया पिक्सल सीमा होती है

एक बार जब आप रंगीन एचएसएल पिक्सेल बनाते हैं तो आप इसे आरजीबी में वापस बदल सकते हैं और इसे वापस छवि पर लिख सकते हैं।

आशा है कि ये आपकी मदद करेगा। मुझे एक अंतिम टिप्पणी करना चाहिए कि कोड में ह्यू वेल्यू आमतौर पर 0-255 रेंज में दर्ज किए गए हैं, लेकिन कई एप्लिकेशन उन्हें 0 से 360 डिग्री के एक रंग पहिया के रूप में दिखाते हैं यह याद रखना!

क्या आप सुझाव दे सकते हैं कि आप OpenCV का प्रयोग कर रहे हैं? यह एक खुला स्रोत छवि हेरफेर पुस्तकालय है, और यह एक आईओएस पोर्ट भी मिल गया है इसके बारे में बहुत सारे ब्लॉग पोस्ट हैं कि इसका उपयोग कैसे करें और इसे सेट करें

इसमें कार्यों की एक पूरी ढेर है, जो आपको जो भी प्रयास कर रहे हैं उसका एक अच्छा काम करने में आपकी सहायता करेगा। आप इसे सिर्फ कोर ग्राफिक्स का प्रयोग कर सकते हैं, लेकिन अंतिम परिणाम लगभग उतना ही अच्छा नहीं दिख रहा है जैसा कि ओपनसीवी होगा।

यह एमआईटी में कुछ लोगों द्वारा विकसित किया गया था, ताकि आप यह उम्मीद कर सकें कि किनारे का पता लगाने और ऑब्जेक्ट ट्रैकिंग जैसी चीज़ों में यह बहुत अच्छा काम करता है मुझे ओपनसीवी के साथ तस्वीर से एक निश्चित रंग को अलग करने के बारे में एक ब्लॉग पढ़ना याद है – उदाहरणों में एक बहुत अच्छा परिणाम दिखाया गया है यहाँ एक उदाहरण के लिए देखें वहां से मैं कल्पना नहीं कर सकता कि यह वास्तव में अलग रंग को कुछ और करने के लिए बड़े पैमाने पर काम करेगा।

मैं इसके लिए कोर ग्राफिक ऑपरेशन के बारे में नहीं जानता, और इसके लिए मुझे एक उपयुक्त कोर इमेज फिल्टर नहीं मिला। अगर यह सही है, तो यहां सही दिशा में एक धक्का है:

मान लें कि आपके पास एक CGImage (या एक uiImage.CGImage ) है:

  • एक नया CGBitmapContext बनाकर शुरू करें
  • स्रोत छवि को बिटमैप संदर्भ में खींचें
  • बिटमैप के पिक्सेल डेटा को संभाल लें

जानें कि कैसे बफर संरचित है ताकि आप पिक्सल मूल्यों के 2 डी सरणी को ठीक से पॉप्यूलेट कर सकें, जिनके पास फ़ॉर्म है:

 typedef struct t_pixel { uint8_t r, g, b, a; } t_pixel; 

फिर पता लगाने के लिए रंग बनाएं:

 const t_pixel ColorToLocate = { 0,0,0,255 }; // << black, opaque 

और इसके प्रतिस्थापन मूल्य:

 const t_pixel SubstitutionColor = { 255,255,255,255 }; // << white, opaque 
  • बिटमैप सन्दर्भ के पिक्सेल बफर पर t_pixel , t_pixel बनाते t_pixel
  • जब आप एक पिक्सेल पाते हैं जो रंग से मिलान ColorToLocate , तो स्रोत मानों को SubstitutionColor में मान के साथ बदलें।

  • CGImage से एक नया CGImage बनाएं

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

आप क्या चाहते हैं और अधिक परिष्कृत है इस कार्य के लिए, आप एक अच्छा किनारे का पता लगाने एल्गोरिथ्म चाहते हैं।

मैंने आपके द्वारा लिंक किया हुआ इस ऐप का उपयोग नहीं किया है अगर यह कुछ रंगों तक ही सीमित है, तो वे केवल चैनल मूल्यों को गमागमन कर सकते हैं, किनारे की पहचान के साथ रखा (ध्यान रखें कि बफ़र्स को भी कई रंग मॉडल में प्रदर्शित किया जा सकता है – न कि केवल आरजीबीए)।

यदि (आपके द्वारा लिंक किए गए ऐप में) उपयोगकर्ता एक मनमाना रंग, मूल्य और बढ़त सीमा को चुन सकता है, तो आपको वास्तविक मिश्रण और किनारे का पता लगाने का उपयोग करना होगा। अगर आपको यह देखने की आवश्यकता है कि यह कैसे पूरा हो गया है, तो आप ऐसा पैकेज देख सकते हैं जैसे कि जिम्प (यह एक खुली छवि संपादक) – उनके पास किनारों को पता लगाने और रंग से चुनने के लिए अल्गो है