huangheguiguan 2023-07-17 17:22 采纳率: 41.2%
浏览 71
已结题

Matlab如何把100*100个随机点图案变为100*100像素值图案

我用matlab产生了100100个随机点图案(如图,其中有若干亮点),现在我想要每一个点对应一个像素,输出为100100像素的图案。(因为我要用Gerchberg-Saxton算法恢复相位,每一个像素对应一个相位值,需要100100个相位,所以像素值也需要100100)。

img


程序:

clear
clc
N=101;                                       %101为光屏的范围,即Figure中-50到50
lda=633e-9;dx=300e-9;                        %波长及单元结构中心间隔
x0=(-N/2+1/2)*dx:dx:(N/2-1/2)*dx;y0=x0;      %超表面位置坐标,即x0=(最小值:间隔:最大值)
x1sin=linspace(-1/dx/2,1/dx/2,N)*lda;y1sin=x1sin;
% 对应论文中公式5-5和5-6,linspace(a,b,N)表示生成N个等间隔点,这些点的间距为(b-a)/(N-1),即横向空间频率;
% x1sin与y1sin用于计算衍射角,即矢量与面yoz、xoz夹角
[xx1sin,yy1sin]=meshgrid(x1sin,y1sin);
% 基于向量x1sin和向量y1xin中包含的坐标返回二维网络坐标;
% 即形成一个length(x1sin)和length(y1sin)的方形网格坐标。 
trans=find((xx1sin.^2+yy1sin.^2)<1);         %寻找行波
xx1_k=xx1sin(trans);yy1_k=yy1sin(trans);     %求出行波对应的横向空间频率
kz=sqrt(1-xx1_k.^2-yy1_k.^2);                %求出行波对应的横向空间频率(与z轴) 
tic                                          %计时开始
r=zeros(N);k=0;ks=0;
% 创建一个NxN全0矩阵,k为设置为亮的衍射级次的个数(实时随机点数),ks(可能)为统计的循环次数(没啥意义) 

Nb=2022;%目标随机点数(圆圈内的),即行波中目标衍射级次的数量



while k<Nb     %产生随机点
s1=unidrnd(N);   %产生一组从1到N的随机数,相当于论文中mx
s2=unidrnd(N);   %相当于论文中my

        if (xx1sin(s1,s2).^2+yy1sin(s1,s2).^2)<1  %找出行波

        r(s1,s2)=1;r(N+1-s1,N+1-s2)=1;   %将衍射级次设置为亮,且满足中心对称性
        k=sum(r(:));    %统计设置为亮的衍射级次的个数,相当于论文中nb
        end
    ks=ks+1;
    
end
toc    %计时结束
k   %在命令行窗口输出k值
ks  %在命令行窗口输出ks值
rs=r(trans);

for i=1:101
    for j=1:101
        E2(5*i-4:5*i,5*j-4:5*j)=r(i,j);

    end
end
figure(1),imagesc(linspace(-50,50,505),linspace(-50,50,505),E2);
% 绘制结果图
% imagesc(x,y,C)指定图像位置,使用x和y可指定与C(1,1)和C(m,n)对应的边角的位置。
axis square   %将当前坐标系图形设置为方形
axis([-50,50,-50,50])   %设置坐标刻度范围

wordsize=20;    %x,y轴文本字体大小为20  
xlabel('Orders in x direction','fontsize',wordsize) %x轴说明
ylabel('Orders in y direction','fontsize',wordsize) %y轴说明

set(gca,'FontSize',20);   %设置x,y轴上数字字体尺寸为20磅
colormap(gray)        %设置图像的颜色为灰度渐进
saveas(gcf,'picture.png');

这是我要用的GS算法

clear all
I=imread('Picture.png');
image=double(I(:,:,1));% 将目标图像读进来
[M,N]=size(image);
phase=zeros(N); 
A=fftshift(fft2(fftshift(image)));
% 先对带有线段的图像进行傅里叶变换

Source=ones(N);% 假设入射的为平面光
for n=1:200 %这个for语句里就是GS方法的步骤
    B=Source.*exp(i*angle(A));
    C=fftshift(fft2(fftshift(B)));
    C=rot90(rot90(C));
    D=image.*exp(i*angle(C) );
    A=fftshift(fft2(fftshift(D)));
end

holo=angle(A);% 这个holo就是超表面所需要的相位

% 下面是再现步骤
Amp=abs(A)/max(max(abs(A)));
E=fftshift(fft2(fftshift(exp(i*holo))));
E=rot90(rot90(E));
Recon=abs(E).^2;

figure(2),imagesc(Recon);colormap(hot);axis equal;axis tight;title('模拟全息图');   %输出全息图
figure(3),imagesc(holo);colormap(hot);title('相位分布图');      %输出相位分布图

```

  • 写回答

8条回答 默认 最新

  • Minuw 2023-07-17 17:27
    关注
    % 将图案转换为像素值图案
    img = imwrite(points, 'jpg', 'Quality', 100);
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月18日
  • 修改了问题 7月17日
  • 创建了问题 7月17日

悬赏问题

  • ¥15 有关类的报错,在模块里调用另一个模块的方法下的变量时出错
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格
  • ¥15 kali linux用wget archive.kali.org/archive-key.asc指令下载签名无效(失败)
  • ¥15 openHarmony 利用c++程序在dayu210开发板上实现拉取RTSP视频流并且在屏幕上显示
  • ¥15 GD32H757的can通信配置
  • ¥20 nist随机数测试的问题
  • ¥20 帮我解决这个项目,thank you各位程序员
  • ¥15 哪位能用ea软件做一下,有偿