首页 > 编程语言 > 详细

python 实现 VOI系统

时间:2020-12-14 18:42:20      阅读:32      评论:0      收藏:0      [点我收藏+]

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)

结果为

技术分享图片

 

python 实现 VOI系统

原文:https://www.cnblogs.com/myblog-wll/p/14133601.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!