1. 程式人生 > 其它 >基於混沌Logistic加密演算法的圖片加密與還原(python)

基於混沌Logistic加密演算法的圖片加密與還原(python)

主要參考【影象加密】影象處理之Logistic混沌序列加密 這篇部落格,並將其中的matlab程式碼改成了python程式碼。

還原部分是在加密部分的基礎上重複一次異或處理,所以只需再次使用加密函式(將圖片路徑改成加密後的影象)即可。

import cv2
import numpy as np
from PIL import Image

def logistic(Img, x, u,times):
    M = Img.shape[0]
    N = Img.shape[1]
    for i in range(1, times):
        x = u * x * (1 - x)
    array 
= np.zeros(M * N) array[1] = x for i in range(1, M * N - 1): array[i + 1] = u * array[i] * (1 - array[i]) array = np.array(array * 255, dtype='uint8') code = np.reshape(array, (M, N)) xor = Img ^ code v = xor return v # 0<x<1 x = 0.1 # 3.5699456...<u<=4
u = 4 times = 500 Img = cv2.imread('C:\\Users\\lena.bmp') Img = Img[:, :, [2, 1, 0]] (r, g, b) = cv2.split(Img) R = logistic(r, x, u, times) G = logistic(g, x, u, times) B = logistic(b, x, u, times) merged = np.ones(Img.shape, dtype=np.uint8) merged[:, :, 2] = B merged[:, :, 1] = G merged[:, :, 0] = R Img
= Image.fromarray(merged) Img.save('C:\\Users\\lena0.bmp')

RGB各通道可以分別選用不同的引數,增大破解難度。

結果示例

原圖(512*512 .bmp格式)

 加密後

 灰度圖加密後

 在對灰度影象進行同樣的處理後,不難發現RGB影象經加密處理後多多少少還是能看到一點原影象的輪廓,在做數字水印處理時推薦使用灰度影象