题目1
根据你学过的衍射受限系统成像的计算方法,以自己的图像作为输入IinputI_{input}Iinput,模拟计算出经过衍射受限系统后的输出图像IimageI_{image}Iimage
衍射受限系统表达如下:
Iimage=Iinput⊗PSF
I_{image} = I_{input} \otimes PSF
Iimage=Iinput⊗PSF
解答该题或理解衍射受限系统需要明白两个知识点:
-
⊗\otimes⊗ 表示什么运算;
-
PSF表示什么东西;
⊗\otimes⊗ 表示什么运算–>⊗\otimes⊗ 可以理解为卷积操作,即有一个卷积核并使用该卷积核处理输入图像后得输出图像
PSF(point spread function),点扩散函数。描述了成像系统对点源或点对象的响应。–>将这个理解为和卷积核相似得矩阵即可
其matlab实现代码如下所示:
主函数main.m
% 2024.08.05
% StarsZong
% main函数
clear, clc;
close all;
img = imread("lenna.jpg");
img_gray = rgb2gray(img);
%产生PSF掩模--> 这里使用圆孔夫琅禾费衍射的光强分布
lambda=500e-9; % 表示的光的波长(红光)
r=5e-4; % 孔的大小
z=2; % 光源到孔的距离
k = 255;
I = F(lambda, r, z, k);
img_out = imfilter(double(img_gray), I);
img_out1 = img_out ./ max(max(img_out));
img_out1 = uint8(255 * img_out1);
figure;
imshow([img_gray, img_out1]);
PSF功能函数代码F.m(ps:函数名和文件名需要保持一致)
% 2024.08.05
% StarsZong
% 功能函数:用于产生圆孔弗朗禾费衍射光强的掩模
% input:光的波长lambda;小孔半径r;光源到孔的距离z;掩模版的大小k(仅为奇数)
function I = F(lambda, r, z, k)
N = 1e-2;
[x, y] = meshgrid(linspace(-N, N, k));
I_0 = ((pi * r.^2) / (lambda * z)).^2;
s = 2 * pi * r * sqrt(x.^2+y.^2) ./ (lambda * z);
I = 4 * I_0 * (besselj(1,s) ./ (s+eps)).^2;
A = max(max(I));
for i = 1: length(x)
for j = 1: length(y)
if I(i, j) == 0
I(i, j) = A;
end
end
end
I = 255 * I ./ max(max(I));
end
代码相关:
imread --> 读取图像
rgb2gray --> 将rgb彩色图转为灰度图
imfilter --> 将原图和卷积核输入,输出卷积操作后的图像
imshow --> 展示图象
meshfird --> 将一维数据关联为二维数据
besselj --> 贝塞尔函数
还有问题可在matlab内通过:"help 函数名" 进行函数查看
结果展示:
原图
PSF结果图
图像处理结果(左侧为原图灰度图,右侧为处理后图像)
注:
1,如果PSF现象不明显或图像处理结果不明显可尝试改变掩模版的大小(k)
2,该题仅要求使用PSF实现图像卷积处理,选择一种点扩散函数模型即可,如果有其他需求可自行更改点扩散函数(夫琅禾费矩孔衍射,夫琅禾费圆孔衍射,夫琅禾费正弦振幅光栅衍射,夫琅禾费正弦相位衍射,菲涅尔圆孔衍射,菲涅尔直边衍射)
3,本博客主要针对衍射受限系统成像,而非点扩散函数的原理,原理部分可自己翻阅《现代光学》课本进行学习