因为动图表现更直观一点,因此想用动图,就学习了一下,以下是学习结果。
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位,取值范围为 0 到 65535
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位,取值范围为 0 到 65535
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