MATLAB图像处理之几何变换——裁剪与分块

一、图像裁剪——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');
  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值