matlab期末大作业(基础功能、人脸识别、特殊风格等)

这篇博客详细介绍了使用MATLAB进行图像处理的各种操作,包括导入图片、图像旋转、对比度调整、灰度化、裁剪、二值化处理、图像相加和相减、对数与指数变换、图像翻转和反色、直方图分析、噪声处理、边缘检测、频域滤波、颜色对象提取、形状检测、人脸识别以及多种艺术风格效果的实现。通过算法原理、代码示例和结果分析,展示了MATLAB在图像处理领域的强大功能。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

1.导入图片和从摄像头端加载图片。

1.1算法原理

1.2代码

[fp,pn,fg]=uigetfile('*.*','选择图片');
I = imread([pn fp]);
axes(handles.axes1);%创建坐标轴图形对象
imshow(I);%显示图像
handles.image = I;
guidata(hObject,handles);%设置为全局图片

%从摄像头端加载图片
vid = videoinput('winvideo', 1, 'YUY2_640x480')
set(vid,'ReturnedColorSpace','rgb');
vidRes=get(vid,'VideoResolution');
width=vidRes(1);
height=vidRes(2);
nBands=get(vid,'NumberOfBands');
hImage=image(zeros(vidRes(2),vidRes(1),nBands));
preview(vid,hImage);
start(vid);
img = getsnapshot(vid);
axes(handles.axes1);
imshow(img);
delete(vid);
handles.image = img;
guidata(hObject,handles);%设置为全局图片

1.3结果及分析

![在这里插入图片描述](https://img-blog.csdnimg.cn/729a211a03c4435b9f91ccb8466102a6.png#pic_center

webcamlist
查看电脑上已经安装的图像适配器
使用如下命令即可预览视频对象,该函数会自动打开一个窗口,播放摄像头画面:
preview(video1)

用完之后清除对象
clear

2.将一张彩色图像进行不同角度的旋转,各种程度的对比度,彩色图像灰度化,裁剪图片。

2.1算法原理

rgb2gray 函数通过消除色调和饱和度信息,同时保留亮度,来将 RGB 图像转换为灰度图
真彩色图像,指定为 m×n×3 数值数组
灰度图像,以 m×n 数值数组形式返回

2.2代码

%图像的对比度
I=handles.image;
num=get(handles.slider2,'value');
 
I1 = imadjust(I,[0 num],[]);
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
imshow(I1)
%旋转
set(hObject,'Min',0,'Max',360);
I=handles.image;
a=get(handles.slider3,'value');
L=imrotate(I,a);
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
imshow(L);
%做图像裁剪
 
im = handles.image;
%figure,imshow(im);
imcroped = imcrop; % 直接将figure前置并使鼠标显示十字架让你画框,画完双击就截取了矩形图像
axes(handles.axes2);
imshow(imcroped); %截取后的图像存在imcroped中

2.3结果及分析

分析:B=imrotate(A,angle),将图像A围绕其中心点进行angle角度的逆时针旋转 imadjust函数实现对比度 图像裁剪 imcroped = imcrop; % 直接将figure前置并使鼠标显示十字架让你画框,画完双击就截取了矩形图像

3.不同阈值的二值化处理

3.1算法原理

将灰度图像 I 转换为二进制图像

3.2代码

I=handles.image;
mysize = size(I);
%把图像转换成灰度图
if numel(mysize) > 2
    I = rgb2gray(I);
end
a=im2double(I);
%全局变量设置的二值化阈值
binary_img = im2bw(a,handles.binary_thresh);
%显示二值化后的图片
axes(handles.axes2)
imshow(binary_img)

3.3结果及分析

分析: 阈值越高,黑色部分越高。

4.两幅图像相加

4.1算法原理

存储当做一个二维的矩阵、进一步地,视为二维数组来进行处理。可以想到:如果我们的目的是完成对两张图片的融合,最简单的方法就是把每一个像素点加起来

4.2代码

I = handles.image;%得到第一张全局图像
J=handles.image2;%得到第二张全局图像
H1=imadd(I,J);%两张图像相加

4.3结果及分析

在这里插入图片描述

5.两幅图像相减

5.1算法原理

图像减法也称为差分方法,进行代数运算

5.2代码

I = handles.image;%得到第一张全局图像
J=handles.image2;%得到第二张全局图像
%图像相减,要求图像矩阵相同大小
H2=imsubtract(I,J);
imshow(H2);

5.3结果及分析

在这里插入图片描述

6.对数2 、5 、15不同程度的变化,指数2 、4 、0.5的不同程度的变换图片。将图片镜像和反色

6.1算法原理

对数函数会扩张低灰度区域压缩高灰度区域,因此低灰度区域细节会增强,图像整体会变亮,而指数函数则相反
反色的实际含义是将R、G、B值反转,若颜色的量化级别是256,则新图的R、G、B值为255减去原图的R、G、B值。
flipdim函数实现图片镜像翻转

6.2代码

%对数变换
I=handles.image;%获取全局图像
 
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
I=double(rgb2gray(I))/255;
  I=log2(1+I)/log2(5);
      imshow(I);

% Hint: get(hObject,'Value') returns toggle state of radiobutton4
%指数变换
I=handles.image;%获取全局图像
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
I=double(rgb2gray(I))/255;
c=255;
  I = c/255*(I.^2);   
       imshow(I);
%镜像处理
%图形的几何变换—垂直镜像
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
I = handles.image;
J = flipdim(I,2);%原图像的垂直镜像
imshow(J);

%反色
 
I=handles.image;
[rows , cols , colors] = size(I);%得到原来图像的矩阵的参数  
Res = zeros(rows , cols);%创建一个空矩阵用来存储新的灰度图
Res = uint8(Res);
Res(:,:,1)=255-I(:,:,1);
Res(:,:,2)=255-I(:,:,2);
Res(:,:,3)=255-I(:,:,3); 
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
imshow(Res);

6.3结果及分析

分析:彩图是每像素占3个字节,而变化成灰度图后每像素占一个字节,彩图在转化为灰度图的同时,抛弃了颜色信息,只保留了图像亮度信息。指数越大,图像灰度程度就越大,看不清物品。

7.直方图和直方图均衡化

7.1算法原理

直方图均值化,将低灰度值归并,高灰度值拉伸,当一个图像灰度分布均匀时,图像的整体细节与质量会提升很多

7.2代码

%绘制灰度直方图
set(handles.axes4,'HandleVisibility','ON');
axes(handles.axes4);
I = rgb2gray(handles.image);%转换为灰度图
imhist(I);%显示直方图


%直方图均衡化
set(handles.axes4,'HandleVisibility','ON');
axes(handles.axes4);
I = rgb2gray(handles.image);
I = histeq(I);%直方图均衡化
imhist(I);

7.3结果及分析

8.添加高斯和椒盐噪声并分别用不同33和55模板进行均值、中值、高斯滤波器处理

8.1算法原理

均值滤波和中值滤波是都属于空间滤波(对于某一像素点,以该点为中心,通过对该像素点邻域部分的像素进行处理,得到中心替代像素点的滤波方法
如果噪声为高斯噪声,测量值在真实值周围波动,取得平均之后会得到相对准确的值。
如果噪声为椒盐噪声,像素会出现剧烈跳动,而中值对极大值和极小值不敏感,取中值后可以很好过滤掉此类噪声。

8.2代码

%添加椒盐噪声
I = handles.image;
var=get(handles.popupmenu2,'value');
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
 
J=imnoise(I,'salt & pepper',0.2);  %添加椒盐噪声,密度为0.2
imshow(J);
I = handles.image;
%空域滤波去除椒盐噪声实例
I=rgb2gray(I);
J=imnoise(I,'salt & pepper',0.2);  %添加椒盐噪声,密度为0.2
var =get(handles.popupmenu3,'value');
switch var 
    case 1
        K1 = filter2(fspecial('average',3),J)/255;%均值滤波器
K2 = medfilt2(J,[3,3]);%中值滤波器
figure('NumberTitle', 'off', 'Name', '空域滤波去除椒盐噪声'); 
subplot(2,2,1);
imshow(J);
title('含椒盐噪声的图像');
subplot(2,2,2);
imshow(K1);
title('均值滤波器');
subplot(2,2,3);
imshow(K2);
title('中值滤波器');
    case 2
         K1 = filter2(fspecial('average',5),J)/255;%均值滤波器
K2 = medfilt2(J,[5,5]);%中值滤波器
figure('NumberTitle', 'off', 'Name', '空域滤波去除椒盐噪声'); 
subplot(2,2,1);
imshow(J);
title('含椒盐噪声的图像');
subplot(2,2,2);
imshow(K1);
title('均值滤波器');
subplot(2,2,3);
imshow(K2);
title('中值滤波器');
end

%添加高斯噪声
I = handles.image;
var=get(handles.popupmenu2,'value');
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
G=imnoise(I,'gaussian',0,0.2);  
imshow(G);%添加高斯噪声,
%做高斯噪声3*35*5
I = handles.image;
%空域滤波去除高斯噪声实例
I=rgb2gray(I);
J=imnoise(I,'gaussian',0,0.02);    %添加高斯噪声
var =get(handles.popupmenu4,'value');
switch var 
    case 1
        K1 = filter2(fspecial('average',3),J)/255;%均值滤波器
K2 = medfilt2(J,[3,3]);%中值滤波器
figure('NumberTitle', 'off', 'Name', '空域滤波去除高斯噪声'); 
subplot(2,2,1);
imshow(J);
title('含高斯噪声的灰度图像');
subplot(2,2,2);
imshow(K1);
title('33均值滤波器');
subplot(2,2,3);
imshow(K2);
title('33中值滤波器');
    case 2
         K1 = filter2(fspecial('average',5),J)/255;%均值滤波器
K2 = medfilt2(J,[5,5]);%中值滤波器
figure('NumberTitle', 'off', 'Name', '空域滤波去除高斯噪声'); 
subplot(2,2,1);
imshow(J);
title('含高斯噪声的图像');
subplot(2,2,2);
imshow(K1);
title('5*5均值滤波器');
subplot(2,2,3);
imshow(K2);
title('5*5中值滤波器');
end
%高斯平滑滤波器
Image=handles.image;
mysize=size(handles.image);
if numel(mysize)>2
    Image=rgb2gray(handles.image);
end
sigma1=0.6; sigma2=10; r=3;  % 高斯模板的参数
NoiseI= imnoise(Image,'gaussian'); %加噪
gausFilter1=fspecial('gaussian',[2*r+1 2*r+1],sigma1);  
gausFilter2=fspecial('gaussian',[2*r+1 2*r+1],sigma2);  
result1=imfilter(NoiseI,gausFilter1,'conv');
result2=imfilter(NoiseI,gausFilter2,'conv');
figure('NumberTitle', 'off', 'Name', '高斯平滑滤波器'); 
subplot(2,2,1),title('原图'),imshow(Image);
subplot(2,2,2),title('高斯噪声'),imshow(NoiseI);
subplot(2,2,3),title('sigma1'
引用:【备注】主要针对正在做毕设的同学和需要项目实战的深度学习、matlab、数字图像处理、cv图像识别模式识别方向学习者。 也可作为课程设计、期末大作业。包含:项目源码和项目说明等,该项目可直接作为毕设使用。 也...。 引用:因为想用txt里的数据去画图,而不是直接 x=1:10:100 这种方法去画图,于是先研究了把数据的散点图画出来,为了方便输入算式(主要是因为用matlab对正态分布的最大似然估计求偏导数过程中,操作代码有bug竟然求a出个负数于是放弃,直接手算求导再用matlab当作计算求和工具罢了) %手动求导数,最终求出了u的算式,最大似然估计值为u,然后才有下面这步 sum = 0; for n = 1:1000 sum = data(n) sum ; end u = sum /1000; %手动求导数,最终求出了a的算式,最大似然估计值为a_zhengtai,然后才有下面这步 zum = 0; for k = 1:1000 zum = (data(k)-u)^2 zum; end a_zhengtai = (zum/1000)^1/2; %用lognpdf来画图,lognpdf是用来计算X中的元素在mu、sigma参数指定的对数正态分布下的概率密度函数值 for i =1:1000 x_zt = data(i); y_zt = lognpdf(x_zt,u,a_zhengtai); hold on scatter(x_zt,y_zt); % plotyy(x_zt,y_zt,'plot');这个是百度的,但是不知道怎么用,只画出一个点 plot(x_zt,y_zt,'-o'); end 。 引用:把数据读到矩阵里的代码: 第一种很简单: fid = fopen('C:\Users\Administrator\Desktop\A.txt','rt'); sizeA =[1000 1]; data = fscanf(fid,'%f',sizeA); 。 模式识别大作业中,你可以使用Matlab来进行一些数据处理和图像绘制的操作。例如,你可以使用Matlab读取一个文本文件中的数据,并将这些数据绘制成散点图。你可以按照以下步骤进行操作: 1. 打开文本文件:使用fid = fopen('文件路径','rt')打开存储数据的文本文件。 2. 读取数据:使用fscanf函数按照指定的格式读取数据,将数据存储到一个矩阵中。例如,可以使用data = fscanf(fid,'%f',sizeA)将文件中的数据读取到名为data的1000行1列的矩阵中。 3. 绘制散点图:使用scatter函数将数据绘制成散点图。可以使用for循环遍历data矩阵的每个元素,并使用scatter(x_zt,y_zt)将每个元素绘制成一个散点。其中x_zt表示数据的横坐标,y_zt表示数据的纵坐标。你还可以使用plot函数绘制出更具体的线条。例如,使用plot(x_zt,y_zt,'-o')可以绘制出带有线条和圆点的图形。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值