如何仅对列表中的指定位进行异或

问题描述 投票:3回答:1

上下文: Image: XOR first and second, to form heart-shaped pixel art

我正在创建一个可视的一次性键盘程序,该程序将输入位图分为两个不同的随机位列表,将它们进行异或运算后,应再现输入位图-一种“反向-反向工程”。

作为高度简化的解释,每个新创建的位图都分配给2个独立的收件人。如果它们组合在一起以形成指定的形状,它们可能会彼此信任(请参阅下文)。

在上面的示例中,像素输入-最终输出-在中间形成一个心形。


Attempt:最初,我的代码成功地将适当的位分配给了两个单独的列表,具体取决于输入位是零还是1。 (包括随机性是因为我希望每次都使用不同的输出。)当输入仅在白色背景上仅显示黑色(即1s的字符串)心时,这一切都很好:Image: binary representation

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)

但是,如果输入在心形以外的区域中包含1,那么我的代码显然不会产生预期的结果,因为条件在我们所感知的“形”之间没有区别。


问题:如何更改代码以可能识别出我指定形状的位,并且仅将“情况B”应用于此类对应部分?我对正则表达式不是很熟悉,但是也许可以解决这些极端情况吗?

编辑(澄清):

我的代码在例如Image: If the 1s occupy non-heart-shaped locations just to add noise时失败尽管我可以选择输入,以便只有heart == 1(如上面标记为“二进制代表”的图像),但在这种情况下,用户可以立即看到,而不必求异或,他们收到的位图将形成一颗心-我想避免。因此,考虑到任何嘈杂的输入,我需要以某种方式将“案例B”应用于just所需的“指定”区域(心脏)。

[上下文:图像:首先和第二次异或,以形成心形像素艺术,我正在创建一个可视的一次性填充程序,该程序将输入位图分为两个不同的随机位列表,当进行XOR -...时] >

python bitmap cryptography pattern-matching xor
1个回答
0
投票

[我不知道您为什么想要心脏周围的随机噪声,但是仅使用temp2.append(random.choice((0, 1))而不依赖randbit的值就可以做到(对于唯一的情况A,如果0表示白色而心脏是黑色的话) )。

毕竟,两个异或在一起仍然会产生一个随机位值。

© www.soinside.com 2019 - 2024. All rights reserved.