matlab大作业——基础模板设计

任务描述

基础版图像处理小工具,完成图像处理的基本操作和阐述其原理。

功能模块

1.导入图片

1.1算法原理

通过uigetfile打开文件选择对话框获取图像,axes();imshow()将图像显示到窗口。

1.2算法实现
% --- 载入图像
function btn1_Callback(hObject, eventdata, handles)
%打开文件选择对话框,并返回选择文件的名称和路径(image=[path file][file path]=uigetfile({
   '*.jpg';'*.bmp';'*.jpeg';'*.png'}, '打开文件');
image=[path file];
handles.file=image;
if (file==0)
    warndlg('请选择一张图片...') ;  %未选择图片出现提示
end
 %获取图像
handles.img=imread(image);
%创建加载等待条对话框
h = waitbar(0,'等待...');
steps = 100;
for step = 1:steps
    waitbar(step / steps)
end
%关闭对话框
close(h) 
%显示图像到窗口,清除坐标区
axes(handles.img1); 
cla; 
imshow(handles.img);

axes(handles.img2); 
cla; 
imshow(handles.img);

axes(handles.img3); 
cla; 
imshow(handles.img);

axes(handles.img4); 
cla; 
imshow(handles.img);
%guidata(obj,data) 将指定的数据存储在其应用程序数据中
guidata(hObject,handles);
1.3实验结果与对比分析

打开文件选择对话框
显示图像到窗口
分析:
回调函数中主要用到的函数:
[file path]=uigetfile()——打开文件选择对话框,返回选择文件的名称和路径
warndlg(‘请选择一张图片…’)——创建警告对话框
waitbar(0,‘等待…’)——创建加载等待条对话框
axes(handles.img1);
imshow(handles.img)——显示图像到窗口
guidata(obj,data)——将指定的数据存储在其应用程序数据中
set(handles.btn2,‘Enable’,‘on’)——载入图像以后启用其他按钮

2. 彩色图像灰度化

2.1算法原理

彩色图像一般具有三通道,每个像素由R、G、B三个分量表示,每个通道取值范围0-255。灰度图像每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度。灰度值分布在0-255之间。彩色图像灰度化的方法有:
最大值法:使R,G,B的值等于3值中最大的一个,R=G=B=max(R,G,B),最大值法会形成亮度很高的灰度图像。
平均值法:是R,G,B的值求出平均值,R=G=B=(R+G+B)/3,平均值法会形成较柔和的灰度图像。
加权平均值法:根据重要性或其他指标给R,G,B赋予不同的权值,并使R,G,B的值加权平均,R=G=B=WR+VG+UB,W,V,U分别表示权重
本模块使用的函数rgb2gray(I)用到的算法是加权平均法。

2.2算法实现
% --- 灰度化
function btn5_Callback(hObject, eventdata, handles)
%将原图像变成灰度图
handles.grayimg = rgb2gray(handles.img);
%输出灰度图到窗口
axes(handles.img2); 
imshow(handles.grayimg);
set(handles.t1,'String',"加权平均值灰度化");  
2.3实验结果与对比分析

在这里插入图片描述
加权平均值灰度化对原图像的信息保留程度较高

3.灰度图像二值化

3.1算法原理

二值图像指矩阵中只有0和1的图像。
BW = im2bw(I,level) 将灰度图像 I 转换为二值图像 BW,方法是将输入图像中亮度大于 level 的所有像素替换为值 1(白色),将所有其他像素替换为值 0(黑色)。

3.2算法实现
% --- 二值化
function btn6_Callback(hObject, eventdata, handles)
%将原图像变成灰度图
handles.grayimg = rgb2gray(handles.img);
I = get(handles.btn6,'Value');
handles.binarize = im2bw(handles.grayimg,I);
%输出灰度图到窗口
axes(handles.img2); 
imshow(handles.binarize);
set(handles.log_btn6,'String',I);  
set(handles.t1,'String',"阈值为"+I+"的二值化");   
3.3实验结果与对比分析

通过阈值调节变换程度

4.图像叠加

4.1算法原理

将两个图像的像素值相加,得到一张叠加图像,用imadd()实现算法。

4.2算法实现
% --- 图像叠加
function btn7_Callback(hObject, eventdata, handles)
%打开文件选择对话框,并返回选择文件的名称和路径(image=[path file][file1 path1]=uigetfile({
   '*.jpg';'*.bmp';'*.jpeg';'*.png'}, '打开文件');
image1=[path1 file1];
handles.file1=image1;
if (file1==0)
    warndlg('请选择一张图片...') ;  %未选择图片出现提示
end
 %获取图像
handles.image1=imread(image1);
%创建加载等待条对话框
h = waitbar(0,'等待...');
steps = 100;
for step = 1:steps
    waitbar(step / steps)
end
%关闭对话框
close(h) 
%显示图像到窗口2,清除坐标区
axes(handles.img2); 
cla; 
%获取第一张图像的大小
[a,b,c]=size(handles.img);
%设置第二张图像大小
handles.image1 = imresize(handles.image1,[a b]);
%显示第二张图像
imshow(handles.image1);
set(handles.t1,'String',"相加图片");  
%imadd()函数将两图像相加
handles.addimg = imadd(handles.img,handles.image1);
%输出结果
axes(handles.img3); 
cla; 
imshow(handles.addimg);
set(handles.t2,'String',"相加结果");   
4.3实验结果与对比分析

在这里插入图片描述
在这里插入图片描述
分析:图像叠加比较容易让图像亮度偏大,因为单纯的将像素值相加,结果图像的像素值比两张原图像的值都要大,有时候会使图像曝光度过大,失去原来的信息

5.目标检测 (即两幅图像相减)

5.1算法原理

在前一张图像的像素点上减去后一张的像素值,得到一张相减图像,用imsubtract()实现算法。

5.2算法实现
% --- 目标检测
function btn8_Callback(hObject, eventdata, handles)
[file2 path2]=uigetfile({
   '*.jpg';'*.bmp';'*.jpeg';'*.png'}, '打开文件');
image2=[path2 file2];
handles.file2=image2;
if (file2==0)
    warndlg('请选择一张图片...') ;  %未选择图片出现提示
end
 %获取图像
handles.image2=imread(image2);
%创建加载等待条对话框
h = waitbar(0,'等待...');
steps = 100;
for step = 1:steps
    waitbar(step / steps)
end
%关闭对话框
close(h) 
%显示图像到窗口2,清除坐标区
axes(handles.img2); 
cla; 
%获取第一张图像的大小
[a,b,c]=size(handles.img);
%设置第二张图像大小
handles.image2 = imresize(handles.image2,[a b]);
%显示第二张图像
imshow(handles.image2);
set(handles.t1,'String',"相减图片");  
%imsubtract()函数将两图像相减
handles.imsub=imsubtract(handles.img,handles.image2);
%输出结果
axes(handles.img3); 
cla; 
imshow(handles.imsub);
set(handles.t2,'String',"相减结果");  
5.3实验结果与对比分析

在这里插入图片描述
在这里插入图片描述
分析:两图像相减时,相当于做减操作的图像作为模板,加深被减图像相应位置的颜色。做减操作的图像的像素值在被减图像上减去,降低了相应位置的像素值,使图像相应位置变暗。

6.灰度变换(包括指数变换、对数变换)

6.1算法原理

灰度变换分为线性变换非线性变换,其中非线性变换有指数变换和对数变换。在本模块中设置了三种类型的灰度变换:
(1).线性变换:g(x,y)=f(x,y)*tana;
(2) 指数变换:g(x,y)=f(x,y)^r
(3).对数变换:g(x,y)=loga(f(x,y))=log(f(x,y))/loga

6.2算法实现
% --- a1:线性变换
function a1_Callback(hObject, eventdata, handles)
%将图像化为灰度图并设为双精度
handles.gray = im2double(rgb2gray(handles.img));
%通过滑块获取线性变换的tan值
tan = get(handles.a1,'Value');
tan = tan*0.1;
set(handles.log_a1,'String',num2str(tan));
%设置与img大小相同的矩阵
[m,n] = size(handles.gray);
handles.img_a1 = zeros(m,n);
for i=1:m
    for j = 1:n
        handles.img_a1(i,j)=handles.gray(i,j)*tan;
        %线性变换公式:g(x,y)=f(x,y)*tan
    end
end
%输出结果
axes(handles.img2); 
cla; 
imshow(handles.img_a1);
set(handles.t1,'String',"线性变换 tana="+tan);   
% --- a2:指数变换
function a2_Callback(hObject, eventdata, handles)
%将图像化为灰度图并设为双精度
handles.gray= im2double(rgb2gray(handles.img));
%通过滑块获取指数变换的r
r = get(handles.a2,'Value');
r = exp(r);
set(handles.log_a2,'String',num2str(r));
%设置与img大小相同的矩阵
[m,n] = size(handles.gray);
handles.img_a2 = zeros(m,n);
for i=1:m
    for j = 1:n
        handles.img_a2(i,j)=handles.gray(i,j)^r;
        %指数变换公式:g(x,y)=f(x,y)^r
    end
end
%输出结果
axes(handles.img3); 
cla; 
imshow(handles.img_a2);
set(handles.t2,'String',"指数变换 r="+r);
% --- a3:对数变换
function a3_Callback(hObject, eventdata, handles)
%将图像化为灰度图并设为双精度
handles.gray= im2double(rgb2gray(handles.img));
%通过滑块获取对数变换的a
a = get(handles.a3,'Value');
set(handles.log_a3,'String',num2str(a));
%设置与img大小相同的矩阵
[m,n] = size(handles.gray);
handles.img_a3 = zeros(m,n);
for i=1:m
    for j = 1:n
        handles.img_a3(i,j)=log(handles.gray(i,j)+1)/a;
        %对数变换公式:g(x,y)=log(f)/log(a)
    end
end
%输出结果
axes(handles.img4); 
cla; 
imshow(handles.img_a3);
set(handles.t3,'String',"对数变换 a="+a);
6.3实验结果与对比分析

在这里插入图片描述
在这里插入图片描述
线性变换
当tana小于1时,图像灰度范围被压缩,图像变暗;
当tana等于1时,图像灰度范围无变化,图像不变;
当tana大于1时,图像灰度范围被拉伸,图像变亮;
指数变换
当r小于1时,提高灰度级,图像变亮;
当r等于1时,图像不变;
当r大于1时,降低灰度级,图像变暗;
对数变换
当loga小于1时,提高灰度级,图像变亮;
当loga等于1时,图像不变;
当loga大于1时,降低灰度级,图像变暗;

7.直方图均衡化

7.1算法原理

(1).直方图:直方图有两种定义,一是h(rk)=nk,nk指灰度级为rk的像素总数;二是p(rk)=nk/n,其中n指图像中的像素总个数。第二种定义体现了灰度级在图像中所占的比例,p(rk)的值也规定在了0到1之间。
(2).直方图均衡化:将图像中像素个数多的灰度级进行展宽,像素个数少的灰度级进行缩减
(3).原理:得到图像每一个灰度级rk在图像中的比重p(rk),将比重累积Sum(rk),每一次累积的结果乘灰度级得到当前灰度级变换后的灰度级sk,将变换后灰度级相等的灰度级比重相加,得到变换后的新的灰度级比重P(sk)。P(Sk)即是直方图均衡化的结果。

7.2算法实现
% --- 直方图均衡化
function btn9_Callback(hObject, eventdata, handles)
%获得原图像直方图
[m,n,o] = size(handles.img);
%获取图像大小参数
hist = zeros(1,256);
% 创建11X256的全0矩阵;
for i = 1:256
    hist(i)=length(find(handles.img==(i-1)))/(m*n);
end
%find(X) 返回一个包含数组 X 中每个非零元素的线性索引的向量。
%length()返回数组长度大小
%hist(i)返回相同灰度像素占总像素个数的比重
axes(handles.img2); 
cla; 
bar(0:255,hist);
set(handles.t1,'String',"原图像直方图");  

%均衡化处理
s1 = zeros(1,256);
s2= zeros(1,256);
temp=0;
for i=1:256
    temp = temp+hist(i);
    s1(i)=temp;
end
%计算sum nk
% i == rk(灰度级) hist(i)==p(rk)(灰度级比重) s1(i)==Prk累积
s2 =round(s1*255);   %乘以255.在向下取整
%  s2==Sk(均衡后图像每个像素新的灰度级)
newhist=zeros
  • 3
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值