ZBLOG

用matlab和神经网络实现圆、三角形、正方形图像的分类与识别

在MATLAB中,我们可以使用神经网络工具箱(Neural Network Toolbox)来实现图像分类和识别任务。下面以圆、三角形、正方形图像的分类与识别为例,介绍如何使用神经网络工具箱进行实现。

首先,我们需要准备数据集。这里我们随机生成一些圆、三角形、正方形的图像,并将它们转换成灰度图像。

% 随机生成100个圆、三角形、正方形的图像
num_images = 100;
images = cell(1, num_images);
labels = zeros(num_images, 3);

for i = 1:num_images
    % 随机生成一个0~2之间的整数,表示要生成哪种图形
    shape_type = randi(3);
    if shape_type == 1 % 圆形
        r = randi([10, 20]); % 随机生成半径大小
        img = uint8(zeros(30, 30)); % 创建一个空白图像
        [X,Y] = meshgrid(1:30,1:30);
        circle_mask = (X-15).^2 + (Y-15).^2 <= r^2; % 创建一个圆形掩膜
        img(circle_mask) = 255; % 将掩膜内部赋值为255,表示该区域为白色
    elseif shape_type == 2 % 正方形
        l = randi([15, 20]); % 随机生成边长大小
        img = uint8(zeros(30, 30)); % 创建一个空白图像
        img(6:5+l, 6:5+l) = 255; % 在指定区域内赋值为255,表示该区域为白色
    else % 三角形
        h = randi([15, 20]); % 随机生成高度大小
        img = uint8(zeros(30, 30)); % 创建一个空白图像
        triangle_mask = zeros(30, 30); % 创建一个三角形掩膜
        x1 = randi([6, 24]);
        y1 = randi([6+h, 23]);
        x2 = randi([6+h/2, x1-(h/2)]);
        y2 = randi([max(y1-h,x1), min(y1,x1+(h/2))]);
        x3 = randi([x1+(h/2),24]);
        y3 = randi([max(y1-h,x1), min(y1,x2+(h/2))]);
        triangle_mask(x1,y1) = 255;
        triangle_mask(x2,y2) = 255;
        triangle_mask(x3,y3) = 255;
        
        se_dilate_disk=strel('disk',4);
        
	% 对掩膜进行膨胀操作,使得三角形更加清晰明显 
	mask=imdilate(triangle_mask,se_dilate_disk);
        
	img(mask)=255;  
    end
    
    images{i} = img;
    
    if shape_type == 1 % 圆形标签为[1,0,0]
        labels(i, :) = [1, 0, 0];
    elseif shape_type == 2 % 正方形标签为[0,1,0]
        labels(i, :) = [0, 1, 0];
    else % 三角形标签为[0,0,1]
        labels(i, :) = [0, 0, 1];
    end
end

% 显示前10个图像
figure;
for i = 1:10
    subplot(2,5,i);
    imshow(images{i});
end

接下来,我们需要将图像数据转换成神经网络的输入格式。在这里,我们将每个图像转换成一个向量,并将所有向量组合成一个矩阵。

% 将每个图像转换成一个向量
image_size = numel(images{1}); % 图像大小(900)
num_images = length(images); % 图像数量(100)
X = zeros(num_images, image_size);

for i = 1:num_images
    X(i,:) = images{i}(:)';
end

% 将标签矩阵转置为列向量
Y = labels';

现在,我们可以使用神经网络工具箱中的nprtool命令打开神经网络训练工具界面。在该界面中,我们可以选择不同的神经网络模型、设置训练参数,并进行训练和测试。

在这里,我们选择了一个3层全连接神经网络模型,其中第一层有20个隐藏节点、第二层有10个隐藏节点、第三层有3个输出节点(对应圆、三角形、正方形)。我们使用交叉熵作为损失函数,使用Adam优化算法进行训练。最终的训练结果如下:

% 创建并训练神经网络模型
net = feedforwardnet([20,10]);
net.trainFcn = 'trainscg';
net.layers{1}.transferFcn = 'logsig';
net.layers{2}.transferFcn = 'logsig';
net.layers{3}.transferFcn = 'softmax';
[net,tr] = train(net,X',Y);

在训练完成后,我们可以使用神经网络对新图像进行分类和识别。

% 加载测试图像
test_img1 = imread('test_circle.png');
test_img2 = imread('test_triangle.png');
test_img3 = imread('test_square.png');

% 将测试图像转换成灰度图像,并调整大小为30x30
test_img1_gray = imresize(rgb2gray(test_img1), [30 30]);
test_img2_gray = imresize(rgb2gray(test_img2), [30 30]);
test_img3_gray = imresize(rgb2gray(test_img3), [30 30]);

% 显示测试图像
figure;
subplot(1,3,1);
imshow(test_img1);
title('Test Image 1 (Circle)');
subplot(1,3,2);
imshow(test_img2);
title('Test Image 2 (Triangle)');
subplot(1,3,3);
imshow(test_img3);
title('Test Image 3 (Square)');

% 将测试图像转换成向量格式
test_X = zeros(3, image_size);
test_X(1,:) = test_img1_gray(:)';
test_X(2,:) = test_img2_gray(:)';
test_X(3,:) = test_img3_gray(:)';

% 使用神经网络进行分类和识别
[~, idx] = max(net(test_X'));
if idx(1) == 1 % 输出为圆形
    disp('Test Image 1 is a Circle');
elseif idx(1) == 2 % 输出为正方形
    disp('Test Image 1 is a Triangle');
else % 输出为三角形
    disp('Test Image 1 is a Square');
end

if idx(2) == 1 % 输出为圆形
    disp('Test Image 2 is a Circle');
elseif idx(2) == 2 % 输出为正方形
    disp('Test Image 2 is a Triangle');
else % 输出为三角形
    disp('Test Image 2 is a Square');
end

if idx(3) == 1 % 输出为圆形
    disp('Test Image 3 is a Circle');
elseif idx(3) == 2 % 输出为正方形
    disp('Test Image 3 is a Triangle');
else % 输出为三角形
    disp('Test Image 3 is a Square');
end

通过以上代码,我们就可以使用神经网络实现对圆、三角形、正方形图像的分类与识别。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=6187

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?