Codifique la información de la cadena en inglés en la imagen y decodifique la información

Primero, defina algunas funciones importantes

1. Función de codificación: codifique un párrafo en un número binario y guárdelo en la lista. Devuelve una lista de números binarios y el número de filas en esta lista y el número de columnas correspondientes a cada fila.

def encode(s):      #编码函数
    n=len(s)
    l=list()       #编码数组
    num=list()
    k=0      #记录数组中字符的个数
    for i in range(n):
        l.append([])
        num.append(len(s[i]))
        for j in range(len(s[i])):
            l[i].append(bin(ord(s[i][j])).replace('0b',''))
    return l,num

2. Función de decodificación: decodifica la lista de números binarios almacenados en un párrafo. Devuelve la cadena decodificada.

def decode(l):      #解码函数
    s=list()
    for i in range(len(l)):
        s.append([])
        s[i]=''.join(chr(k) for k in [int(j,2) for j in l[i]])
    return s

3. Función de ocultación de información: Dada una imagen y una lista de números binarios, almacene cada número binario en la lista de números binarios en el último dígito del número binario correspondiente al píxel de la imagen. Un píxel puede almacenar 3 bits y un 7 número de bits. Binary necesita 3 píxeles para almacenar. Devuelve la imagen con información oculta.

def hide(pic,en):      #将已解码的字符串中的信息隐藏进图片
    pic=Image.open(pic).convert('RGB')      #将4通道RGBA像素转化为3通道RGB像素
    np=numpy.array(pic)
    long,width,dim=np.shape
    pic_array=np
    m=0      #记录赋值次数
    for i in range(len(en)):
        for j in range(len(en[i])*3):
            for k in range(dim):
                s=bin(pic_array[i][j][k]).replace('0b','')
                pic_array[i][j][k]=int(s[:-2]+en[i][j//3][m])
                m=(m+1)%7
                if m==0:
                    break
    pic.close()
    return Image.fromarray(pic_array)

4.Función de extracción de información: para una imagen y una lista de cadenas de registro, extraiga el último bit del número binario correspondiente al píxel en la posición especificada y empalme en un número binario completo de acuerdo con la información registrada., Devuelve el información decodificada de la lista de números binarios.

def extract(pic,num):
    l=list()
    np=numpy.array(pic)
    m=0
    for i in range(len(num)):
        l.append([])
        for j in range(num[i]*3):
            if j%3==0:
                l[i].append([])
            for k in range(3):      #dim=3
                s=bin(np[i][j][k]).replace('0b','')
                l[i][j//3]+=s[-1:]
                m=(m+1)%7
                if m == 0:
                    l[i][j//3]=''.join(l[i][j//3])
                    break
    return decode(l)

 

 

Con las funciones anteriores, básicamente se ha solucionado este problema, la parte interactiva del programa:

sentence=list(map(str,input('请输入一个句子:').split()))
en,num=encode(sentence)
print('编码后的字符串为:',en,num)
pic=hide('tree',en)
pic.show('隐藏信息的图片:')
print(' '.join(extract(pic,num)))

ingresar:

unknown person loves cs

Producción:

请输入一个句子:unkonwn person loves cs
编码后的字符串为: [['1110101', '1101110', '1101011', '1101111', '1101110', '1110111', '1101110'], ['1110000', '1100101', '1110010', '1110011', '1101111', '1101110'], ['1101100', '1101111', '1110110', '1100101', '1110011'], ['1100011', '1110011']] [7, 6, 5, 2]
unkonwn person loves cs

 

Supongo que te gusta

Origin blog.csdn.net/jccc39/article/details/106188173
Recomendado
Clasificación