लगभग सभी डिजिटल कैमरा सेंसर फोटो सेंसर की एक ग्रिड में आयोजित किए जाते हैं। प्रत्येक फोटो सेंसर प्राथमिक रंगों में से एक के लिए संवेदनशील है : लाल, हरा और नीला। जिस तरह से उन फोटो सेंसर को व्यवस्थित किया जाता है , उसके आविष्कारक, ईस्टमैन कोडक के ब्रायस बेयर को बायर फिल्टर कहा जाता है । एक छवि लेने के बाद, चार फोटो सेंसर परिणामी छवि में एक पिक्सेल के आरजीबी मूल्य की रचना करते हैं। आपका कार्य उस प्रक्रिया को उल्टा करना है और परिणामी पिक्सेल को उनके फ़िल्टर रंग के अनुसार बदलना है। सादगी के लिए, हम गामा सुधार की उपेक्षा करेंगे ।
उदाहरण के लिए: "सामान्य" आगे बायर फ़िल्टर चरण हैं:
- पैनटोन के साथ एक लाइटवेट बीज़वैक्स कलर सेंसर को हिट करता है;
- बीजीजीआर (ब्लू - ग्रीन / ग्रीन - रेड) फिल्टर इसे चार किरणों में विघटित करता है।
- चार किरणें सेंसर से टकराती हैं, जो पढ़ती है: 81 - 168/168 - 235 (सेंसर मान 0 से 255 सीमा तक);
- बायर फ़िल्टर रंग (235, 168, 81) के साथ एक RGB पिक्सेल में इसका अनुवाद करता है।
रिवर्स बायर फ़िल्टर चरण हैं:
- आरजीबी पिक्सेल रंग के साथ (235, 168, 81) आरजीबी मूल्यों के साथ चार पिक्सेल में विभाजित है: (0,0,81) - (0,168,0) / (0,168,0) - (235,0,0)।
चुनौती
आपको सबसे कम संभव फ़ंक्शन या प्रोग्राम लिखना चाहिए जो निम्न कार्य करता है:
- इनपुट के रूप में फ़ाइल नाम लें और DeBayered छवि को आउटपुट करें।
- आउटपुट को फ़ाइल में लिखा जा सकता है या स्क्रीन पर प्रदर्शित किया जा सकता है।
- आउटपुट दो बार चौड़ाई और मूल छवि की ऊंचाई से दोगुना होना चाहिए।
बीजीजीआर (ब्लू - ग्रीन / ग्रीन - रेड) बायर फिल्टर पैटर्न के अनुसार इनपुट छवि के प्रत्येक पिक्सेल को मैप किया जाना चाहिए जैसा कि निम्नलिखित चित्र में बताया गया है:
हम मान लेंगे कि दोनों हरे रंग के फोटो सेंसर एक ही संकेत प्राप्त करते हैं, इसलिए बायर मैट्रिक्स में दोनों G मान RGB छवि में G मान के बराबर हैं।
- आप परिणामी छवि का एक सरणी प्रतिनिधित्व नहीं लौटा सकते हैं । आउटपुट एक छवि या एक फ़ाइल ( किसी भी उपयुक्त छवि प्रारूप में ) होनी चाहिए जिसे छवि के रूप में प्रदर्शित किया जा सकता है।
उदाहरण
इस फाइल को इनपुट के रूप में दिया गया है:
परिणामी छवि होनी चाहिए:
संदर्भ अजगर कार्यान्वयन:
from PIL import Image
import numpy
import sys
if len(sys.argv) == 1:
print "Usage: python DeByer.py <<image_filename>>"
sys.exit()
# Open image and put it in a numpy array
srcArray = numpy.array(Image.open(sys.argv[1]), dtype=numpy.uint8)
w, h, _ = srcArray.shape
# Create target array, twice the size of the original image
resArray = numpy.zeros((2*w, 2*h, 3), dtype=numpy.uint8)
# Map the RGB values in the original picture according to the BGGR pattern#
# Blue
resArray[::2, ::2, 2] = srcArray[:, :, 2]
# Green (top row of the Bayer matrix)
resArray[1::2, ::2, 1] = srcArray[:, :, 1]
# Green (bottom row of the Bayer matrix)
resArray[::2, 1::2, 1] = srcArray[:, :, 1]
# Red
resArray[1::2, 1::2, 0] = srcArray[:, :, 0]
# Save the imgage
Image.fromarray(resArray, "RGB").save("output.png")
याद रखें: यह एक है कोड गोल्फ, इसलिए सबसे छोटा कोड जीतता है!
BG
शीर्ष पंक्ति और GR
तल पर के साथ एक सेल दिखाते हैं , जबकि उदाहरण छवि RG
शीर्ष और GB
तल पर दिखाई देती है। क्या इसका मतलब यह है कि एक विकर्ण पर दो हरी कोशिकाओं को डालने वाली कोई भी व्यवस्था स्वीकार्य है? (अन्य जीबी / आरजी और जीआर / बीजी होंगे।)