基於混沌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圖像經加密處理后多多少少還是能看到一點原圖像的輪廓,在做數字水印處理時推薦使用灰度圖像

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM