MTALAB制作动图

13 篇文章 1 订阅

因为动图表现更直观一点,因此想用动图,就学习了一下,以下是学习结果。

1. 情景介绍

(1) 现有2张图片 hua1.jpg(650 x 650 x 3), hua2.jpg(904 x 600 x 3).想以动图(gif)的形式进行展示。
(2) hua1.jpg
在这里插入图片描述

hua2.jpg

在这里插入图片描述

2.代码:

fclose all
clear all
clc


addpath 'D:\gx_GF12\matlab测试'

%读入两幅rgb影像
im1_data_name='C:\Desktop\hua1.png';
im2_data_name='C:\Desktop\hua2.png';
%rgb影像进行2%线性拉伸,适合遥感影像等,可不做拉伸。一般需要对float,single影像进行2%线性拉伸
im1_strech=img_strech(im1_data_name,3);%3表示3通道rgb数据
im2_strech=img_strech(im2_data_name,3);
%两幅影像才见到相同大小
im1=im1_strech(1:500,1:500,:);
im2=im2_strech(1:500,1:500,:);
%影像展示
imshow(im1);
imshow(im2);
%因为gif文件不支持三维数据,需调用rgb2ind将图像数据(im)中的RGB数据转换为索引图像(A)
[im1_ind,map1] = rgb2ind(im1,256); 
[im2_ind,map2] = rgb2ind(im2,256); 

%写成gif文件
dt = 1; %设置两张影像展示间隔时间为2s
imwrite(im1_ind,map1,'D:\test10.gif','gif','LoopCount',Inf,'DelayTime',dt); % 写入第一张影像
imwrite(im2_ind,map2,'D:\test10.gif','gif','WriteMode','append','DelayTime',dt);%写入第二张影像,(此处可写为循环,写多幅影像)

2%线性拉伸的函数:

function img_matrx_new= img_strech(img_file_name,n)

%float,single影像进行2%线性拉伸,到0-255之间。
%输入影像可以是单波段,也可以是RGB,当然也可以是多波段影像

%   streched_image=img_strech(img_filename,band_num)
%   img_filename:表示原始影像的文件名
%   band_num:表示输入影像的波段数目



    img_matrix = imread(img_file_name);



    for i=1:n

        img=img_matrix(:,:,i);
        % 这里默认输入图像为单通道
        [ylen, xlen] = size(img);
    %     fprintf(' ... Img Xlen: %d pixels\n', xlen);
    %     fprintf(' ... Img Ylen: %d pixels\n\n\n', ylen);

        % 线性拉伸
        max_val = max(img(:));

        %img(find(img<=1))=nan;
        min_val = min(img(:));
        % temp_img=img(:);
        % min_val = min(temp_img(find(temp_img~=0)));
        % %b=min(B(find(B~=0)));

    %     fprintf(' ... ... ... ... ... ... ... ... ... ...\n');
    %     fprintf(' ... Min Val is %d \n', min_val);
    %     fprintf(' ... Max Val is %d \n', max_val);
    %     fprintf(' ... ... ... ... ... ... ... ... ... ...\n\n');

        % 统计直方图
        % 输入图像为16位,取值范围为 065535
        bins = 0:65535;
        histcount = histc(img(:)', bins); 
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        histcount(1) =0; %因为自己使用的影像,有很多nodata_value,但是数值为0,所以加这一步骤
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %清除临时变量 
        clear bins max_val min_val; 
        % 直方图裁剪,计算左值和右值 
        [l_val, r_val] = calc_lr_val(histcount, xlen*ylen, 0.02); 
        % 根据左值和右值,将图像由16位映射至8位 
        img_8bit = img_map(img, l_val, r_val); 
        % 保存结果 
        img_matrx_new(:,:,i)=img_8bit;
        %imwrite(img_8bit, 'res_blue.png');

    end

   % return (img_matrx_new);

end
% ------------------------------------
% 计算直方图左右裁剪的灰度值
% 2015/07/01
%
% Input histcount --> 直方图
% tt --> 图像像素个数
% per --> 左右裁剪的百分比
% 
% Output l_val --> 左值
% r_val --> 右值
% ------------------------------------
 
function [l_val, r_val] = calc_lr_val(histcount, tt, per)
 
%     fprintf(' ... ... ... ... ... ... ... ... ...\n');
%     fprintf(' ... CALC LEFT AND RIGHT VALUE \n');
%  
    per_tt = tt*per;  % 按百分比裁剪的像素个数 
 
    % 计算左值
    tmp = 0;
    l_val=0;
    for i = 1:length(histcount)
        tmp = tmp + histcount(i);
        if tmp >= per_tt
            l_val = i;
            break;
        end
    end
    % 计算右值
    tmp = 0;
    r_val=0;
    for i = 1:length(histcount)
        tmp = tmp + histcount(length(histcount)-i+1);
        if tmp >= per_tt
            r_val = length(histcount)-i+1;
            break;
        end
    end
 
%     fprintf(' ... Stretch Percentage is %d%%\n', per*100);
%     fprintf(' ... Left Val is %d \n', l_val);
%     fprintf(' ... Right Val is %d \n', r_val);
%     fprintf(' ... ... ... ... ... ... ... ... ...\n\n');
 
return
% ------------------------------------
% 将图像映射至 [0, 255] 区间
% 2015/07/01
%
% Input img_16bit --> 16位原图像
% l_val --> 映射左值
% r_val --> 映射右值
% 
% Output img_8bit --> 输出8位拉伸后图像
% ------------------------------------
 
function [img_8bit] = img_map(img_16bit, l_val, r_val)
 
    [xlen, ylen, c] = size(img_16bit);
    img_8bit = zeros(xlen, ylen);
 
%     fprintf(' ... ... ... ... ... ... ... ... ...\n');
%     fprintf(' ... IMG MAPPING FROM 16BIT TO 8BIT \n');    
%     fprintf(' ... Img mapping begin ... ... \n');
%  
    % 按照左右值映射
    img_8bit = (img_16bit - l_val).*(255/(r_val-l_val));
    img_8bit = uint8(round(img_8bit));
 
 
%     fprintf(' ... Img mapping finshied !!! !!! \n\n');
%  
return

3.效果展示:

在这里插入图片描述

4. 不用2%线性拉伸的影像进行快速动图制作

fclose all
clear all
clc



files=dir('D:\sift_code\dense_match\ge_jn\files');



del = 0.5; % time between animation frames

for i = 3 : length(files)
  Fig = figure(1);
  temp_name=files(i).name;
  filename =temp_name(4:end-10);
  imshow([files(i).folder,'\',files(i).name]);
  
  title(filename);
  drawnow 

% capture the plot as an image
  frame = getframe(Fig);
  im = frame2im(frame);
  [imind,cm] = rgb2ind(im,256);
  if i == 3
    imwrite(imind,cm,'D:\test.gif','gif','Loopcount',inf,'DelayTime',del);
  else
    imwrite(imind,cm,'D:\test.gif','gif','WriteMode','append','DelayTime',del);
  end
end

4.写gif的函数,及其使用方法

fclose all
clear all
clc


addpath 'D:\gx_GF12\matlab测试'

%读入两幅rgb影像
im1_data_name='H:\ls\ls_1.tif';
im2_data_name='H:\ls\ls_2.tif';

im1=imread(im1_data_name);
im2=imread(im2_data_name);

%影像展示
imshow(im1);
imshow(im2);

%将两张影像进行串联
combinedMatrix = cat(3, im1, im2);
create_gif(combinedMatrix,0,1,'D:\test1.gif',1);

function create_gif(image_data,strech_yes_or_no,band_num_per_image,output_gif_name,delt_time)

% image_data
% strech_yes_or_no ==1, 则对影像进行2%线性拉伸,strech_yes_or_no 设置为其他数字时,不对影像进行拉伸
%band_num_per_image 设定这个影像是单波段影像还是RGB三波段影像
%output_gif_name 设定输出gif的名称 'output_name.gif'
%delt_time  gif图闪动过程中,时间间隔,单位是秒




    image_data_size=size(image_data);
    
    image_num=image_data_size(3)/band_num_per_image;
    
    if band_num_per_image==1
        for i=1:image_num
            temp_data=image_data(:,:,i);
            if strech_yes_or_no==1
                temp_data=img_strech_for_function_above(temp_data,1);
            end
            if i==1
                imwrite(temp_data,output_gif_name,'gif','LoopCount',Inf,'DelayTime',delt_time); % 写入第一张影像
            else
                imwrite(temp_data,output_gif_name,'gif','WriteMode','append','DelayTime',delt_time);%写入第二张影像,(此处可写为循环,写多幅影像)
            end
        end
        
        
    elseif band_num_per_image==3
        for i=1:image_num
            temp_data=image_data(:,:,(i-1)*3+1:i*3);
            if strech_yes_or_no==1
                temp_data=img_strech_for_function_above(temp_data,3);%3表示3通道rgb数据
            end
            
            %因为gif文件不支持三维数据,需调用rgb2ind将图像数据(im)中的RGB数据转换为索引图像(A)
            [temp_data_ind,temp_data_map1] = rgb2ind(temp_data,256); 

            if i==1
                imwrite(temp_data_ind,temp_data_map1,output_gif_name,'gif','LoopCount',Inf,'DelayTime',delt_time); % 写入第一张影像
            else
                imwrite(temp_data_ind,temp_data_map1,output_gif_name,'gif','WriteMode','append','DelayTime',delt_time);%写入第二张影像,(此处可写为循环,写多幅影像)
       
            end
        end
        
        
    end
    
       
  

end


function img_matrx_new= img_strech_for_function_above(img_matrix,n)

%float,single影像进行2%线性拉伸,到0-255之间。
%输入影像可以是单波段,也可以是RGB,当然也可以是多波段影像

%   streched_image=img_strech(img_filename,band_num)
%   img_matrix:影像矩阵
%   band_num:表示输入影像的波段数目



    %img_matrix = imread(img_file_name);



    for i=1:n

        img=img_matrix(:,:,i);
        % 这里默认输入图像为单通道
        [ylen, xlen] = size(img);
    %     fprintf(' ... Img Xlen: %d pixels\n', xlen);
    %     fprintf(' ... Img Ylen: %d pixels\n\n\n', ylen);

        % 线性拉伸
        max_val = max(img(:));

        %img(find(img<=1))=nan;
        min_val = min(img(:));
        % temp_img=img(:);
        % min_val = min(temp_img(find(temp_img~=0)));
        % %b=min(B(find(B~=0)));

    %     fprintf(' ... ... ... ... ... ... ... ... ... ...\n');
    %     fprintf(' ... Min Val is %d \n', min_val);
    %     fprintf(' ... Max Val is %d \n', max_val);
    %     fprintf(' ... ... ... ... ... ... ... ... ... ...\n\n');

        % 统计直方图
        % 输入图像为16位,取值范围为 065535
        bins = 0:65535;
        histcount = histc(img(:)', bins); 
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        histcount(1) =0; %因为自己使用的影像,有很多nodata_value,但是数值为0,所以加这一步骤
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %清除临时变量 
        clear bins max_val min_val; 
        % 直方图裁剪,计算左值和右值 
        [l_val, r_val] = calc_lr_val(histcount, xlen*ylen, 0.02); 
        % 根据左值和右值,将图像由16位映射至8位 
        img_8bit = img_map(img, l_val, r_val); 
        % 保存结果 
        img_matrx_new(:,:,i)=img_8bit;
        %imwrite(img_8bit, 'res_blue.png');

    end

   % return (img_matrx_new);

end


参考文章:
https://blog.csdn.net/xsz591541060/article/details/97641058
https://blog.csdn.net/qq_42145674/article/details/89959689

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好!关于制作动图的暂停间隔,可以使用 Matlab 中的 pause 函数来实现。下面是一个示例代码: for i = 1:10 % 生成图像 img = rand(100,100); imshow(img); % 暂停0.5秒 pause(0.5); end 在上面的代码中,我们使用 for 循环来生成一系列图像,并且在显示每个图像后暂停0.5秒。您可以根据自己的需要修改暂停时间和生成图像的方式。希望对您有帮助! ### 回答2: 在Matlab制作动图时,可以通过设置暂停间隔来控制动图的播放速度。 Matlab中的`pause`函数可以用来实现暂停间隔的设置。`pause`函数的参数是暂停时间,单位是秒。可以通过调整参数来实现不同的暂停间隔。例如,`pause(0.1)`表示暂停0.1秒。 在制作动图时,可以使用循环结构来控制图像的变化,并在每个循环内使用`pause`函数来设置暂停间隔。以下是一个简单示例: ```matlab % 生成数据 x = linspace(0, 2*pi, 100); y = sin(x); % 创建图像对象 figure; % 开始动图制作 for i = 1:length(x) % 清空当前图像 clf; % 画出当前图像 plot(x(1:i), y(1:i), 'r'); % 设置坐标轴范围 xlim([0, 2*pi]); ylim([-1, 1]); % 暂停0.1秒 pause(0.1); end ``` 以上代码首先生成了一组数据x和y,然后创建了一个图像对象。接下来,在循环中逐渐画出数据的子集,并使用`pause`函数来设置暂停间隔,实现动态展示。在每个循环内,先清空当前图像,然后画出当前的图像,再设置坐标轴范围。最后暂停0.1秒,以控制动画的播放速度。 通过调整`pause`函数中的参数,可以改变暂停的时间间隔,从而调整动图的播放速度。 ### 回答3: 在MATLAB制作动图时可以使用`pause`函数来设置动图暂停的间隔时间。`pause`函数接受一个参数,表示暂停的时间,单位为秒。 例如,我们可以使用以下代码制作一个简单的动图并设置每一帧之间暂停1秒钟: ```matlab % 创建一个空图形窗口 figure; % 循环生成动图的每一帧 for i = 1:10 % 在每一帧中绘制不同的图形,这里以绘制正弦波为例 x = linspace(0, 2*pi, 100); y = sin(i*x); plot(x, y); % 暂停1秒钟 pause(1); end ``` 在上述代码中,我们使用`for`循环生成了10帧的动图,每一帧中绘制了不同相位的正弦波。通过使用`pause`函数并指定暂停时间为1秒,就可以控制每一帧之间的暂停间隔。 你可以根据需要自行调整暂停的间隔时间,例如使用`pause(0.5)`表示每一帧之间暂停0.5秒钟。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值