首先,将图片导入app中并显示,图像用坐标显示,所以在按钮上方添加坐标区,按钮回调如下
function importButtonPushed(app, event)
%用以下的代码显示导入图片提示框
filterspec = {'*.jpg;*.tif;*.png;*.gif','All Image Files'};
[f, p] = uigetfile(filterspec);
% Make sure user didn't cancel uigetfile dialog
if (ischar(p))
fname = [p f];
try%fname是图像的地址,其中f是后缀,p是前面那一堆
im = imread(fname);
catch ME
% If problem reading image, display error message
uialert(app.UIFigure, ME.message, 'Image Error');
end%imagesc将矩阵转变为图片
imagesc(app.UIAxes,im);%在坐标上展示图片
end
end
这里借鉴给出的例子,导入图片。
为了后续的图像处理,需要读取图片的矩阵,由于上述代码
im = imread(fname);
这里的im就是图像的矩阵,所以考虑添加私有属性,在不同的按钮之间传递
私有属性代码如下
properties (Access = private)
X % Description
end
由于这里只是声明变量,所以如此简洁,在“im = imread(fname);”后添加
app.X=im;
用app.对X进行引用,给它赋值
新建一个按钮,回调如下
function Button4Pushed(app, event)
im3=app.X(:,:,1);
imagesc(app.UIAxes,im3);
end
app.X直接用就行,这里提取矩阵的其中一个维度。
对图像进行处理注意png和jpg对应的矩阵维度不同
添加以下按钮的回调,为了将矩阵转置,由于这里是多维矩阵,所以不能im2',应该用permute函数,后面三个参数代表重新安放后的矩阵维度的位置,这里就相当于将第一维度和第三维度互换。
function rotate90ButtonPushed(app, event)
im2=app.X;
imagesc(app.UIAxes,permute(im2,[3 2 1]));
end
这里运行后点击按钮报错,因为颜色数据必须为 m×n×3 或 m×n 矩阵,改成permute(im2,[2 1 3])就行,第一和第二维度是像素位置
由于为了每次点击按钮都是处理当前显示的图片,因此每次要更新app.X的值。
为了将图片导出,添加export按钮,回调如下
function exportButtonPushed(app, event)
filterspec = {'*.jpg;*.tif;*.png;*.gif','All Image Files'};
[f,p]=uiputfile(filterspec);
if isequal(f,0)||isequal(p,0)
return
else
imwrite(app.X,[p,f]);%注意这里p,f的顺序与上面相反
end
end