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




