这篇文章主要为大家展示了“怎么用MATLAB做一个完美的照片墙”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用MATLAB做一个完美的照片墙”这篇文章吧。
-- 原理 --
其实,如果前面分割图片的原理理解了的话,本期中拼接图片的原理不用说也能想的到。
照片墙不就是一个由许多小图片构成的大图片么,也就是说照片墙实际上就是由许多小矩阵构成的大矩阵。豁然开朗了把,只要用循环把这些矩阵拼接起来就能实现。(不过值得注意的是,一般都是rgb图像,如果直接以原来的尺寸拼接,会出现矩阵太大,MATLAB就直接不干了,所以如果图片比较多的话需要先采用imresize函数缩小一下)
-- 源码 --
clc
clear
close all
warning off
%% 我把保存图片的文件夹temp移到当前路径下了,里面有16张图片
Pics = struct2cell(dir('temp \*jpg'));%读取文件夹中的图片
Pics = Pics(1,:);%获取图片名
OnePic = imread(['temp\' Pics{1}]);%读入第一张图片
OnePic = imresize(OnePic,0.5);%原图比较大,合成成照片墙后,照片墙太大,所以缩小一下
m = size(OnePic,1);%获取第一张图片的像素行数
n = size(OnePic,2);%获取第一张图片的像素列数
%% temp中有16张图片
%这里设置为4x4的照片墙
row = 4;%4行
column = 4;%4列
fullPic = uint8(zeros(m*row,n*column,3));%初始化照片墙
k = 1;%初始化计数器,用于记录第几张图片
for i = 0:row-1
for j = 0:column-1
I_Temp = imread(['temp\' , Pics{k}]);%读入照片
I_Temp = imresize(I_Temp,[m,n]);%把所有照片大小设置为第一张照片的大小
fullPic(i*m+1:(i+1)*m , j*n+1:(j+1)*n , :) = I_Temp;%拼接
k = k+1;%更新计数器
imshow(fullPic)%显示当前的照片墙
drawnow%刷新屏幕
end
end
imwrite(fullPic,'PicWall.jpg')%保存图片喽
由于之前的分割图片我们是要保存多张图片,所以采用四维数组,第四维是照片的张数。而这里我们最后只要保存一张图片所以采用三维数组保存即可
-- imresize函数的部分用法 --
这里我还是直接粘贴help的内容吧,大家一块学学英语。
imresize: Resize image.
B = imresize(A, SCALE) returns an image that is SCALE times the
size of A, which is a grayscale, RGB, or binary image.(这个非限定从别管它)
B = imresize(A, [NUMROWS NUMCOLS]) resizes the image so that it has the specified number of rows and columns. Either NUMROWS or NUMCOLS may be NaN, in which case imresize computes the number of rows or columns automatically in order to preserve the image aspect ratio.
解释一下吧:第一个用法中,SCALE是把图像矩阵A放大的倍数,比如缩小0.5倍就写0.5,就行。
第二个用法用,[NUMROWS NUMCOLS]放的是resize后的图片有NUMROWS行像素和NUMCOLS列像素。
程序中采用了第一种方法。
-- 效果 --
我电脑有点卡,所以下面的GIF开头有点慢。(主要还是照片墙的矩阵有点大)
以上是“怎么用MATLAB做一个完美的照片墙”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。