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('相位分布图');      %输出相位分布图

```

% 将图案转换为像素值图案
img = imwrite(points, 'jpg', 'Quality', 100);

要将100100个随机点图案转换为100100像素的图案,你可以按照以下步骤进行处理:

创建一个100100像素的黑色图像,这将是你的输出图案。

将随机点图案中的每个点的位置和亮度信息映射到输出图像中对应的像素位置和像素值上。

将输出图像保存为Matlab中的图像文件格式,如PNG或JPEG,以便您后续使用Gerchberg-Saxton算法进行相位恢复。

下面是一个示例代码,假设你的随机点图案是一个Nx2的矩阵random_points,其中第一列是点的x坐标,第二列是点的y坐标。输出图像的大小为output_size,这里设为1000x1000。

% 假设你已经有了一个Nx2的矩阵random_points,其中存储了N个随机点的坐标
% 例如,random_points = rand(N, 2); % 随机生成N个点,每个点的x坐标和y坐标在0到1之间

% 输出图像的大小
output_size = 1000;

% 创建一个1000x1000的黑色图像
output_image = zeros(output_size);

% 将随机点图案映射到输出图像
num_points = size(random_points, 1);
for i = 1:num_points
    x = round(random_points(i, 1) * (output_size - 1)) + 1;
    y = round(random_points(i, 2) * (output_size - 1)) + 1;
    % 将点的亮度值映射到像素值上,这里假设亮度值是在0到255之间的整数
    brightness = randi([0, 255]);
    output_image(y, x) = brightness;
end

% 将输出图像保存为图像文件,例如PNG格式
imwrite(uint8(output_image), 'output_image.png');

% 输出图像保存完毕,你可以继续使用Gerchberg-Saxton算法进行相位恢复。


基于new bing部分指引作答:
要将100x100个随机点图案转换为100x100像素值图案,你可以使用以下代码:

% 将随机点图案转换为像素值图案
pixel_image = zeros(100, 100); % 创建一个100x100的全零矩阵作为像素图像

% 遍历每个随机点的坐标
for i = 1:100
    for j = 1:100
        if r(i, j) == 1 % 如果随机点亮了
            % 将相应像素位置的像素值设置为非零值(例如,255表示白色)
            pixel_image(i, j) = 255;
        end
    end
end

% 显示像素图像
figure;
imshow(pixel_image);

此代码将随机点图案r转换为像素值图案pixel_image。它遍历随机点图案的每个点,如果该点为亮(值为1),则将相应像素图像位置的像素值设置为非零值。然后,使用imshow函数显示生成的像素图像。
这只是一个示例,你需要将其与你的代码进行集成以生成正确的像素图像。此外,你可能需要调整将像素值设置为非零值的部分,具体取决于你的需求和所选择的颜色映射。

在Matlab中,你可以使用rand函数生成100*100个随机点,然后使用imshow函数将这些随机点显示为图像。下面是一个简单的例子:

% 生成100*100个随机点
random_points = rand(100, 100);

% 将随机点转换为像素值

pixel_values = uint8(255 * random_points);

% 显示图像
imshow(pixel_values);


在这个例子中,rand(100, 100)生成了一个100*100的矩阵,其中的每个元素都是0到1之间的随机数。然后,uint8(255 * random_points)将这些随机数转换为0到255之间的整数,这些整数可以表示像素的灰度值。最后,imshow(pixel_values)将这些像素值显示为图像。

请注意,这个例子生成的是灰度图像。如果你想生成彩色图像,你需要生成一个1001003的矩阵,其中的每个元素都是0到1之间的随机数,然后将这些随机数转换为0到255之间的整数。这个1001003的矩阵的每个元素表示像素的红、绿、蓝三个通道的值。

100×100像素,100×100个点,每个像素对应一个点,那么空白区域怎么表示呢?

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/lda)^2);  %对应论文中过公式5-5和5-6的筛选

pixels = zeros(N, N);
pixels(trans) = 255;   %亮点对应的像素值设为255,其余为0

% 将像素值图案输出
imwrite(uint8(pixels), 'pixel_image.png');

运行以上代码后, 将会生成一个100x100的像素值图案,保存在当前目录下的"pixel_image.png"文件中。请注意,像素值图案会丢失一些细节信息,因为它只包含了亮点的位置信息。

算法本身就有报错呀

解决方案:imwrite(r,'r.bmp','bmp');将矩阵存为图片。