संदर्भ: इमेज: XOR पहले और दूसरे, दिल के आकार का पिक्सेल बनाने के लिए कला

मैं एक विजुअल वन-टाइम-पैड प्रोग्राम बना रहा हूं जो इनपुट बिटमैप को बिट्स की दो अलग-अलग यादृच्छिक सूचियों में विभाजित करता है, जब एक्सओआर-एड एक साथ, इनपुट बिटमैप को पुन: पेश करना चाहिए - एक "रिवर्स-रिवर्स-इंजीनियरिंग"।

अत्यधिक सरलीकृत स्पष्टीकरण के रूप में, प्रत्येक नव-निर्मित बिटमैप 2 स्वतंत्र प्राप्तकर्ताओं को दिया जाता है। वे एक-दूसरे पर भरोसा कर सकते हैं यदि उनका एक निर्दिष्ट आकार बनाने के लिए गठबंधन होता है (नीचे देखें)।

ऊपर मेरे उदाहरण में, पिक्सेल इनपुट - और अंतिम आउटपुट - बीच में एक दिल का आकार बनाते हैं।


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

input_pixels = [[0,0, ... 0], [0,0, ... 0], ... , [0,1, ... 1,0]]  ## I've shortened here

bitmap1 = []
bitmap2 = []

for row in input_pixels:
    temp1 = []
    temp2 = []

    for bit in row:
        ## 'Case A' when a bit in input_pixels is 0
        if bit == 0:
            randbit = random.choice((0, 1))
            temp1.append(randbit)
            if randbit == 1:
                temp2.append(1)
            else:
                temp2.append(0)

        ## 'Case B' when a bit in input_pixels is 1
        else:
            randbit = random.choice((0, 1))
            temp1.append(randbit)
            if randbit == 1:
                temp2.append(0)
            else:
                temp2.append(1)

    bitmap1.append(temp1)
    bitmap2.append(temp2)

हालांकि, अगर इनपुट में दिल के आकार के अलावा अन्य क्षेत्रों में 1s शामिल है, तो मेरा कोड स्पष्ट रूप से वांछित परिणाम नहीं देगा, क्योंकि सशर्त "आकृतियों" के बीच भेदभाव नहीं करते हैं जैसा कि हम उन्हें समझते हैं।


प्रश्न: मैं अपने निर्दिष्ट आकार के बिट्स को संभावित रूप से पहचानने के लिए कोड कैसे बदल सकता हूं, और ऐसे संबंधित भागों पर केवल 'केस बी' लागू कर सकता हूं? मैं रेगेक्स से बहुत परिचित नहीं हूं, लेकिन क्या यह शायद इन किनारे के मामलों को हल करेगा?

संपादित करें (स्पष्टीकरण):

मेरा कोड तब विफल हो जाता है जब उदाहरण के लिए: छवि: यदि 1s गैर-दिल के आकार वाले स्थानों पर बस शोर जोड़ने के लिए हालांकि मैं इनपुट चुन सकता हूं ताकि केवल दिल == 1 (ऊपर 'बाइनरी रेप्र' लेबल वाली छवि की तरह), ऐसे मामलों में उपयोगकर्ता तुरंत एक्सओआर-आईएनजी का सहारा लिए बिना देख सकते हैं कि उन्हें प्राप्त बिटमैप होगा एक दिल बनाओ - जिससे मैं बचना चाहूंगा। इसलिए, मुझे किसी भी तरह से 'केस बी' को बस वांछित 'निर्दिष्ट' क्षेत्र, दिल, किसी भी शोर इनपुट के लिए लागू करने की आवश्यकता है।

0
user12205627 29 पद 2019, 22:26

1 उत्तर

सबसे बढ़िया उत्तर

मुझे नहीं पता कि आप दिल के चारों ओर यादृच्छिक शोर क्यों चाहेंगे, लेकिन केवल temp2.append(random.choice((0, 1)) के मूल्य से स्वतंत्र randbit का उपयोग करना होगा (मामले ए के लिए विशेष रूप से, यदि 0 का अर्थ सफेद है और दिल काला है)।

दो यादृच्छिक बिट्स XOR'ed एक साथ अभी भी एक यादृच्छिक बिट मान उत्पन्न करते हैं, आखिरकार।

0
Maarten Bodewes 31 पद 2019, 00:04