一、图像裁剪——imcrop函数
通过指定裁剪矩形的位置与大小,对图像进行裁剪。显然这种方式进行裁剪不好控制矩形的位置,操作也不够快捷。
A = imread('sherlock.jpg');
rect = [250 100 550 450]; 其中250为x坐标,100为y坐标,550为x方向上的长度,450为y方向上的长度。
B = imcrop(A,rect); %进行图像剪切
subplot(1,2,1),imshow(A);
title('原图像')
rectangle('Position',rect,'LineWidth',2,'EdgeColor','r') %显示裁剪矩形框
subplot(1,2,2),imshow(B);
title('裁剪图像')
若想要实现交互式随意裁剪,则可以利用 imrect 函数,其运行时在图像区域左键点击画出矩形框,可以左键控制,调整矩形框大小位置;调整结束后,在矩形框区域,双击左键,将矩形框位置存入pos,位置格式为(x, y, w, h)左顶点位置和宽、高。
A = imread('sherlock.jpg');
figure(1)
imshow(A,[])
R = imrect;
pos = getPosition(R); % 获取imrect函数所得到的位置信息。
I = imcrop(A, pos);
close(figure(1))
imshow(I)
由于无法录制GIF,看不到演示过程,读者就自行运行上述代码吧。
二、图像分块
对于一些尺寸较大的图片,有时需要将其分割成几个小块进行单独处理,提升处理效率,此时则需要进行图像分块。
如何判断是否需要分块呢?则需要对图像尺寸进行判断,也就用到了之前提到的size函数,对图像的长宽进行提取。
为了使判断更加有自主选择性,则可以在尺寸判断之后引入**questdlg()**函数。questdlg()为matlab中的问题对话框,其基本用法为
button = questdlg(qstring,title,str1,str2,default)
qstring为对话框显示的内容, itle为标题, str1和str2为选项, default为默认选项 button为返回值 。
button=questdlg('是否分块','按键确认','是','否','是'); % 里面的内容都可以视情况进行修改。
运行上述代码,则会弹出以下对话框:
为使程序更有交互性,还可引用**inputdlg()**函数,用于创建收集用户输入的对话框。
answer = inputdlg(prompt,dlgtitle,numlines,defAns);
prompt显示内容, dlgtitle 标题, numlines输入框长度, defAns默认输入值 answer为输入的数据,以元胞数组的形式储存在里面,而且储存的数据形式都是字符串。
% 设置分块数目
prompt = {'请设置横向分块数目','设置纵向分块数目'};%提示信息
dlgtitle = '参数输入:';%对话框标题
numlines = 1;%输入行数
defans = {'2','2'};%默认数值
n = inputdlg(prompt,dlgtitle,numlines,defans,'on');
if isempty(n) == 1
return
end
运行上述代码,则会弹出以下对话框:
用户可以根据需要修改对话框中的数据,实现简单的交互。
完成上述内容后,则进入正题,进行图像的分块。
I = imread('background.jpeg');
[m,n] = size(I);
Im = I;
L = size(Im);
H = str2num(n{1});
W = str2num(n{2});
height = L(1)/H;
width = L(2)/W;
max_row = floor(L(1)/height);
max_col = floor(L(2)/width);
seg = cell(max_row,max_col); % 设置分割图像存储区域。
%对图像进行分块计算
for row = 1:max_row
for col = 1:max_col
seg(row,col)= {Im((row-1)*height+1:row*height,(col-1)*width+1:col*width,:)};
end
end
设置分块后,图像的存储位置,使用mkdir()函数 在远程位置创建文件夹,使用imwrite()函数对分割后的图像进行保存写入。
DataPath = fullfile(pwd, 'BlockImages');
if ~exist(DataPath, 'dir')
mkdir(DataPath);
end
path(path,DataPath);
saldir = 'BlockImages/';
for n=1:max_row*max_col
str0 = saldir;
str1 = strcat('块',int2str(n),'.jpg');
save_path = [str0,str1];
imwrite(seg{n},save_path);
end
s = ["分块图像已保存至:",DataPath,'\ 请重新导入分块图像进行处理!'];
hs = msgbox(s, '信息提示框');
ht = findobj(hs, 'Type', 'text');
set(ht, 'FontSize', 8, 'Unit', 'normal');
set(hs, 'Resize', 'on');