【问题标题】:How to implement Binary Symmetric Channel in Python correctly?如何在 Python 中正确实现二进制对称通道?
【发布时间】:2018-03-22 15:20:58
【问题描述】:

基本上我想实现 BSC。一张照片变成了比特,其中一些被改变了,一个新的图像被创建了。我遇到的问题是我得到了相同的图像。我已经放了一些 print() 语句来查看 error() 是否有效,并且看起来确实有效。这是我的代码:

import numpy as np
import random as rand

# Seed

rand.seed(4)

# Filenames
in_name = 'in_img.png'
out_name = 'out_img.png'

# Into bits
in_bytes = np.fromfile(in_name, dtype="uint8")
in_bits = np.unpackbits(in_bytes)
data = list(in_bits)



# BSC

def error(x):
    p = 0.1
    is_wrong = rand.random() < p
    if is_wrong:
        if x == 1:
            return 0
        else:
            return 1
    else:
        return x


for i in data:
    i = error(i)

# To PNG
out_bits = np.array(data)
out_bytes = np.packbits(out_bits)
out_bytes.tofile(out_name)

【问题讨论】:

标签: python numpy


【解决方案1】:

正如 kazemakase 在评论中指出的那样,虽然您的代码中的问题似乎是重复的,但您的代码首先不应该使用这样的循环和 Python list。对于numpy,通常会尝试将尽可能多的循环推送到 numpy 数据类型中。

import numpy as np


def main():
    np.random.seed(4)

    in_name = 'in_img.png'
    out_name = 'out_img.png'

    bits = np.unpackbits(np.fromfile(in_name, np.uint8))
    bits ^= np.random.random(bits.shape) < 0.1
    np.packbits(bits).tofile(out_name)


if __name__ == '__main__':
    main()

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多