Matlab的KNN分类使用(附源码),实现像素分类(自己设置训练集比例),打印测试精度

Matlab的KNN使用

在这里,我们对Matlab里面的KNN使用进行讲解。
fitcknn函数使用
我们主要是实现单个图片的像素分类。
有一个原图,还有一个label.txt,这个txt里面是每一个像素所属的类别。

请添加图片描述
原图

在这里插入图片描述
txt大概展示的图像分类

思路:
注意:
我们是将RGB图像的同一个位置的三个像素值(也就是特征值)给一个标签。
先读取图片和标签。

img=imread('train.jpg');
label=textread('label.txt');

然后获得标签大小。
我们将一个图分为训练集和测试集,行数不变,然后列数取对应的比例。
我们将图片和标签分别取0.5的比例。
在这里插入图片描述

展示的图片是三通道的,然后为了使每一个像素点的特征值能多一点,所以对图片进行了腐蚀与重建,使图像更加具有分类性和将每一个像素点的特征值变为6个。也就是将原图和变换后的图像就像拼接,对测试集的处理也是这样。

然后创建分类器
现在高版本用的是fitknn。传入的是特征值,标签,说明,K值。

mdl = fitcknn(imgtrain,labeltrain,'NumNeighbors',3);

之后对测试集进行预处理。
再通过KNN模型对测试集进行预测,然后将预测的标签和真实标签进行比较,得到准确率。

predictlab = predict(mdl,img_stack);

结果:在这里插入图片描述
准确率:
在这里插入图片描述
不同的K值会得到不同的结果。
我们这里的结果比较差很有可能是因为标签的分类比较粗糙,然后KNN分类器的结果比较细致,所以导致结果比较差。

源码:

close all; 
clear; 
clc;
img=imread('train.jpg');
label=textread('label.txt');
[m,n]=size(label);
imgtrain = img(:,1:0.5*n,:);
labeltrain = label(:,1:0.5*n);
subplot(1,4,1),imshow(imgtrain,[]);
subplot(1,4,2),imshow(labeltrain,[]);

se1=strel('disk',3);
img_erode=imerode(imgtrain, se1);
img_reop=imreconstruct(img_erode,imgtrain);
img_stack=cat(3,imgtrain,img_reop);
imgtrain=reshape(img_stack,320*120,6);
labeltrain=reshape(labeltrain,320*120,1);
mdl = fitcknn(imgtrain,labeltrain,'NumNeighbors',3);%k为对应的1,2,3,4.....

imgtest = img(:,0.5*n+1:n,:);
img_erode=imerode(imgtest, se1);
img_reop=imreconstruct(img_erode,imgtest);
img_stack=cat(3,imgtest,img_reop);
labeltest = label(:,0.5*n+1:n);
labeltest = reshape(labeltest,320*120,1);
img_stack=reshape(img_stack,320*120,6);

predictlab = predict(mdl,img_stack);
accuracy=length(find(predictlab==labeltest))/length(labeltest)*100;
subplot(1,4,3),imshow(imgtest,[]);
subplot(1,4,4),imshow(reshape(predictlab, 320,120),[]);

路漫漫其修远兮,吾将上下而求索!!!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>