matlab怎么大佬图片,用MATLAB做一个完美的照片墙

既然讲了如何分割图片,那么如何拼接图片是不会少你们的

7ead1b7c53fc358175e7d0942abe45d8.png

b3f6bc7c81794a5f7f744fa174e74a03.png

(其实是大佬室友提了一下,我才想起来还可以给我做的工具添加这样的功能

d6f0f32199f9131affa08586bbd287ea.png)

由于昨天事比较多,所以本期就先以直接编程的方式来实现这个功能,后期有时间在集成到我做的图片浏览器中。

bb0da1d501333698fca942528eceb473.png

-- 原理 --

其实,如果前面分割图片的原理理解了的话,本期中拼接图片的原理不用说也能想的到

d6f0f32199f9131affa08586bbd287ea.png

照片墙不就是一个由许多小图片构成的大图片么,也就是说照片墙实际上就是由许多小矩阵构成的大矩阵

d6f0f32199f9131affa08586bbd287ea.png。豁然开朗了把,只要用循环把这些矩阵拼接起来就能实现。(不过值得注意的是,一般都是rgb图像,如果直接以原来的尺寸拼接,会出现矩阵太大,MATLAB就直接不干了,所以如果图片比较多的话需要先采用imresize函数缩小一下)

3d8c0bb8f86467bca1cde55c8d4c2268.png

-- 源码

2c6c3bc2a57553cd2dfa86b07b01c81c.png --

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的内容吧,大家一块学学英语

d6f0f32199f9131affa08586bbd287ea.png

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.(这个非限定从别管它

d6f0f32199f9131affa08586bbd287ea.png)

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开头有点慢

d6f0f32199f9131affa08586bbd287ea.png。(主要还是照片墙的矩阵有点大

d6f0f32199f9131affa08586bbd287ea.png)

b8e3cbcc2cdec2149925beed08e34823.gif

5efb43577c6809802c655768a8748b0a.png

2c6c3bc2a57553cd2dfa86b07b01c81c.png这只有16张,读者可以试试100张,记得把图片要缩小再拼接啊。

b81112a732fc22bc1a44072d16d34525.png

加油,要好好学习!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值