求MATLAB代码

求MATLAB代码,第1张

MATLAB实用源代码

1图像的读取及旋转

A=imread('');%读取图像

subplot(2,2,1),imshow(A),title('原始图像');%输出图像

I=rgb2gray(A);

subplot(2,2,2),imshow(A),title('灰度图像');

subplot(2,2,3),imhist(I),title('灰度图像直方图');%输出原图直方图

theta = 30;J = imrotate(I,theta);% Try varying the angle, theta

subplot(2,2,4), imshow(J),title(‘旋转图像’)

2边缘检测

I=imread('C:\Users\HP\Desktop\平时总结\路飞jpg');

subplot(2,2,1),imshow(I),title('原始图像');

I1=edge(I,'sobel');

subplot(2,2,2),imshow(I1),title('sobel边缘检测');

I2=edge(I,'prewitt');

subplot(2,2,3),imshow(I2),title('prewitt边缘检测');

I3=edge(I,'log');

subplot(2,2,4),imshow(I3),title('log边缘检测');

3图像反转

MATLAB 程序实现如下:

I=imread('xianbmp');

J=double(I);

J=-J+(256-1);%图像反转线性变换

H=uint8(J);

subplot(1,2,1),imshow(I);

subplot(1,2,2),imshow(H);

4灰度线性变换

MATLAB 程序实现如下:

I=imread('xianbmp');

subplot(2,2,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

axis on;%显示坐标系

I1=rgb2gray(I);

subplot(2,2,2),imshow(I1);

title('灰度图像');

axis([50,250,50,200]);

axis on; %显示坐标系

J=imadjust(I1,[01 05],[]); %局部拉伸,把[01 05]内的灰度拉伸为[0 1]

subplot(2,2,3),imshow(J);

title('线性变换图像[01 05]');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

K=imadjust(I1,[03 07],[]); %局部拉伸,把[03 07]内的灰度拉伸为[0 1]

subplot(2,2,4),imshow(K);

title('线性变换图像[03 07]');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

5非线性变换

MATLAB 程序实现如下:

I=imread('xianbmp');

I1=rgb2gray(I);

subplot(1,2,1),imshow(I1);

title(' 灰度图像');

axis([50,250,50,200]);

grid on;%显示网格线

axis on;%显示坐标系

J=double(I1);

J=40(log(J+1));

H=uint8(J);

subplot(1,2,2),imshow(H);

title(' 对数变换图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

4直方图均衡化

MATLAB 程序实现如下:

I=imread('xianbmp');

I=rgb2gray(I);

figure;

subplot(2,2,1);

imshow(I);

subplot(2,2,2);

imhist(I);

I1=histeq(I);

figure;

subplot(2,2,1);

imshow(I1);

subplot(2,2,2);

imhist(I1);

5 线性平滑滤波器

用MATLAB实现领域平均法抑制噪声程序:

I=imread('xianbmp');

subplot(231)

imshow(I)

title('原始图像')

I=rgb2gray(I);

I1=imnoise(I,'salt & pepper',002);

subplot(232)

imshow(I1)

title(' 添加椒盐噪声的图像')

k1=filter2(fspecial('average',3),I1)/255; %进行33模板平滑滤波

k2=filter2(fspecial('average',5),I1)/255; %进行55模板平滑滤波k3=filter2(fspecial('average',7),I1)/255; %进行77模板平滑滤波

k4=filter2(fspecial('average',9),I1)/255; %进行99模板平滑滤波

subplot(233),imshow(k1);title('33 模板平滑滤波');

subplot(234),imshow(k2);title('55 模板平滑滤波');

subplot(235),imshow(k3);title('77 模板平滑滤波');

subplot(236),imshow(k4);title('99 模板平滑滤波');

6中值滤波器

用MATLAB实现中值滤波程序如下:

I=imread('xianbmp');

I=rgb2gray(I);

J=imnoise(I,'salt&pepper',002);

subplot(231),imshow(I);title('原图像');

subplot(232),imshow(J);title('添加椒盐噪声图像');

k1=medfilt2(J); %进行33模板中值滤波

k2=medfilt2(J,[5,5]); %进行55模板中值滤波

k3=medfilt2(J,[7,7]); %进行77模板中值滤波

k4=medfilt2(J,[9,9]); %进行99模板中值滤波

subplot(233),imshow(k1);title('33模板中值滤波');

subplot(234),imshow(k2);title('55模板中值滤波 ');

subplot(235),imshow(k3);title('77模板中值滤波');

subplot(236),imshow(k4);title('99 模板中值滤波');

7用Sobel算子和拉普拉斯对图像锐化:

I=imread('xianbmp');

subplot(2,2,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on;%显示坐标系

I1=im2bw(I);

subplot(2,2,2),imshow(I1);

title('二值图像');

axis([50,250,50,200]);

grid on;%显示网格线

axis on;%显示坐标系

H=fspecial('sobel');%选择sobel算子

J=filter2(H,I1); %卷积运算

subplot(2,2,3),imshow(J);

title('sobel算子锐化图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on;%显示坐标系

h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子

J1=conv2(I1,h,'same');%卷积运算

subplot(2,2,4),imshow(J1);

title('拉普拉斯算子锐化图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

8梯度算子检测边缘

用 MATLAB实现如下:

I=imread('xianbmp');

subplot(2,3,1);

imshow(I);

title('原始图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

I1=im2bw(I);

subplot(2,3,2);

imshow(I1);

title('二值图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

I2=edge(I1,'roberts');

figure;

subplot(2,3,3);

imshow(I2);

title('roberts算子分割结果');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

I3=edge(I1,'sobel');

subplot(2,3,4);

imshow(I3);

title('sobel算子分割结果');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

I4=edge(I1,'Prewitt');

subplot(2,3,5);

imshow(I4);

title('Prewitt算子分割结果 ');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

9LOG算子检测边缘

用 MATLAB程序实现如下:

I=imread('xianbmp');

subplot(2,2,1);

imshow(I);

title('原始图像');

I1=rgb2gray(I);

subplot(2,2,2);

imshow(I1);

title('灰度图像');

I2=edge(I1,'log');

subplot(2,2,3);

imshow(I2);

title('log算子分割结果');

10Canny算子检测边 缘

用MATLAB程序实现如下:

I=imread('xianbmp');

subplot(2,2,1);

imshow(I);

title('原始图像')

I1=rgb2gray(I);

subplot(2,2,2);

imshow(I1);

title('灰度图像');

I2=edge(I1,'canny');

subplot(2,2,3);

imshow(I2);

title('canny算子分割结果');

11边界跟踪 (bwtraceboundary函数)

clc

clear all

I=imread('xianbmp');

figure

imshow(I);

title('原始图像');

I1=rgb2gray(I); %将彩色图像转化灰度图像

threshold=graythresh(I1); %计算将灰度图像转化为二值图像所需的门限

BW=im2bw(I1, threshold); %将灰度图像转化为二值图像

figure

imshow(BW);

title('二值图像');

dim=size(BW);

col=round(dim(2)/2)-90; %计算起始点列坐标

row=find(BW(:,col),1); %计算起始点行坐标

connectivity=8;

num_points=180;

contour=bwtraceboundary(BW,[row,col],'N',connectivity,num_points);

%提取边界

figure

imshow(I1);

hold on;

plot(contour(:,2),contour(:,1), 'g','LineWidth' ,2);

title('边界跟踪图像');

12Hough变换

I= imread('xianbmp');

rotI=rgb2gray(I);

subplot(2,2,1);

imshow(rotI);

title('灰度图像');

axis([50,250,50,200]);

grid on;

axis on;

BW=edge(rotI,'prewitt');

subplot(2,2,2);

imshow(BW);

title('prewitt算子边缘检测 后图像');

axis([50,250,50,200]);

grid on;

axis on;

[H,T,R]=hough(BW);

subplot(2,2,3);

imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');

title('霍夫变换图');

xlabel('\theta'),ylabel('\rho');

axis on , axis normal, hold on;

P=houghpeaks(H,5,'threshold',ceil(03max(H(:))));

x=T(P(:,2));y=R(P(:,1));

plot(x,y,'s','color','white');

lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);

subplot(2,2,4);,imshow(rotI);

title('霍夫变换图像检测');

axis([50,250,50,200]);

grid on;

axis on;

hold on;

max_len=0;

for k=1:length(lines)

xy=[lines(k)point1;lines(k)point2];

plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');

plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');

plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');

len=norm(lines(k)point1-lines(k)point2);

if(len>max_len)

max_len=len;

xy_long=xy;

end

end

plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');

13直方图阈值法

用 MATLAB实现直方图阈值法:

I=imread('xianbmp');

I1=rgb2gray(I);

figure;

subplot(2,2,1);

imshow(I1);

title(' 灰度图像')

axis([50,250,50,200]);

grid on;%显示网格线

axis on; %显示坐标系

[m,n]=size(I1);%测量图像尺寸参数

GP=zeros(1,256); %预创建存放灰度出现概率的向量

for k=0:255

GP(k+1)=length(find(I1==k))/(mn);%计算每级灰度出现的概率,将其存入GP中相应位置

end

subplot(2,2,2),bar(0:255,GP,'g')%绘制直方图

title('灰度直方图')

xlabel('灰度值')

ylabel(' 出现概率')

I2=im2bw(I,150/255);

subplot(2,2,3),imshow(I2);

title('阈值150的分割图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

I3=im2bw(I,200/255); %

subplot(2,2,4),imshow(I3);

title('阈值200的分割图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

14 自动阈值法:Otsu法

用MATLAB实现Otsu算法:

clc

clear all

I=imread('xianbmp');

subplot(1,2,1),imshow(I);

title('原始图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

level=graythresh(I); %确定灰度阈值

BW=im2bw(I,level);

subplot(1,2,2),imshow(BW);

title('Otsu 法阈值分割图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

15膨胀 *** 作

I=imread('xianbmp'); %载入图像

I1=rgb2gray(I);

subplot(1,2,1);

imshow(I1);

title('灰度图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

se=strel('disk',1); %生成圆形结构元素

I2=imdilate(I1,se); %用生成的结构元素对图像进行膨胀

subplot(1,2,2);

imshow(I2);

title(' 膨胀后图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

16腐蚀 *** 作

MATLAB 实现腐蚀 *** 作

I=imread('xianbmp'); %载入图像

I1=rgb2gray(I);

subplot(1,2,1);

imshow(I1);

title('灰度图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

se=strel('disk',1); %生成圆形结构元素

I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀

subplot(1,2,2);

imshow(I2);

title('腐蚀后图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

17开启和闭合 *** 作

用 MATLAB实现开启和闭合 *** 作

I=imread('xianbmp'); %载入图像

subplot(2,2,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

axis on; %显示坐标系

I1=rgb2gray(I);

subplot(2,2,2),imshow(I1);

title('灰度图像');

axis([50,250,50,200]);

axis on; %显示坐标系

se=strel('disk',1); %采用半径为1的圆作为结构元素

I2=imopen(I1,se); %开启 *** 作

I3=imclose(I1,se); %闭合 *** 作

subplot(2,2,3),imshow(I2);

title('开启运算后图像');

axis([50,250,50,200]);

axis on; %显示坐标系

subplot(2,2,4),imshow(I3);

title('闭合运算后图像');

axis([50,250,50,200]);

axis on; %显示坐标系

18开启和闭合组合 *** 作

I=imread('xianbmp');%载入图像

subplot(3,2,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

axis on;%显示坐标系

I1=rgb2gray(I);

subplot(3,2,2),imshow(I1);

title('灰度图像');

axis([50,250,50,200]);

axis on;%显示坐标系

se=strel('disk',1);

I2=imopen(I1,se);%开启 *** 作

I3=imclose(I1,se);%闭合 *** 作

subplot(3,2,3),imshow(I2);

title('开启运算后图像');

axis([50,250,50,200]);

axis on;%显示坐标系

subplot(3,2,4),imshow(I3);

title('闭合运算后图像');

axis([50,250,50,200]);

axis on;%显示坐标系

se=strel('disk',1);

I4=imopen(I1,se);

I5=imclose(I4,se);

subplot(3,2,5),imshow(I5);%开—闭运算图像

title('开—闭运算图像');

axis([50,250,50,200]);

axis on;%显示坐标系

I6=imclose(I1,se);

I7=imopen(I6,se);

subplot(3,2,6),imshow(I7);%闭—开运算图像

title('闭—开运算图像');

axis([50,250,50,200]);

axis on;%显示坐标系

19形态学边界提取

利用 MATLAB实现如下:

I=imread('xianbmp');%载入图像

subplot(1,3,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

grid on;%显示网格线

axis on;%显示坐标系

I1=im2bw(I);

subplot(1,3,2),imshow(I1);

title('二值化图像');

axis([50,250,50,200]);

grid on;%显示网格线

axis on;%显示坐标系

I2=bwperim(I1); %获取区域的周长

subplot(1,3,3),imshow(I2);

title('边界周长的二值图像');

axis([50,250,50,200]);

grid on;

axis on;

20形态学骨架提取

利用MATLAB实现如下:

I=imread('xianbmp');

subplot(2,2,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

axis on;

I1=im2bw(I);

subplot(2,2,2),imshow(I1);

title('二值图像');

axis([50,250,50,200]);

axis on;

I2=bwmorph(I1,'skel',1);

subplot(2,2,3),imshow(I2);

title('1次骨架提取');

axis([50,250,50,200]);

axis on;

I3=bwmorph(I1,'skel',2);

subplot(2,2,4),imshow(I3);

title('2次骨架提取');

axis([50,250,50,200]);

axis on;

21直接提取四个顶点坐标

I = imread('xianbmp');

I = I(:,:,1);

BW=im2bw(I);

figure

imshow(~BW)

[x,y]=getpts

平滑滤波

h=fspecial('average',9);

I_gray=imfilter(I_gray,h,'replicate');%平滑滤波

function [x, k, index]=Jacobi(A, b, ep, it_max)

% 求解线性方程组的Jacobi迭代法,其中

% A --- 方程组的系数矩阵

% b --- 方程组的右端项

% ep --- 精度要求。省缺为1e-5

% it_max --- 最大迭代次数,省缺为100

% x --- 方程组的解

% k --- 迭代次数

% index --- index=1表示迭代收敛到指定要求;

% index=0表示迭代失败

if nargin <4 it_max=100; end %输入参数少于4时,默认最大迭代次数为100

if nargin <3 ep=1e-5; end %输入参数少于3时,默认精度要求为1e-5

n=length(A); %矢量或矩阵A的列长度,即方程的个数

k=0; %初值为0

x=zeros(n,1); y=zeros(n,1); index=1;%初值设置

while 1 %while-end 循环开始

for i=1:n %i循环次数

y(i)=b(i); %给y赋值

for j=1:n %j循环次数

if j~=i %条件判断,j≠i时,

y(i)=y(i)-A(i,j)x(j); %y(i)的值修改

end

end

if abs(A(i,i))<1e-10 || k==it_max %A的主对角线元素的绝对值小于1e-10或k=最大迭代次数时,

index=0; return; %表明迭代失败

end

y(i)=y(i)/A(i,i); %判断,j=i时,y(i)的值修改

end

if norm(y-x,inf)<ep %判断,y-x的无穷范数小于精度要求,

break; %返回下一步,继续计算

end

x=y; k=k+1; %x得到y值,计算总迭代次数k

end %while-end 循环结束

我有个作业是这,程序添加了些注释,希望对你有帮助~

clear all;

allsamples=[];

for i=1:20

for j=1:5

a=imread(strcat('ORL\s',num2str(i),'\',num2str(j),'bmp')); %读取人脸图像

b=a(1:11292); %将图像数据转为一行

b=double(b);

allsamples=[allsamples; b]; %将所有图像205,组成数组

end

end

%用PCA方法进行特征提取

samplemean=mean(allsamples); %求均值

for i=1:100

xmean(i,:)=allsamples(i,:)-samplemean;

end;

sigma=xmeanxmean'; %协方差矩阵

[v d]=eig(sigma); %求矩阵特征值和特征向量

d1=diag(d); %特征值的对角阵

[d2 index]=sort(d1); %对对角阵的值排序

cols=size(v,2); %特征向量的行数值

for i=1:cols

vsort(:,i) = v(:, index(cols-i+1) ); %对特征值和特征向量进行排序

dsort(i) = d1( index(cols-i+1) );

end

%选择90%的能量

dsum = sum(dsort);

dsum_extract = 0;

p = 0;

while( dsum_extract/dsum < 09)

p = p + 1;

dsum_extract = sum(dsort(1:p));

end

i=1;

while (i<=p && dsort(i)>0)

base(:,i) = xmean' vsort(:,i); %构成投影矩阵

i = i + 1;

end

allcoor = allsamples base; %构成训练集的特征矩阵

clc

[filename,pathname]=uigetfile('','Select image'); %选择图像

[img,map]=imread(strcat(pathname,filename));

b=img(1:10304);

b=double(b);

tcoor= b base; %构成测试集的特征矩阵

for k=1:100

mdist(k)=norm(tcoor-allcoor(k,:));

end;

%最近邻方法

[dist,index2]=sort(mdist);

class=floor( index2(1)/5 )+1; %求所属分类

disp(class);

subplot(1,2,1),imshow(img); %输出分类图像

filename = sprintf('ORL\\s%d\\1bmp',class);

I=imread(filename);

subplot(1,2,2),imshow(I);

上文借用了numpy和pandas等模块自编了k-近邻算法 python之k-近邻算法(非sklearn版) ,这次借用sklearn轮子来实现一下

数据还是用上篇文章的数据来 >

上篇文章我们是利用KNNpy中的自编函数panduan在读取数据的过程中来实现的,而这种转变在sklearn中已经有轮子调用了

这里再补充一点:对于类别数据(对于特征值也是适用的),可以分为 标称特征(nominal feature) 有序特征(ordinal feature)

对于我们这里的数据largeDoses,smallDoses,didntLike应该是对应着有序特征

如果在这里'喜欢的类别'本身不带有有序的含义的话,即largeDoses,smallDoses,didntLike三个类别没有序别之分,可以借用sklearn里的功能

可以看到借用sklearn是比较方便的

但是。。。。。但是。。。。以上的0,1,2在算法看来依然是有顺序的,所以我们可以利用 独热编码(one-hot encoding) ,即创建一个新的虚拟特征(dummy feature)

也可以利用pandas里的功能

————————————————————————————————————

特征缩放(feature scaling)对于除了决策树和随机森林两个算法没用以外,对其他算法和优化算法来讲都是必不可少的

即上篇文章所涉及到的

对于线性模型来讲,标准化更加好,一是符合线性模型对权重的处理,二是保留了异常值的信息

———————————————————————————————————

上篇文章对于此类问题的处理见 datingClassTest 函数

K-近邻算法被称之为 惰性算法 ,和其他机器学习算法不一样,因为他仅仅是对训练数据集有记忆功能,而不是从训练集中通过学习得到一个判别函数,即不需要训练,看过上篇文章的小伙伴应该会有体会。 缺点是计算复杂度会随着样本数量的增长而呈线性增长,除非数据集中特征数量有限

如何通过图像的灰度值矩阵判断物体真假matlab,彩色图像:每个像素由R、G、B三个分量表示,每个通道取值范围0~255。(通一个彩色图像是由三页组成的,分别是R、G、B,每一页都是一个二维矩阵)

灰度图像:每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度。灰度值分布在0~255之间。

二值图像(黑白图像):每个像素点只有两种可能,0和10代表黑色,1代表白色。数据类型通常为1个二进制位。

以上就是关于求MATLAB代码全部的内容,包括:求MATLAB代码、求解matlab程序、matlab 程序问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10217466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存