1. 程式人生 > 實用技巧 >python 實現 VOI系統

python 實現 VOI系統

VOI(Virtual Optional Imaging)虛擬光學成像系統:該系統是一個加入隨機模板的單透鏡(設焦距為f)光學成像系統。

 1 import cv2
 2 import numpy as np
 3 from operator import mod
 4 import math
 5 
 6 # 讀取圖片
 7 img = cv2.imread('lena.pgm', cv2.IMREAD_GRAYSCALE) / 255
 8 cv2.namedWindow("lena", cv2.WINDOW_AUTOSIZE)
 9 cv2.imshow("lena", img)
10 print
("原圖:", img) 11 # cv2.waitKey(0) 12 # cv2.destroyAllWindows() 13 14 N = 512 15 m, n = img.shape[0], img.shape[1] 16 lamd = 623*10**(-9) 17 d0 = 0.1 18 d = 0.01 19 f = 0.025 20 di = f * d0 / (d0 - f) # 透鏡成像原理 1/d0 + 1/di = 1/f 21 22 # 進行N*N取樣,根據Shannon取樣定理 23 dx0 = N / m 24 dy0 = N / n 25 dks = lamd * d0 / (N * dx0) 26 dep = lamd * d0 / (N * dy0)
27 dfx = 1 / (N * dx0) 28 dfy = 1 / (N * dy0) 29 30 def encryption(): 31 # 相位因子 32 yinzi_1 = np.zeros((N, N), dtype=complex) 33 for k in range(N): 34 for l in range(N): 35 yinzi_1[k][l] = np.exp(1j * math.pi * ((k * dx0) ** 2 + (l * dy0) ** 2) / (lamd * d0)) 36 # 明文資訊進行離散菲涅爾變換
37 U0 = np.fft.fft2(img * yinzi_1) 38 # print("U0:", U0) 39 40 # 隨機模板 41 R = np.random.randn(N, N) 42 R = np.exp(1j * R) 43 # print("隨機模板", R) 44 yinzi_2 = np.zeros((N, N), dtype=complex) 45 for k in range(N): 46 for l in range(N): 47 yinzi_2[k][l] = np.exp(1j * math.pi * ((k * dx0) ** 2 + (l * dy0) ** 2) / (lamd * d)) 48 # 隨記模板進行離散菲涅爾變換 49 UM = np.fft.fft2(R * yinzi_2) 50 51 # 透鏡透過率函式 52 t = np.zeros((N, N), dtype=complex) 53 for m in range(N): 54 for n in range(N): 55 t[m][n] = np.exp((-1j) * math.pi * ((m * dks)**2 + (n * dep)**2) / (lamd * f)) 56 57 # 透鏡前表面轉換到透鏡後表明經過透鏡透過率函式的調製 58 UL2 = (U0 + UM) * t 59 UL2_s = np.abs(UL2) / np.max(np.abs(UL2)) # 歸一化 60 print("加密影象:", UL2) 61 cv2.namedWindow("miwen", cv2.WINDOW_AUTOSIZE) 62 cv2.imshow("miwen", UL2_s) 63 # cv2.waitKey(0) 64 # cv2.destroyAllWindows() 65 66 return UL2, UM, t 67 68 def dencryption(UL2, UM, t): 69 # 解密時,從密文中減去隨機模板在透鏡後表面的復振幅分佈 70 U0_ = UL2 - UM * t 71 yinzi_3 = np.zeros((N, N), dtype=complex) 72 for m in range(N): 73 for n in range(N): 74 yinzi_3[m][n] = np.exp(1j * math.pi * ((m * dks)**2 + (n * dep)**2) / (lamd * di)) 75 # 透鏡後表明資訊進行離散菲涅爾變換 76 U0_1 = np.fft.fft2(U0_ * yinzi_3) 77 U0_s = np.abs(U0_1) / np.max(np.abs(U0_1)) # 歸一化 78 79 print("原圖:", U0_s) 80 cv2.namedWindow("origin", cv2.WINDOW_AUTOSIZE) 81 cv2.imshow("origin", U0_s) 82 cv2.waitKey(0) 83 cv2.destroyAllWindows() 84 85 # U0_2 = np.fft.ifft2(U0_) 86 # U0_s2 = np.abs(U0_2) / np.max(np.abs(U0_2)) 87 # print("原圖2:", U0_s2) 88 # cv2.namedWindow("origin2", cv2.WINDOW_AUTOSIZE) 89 # cv2.imshow("origin2", U0_s2) 90 # cv2.waitKey(0) 91 # cv2.destroyAllWindows() 92 93 94 if __name__ == '__main__': 95 UL2, UM, t = encryption() 96 dencryption(UL2, UM, t)

結果為