目录
实验六、图像分割方法
实验七、图像识别与分类
实验六、图像分割方法
一、实验目的
- 了解图像分割技术相关基础知识;
- 掌握几种经典边缘检测算子的基本原理、实现步骤
- 理解阈值分割、区域分割等的基本原理、实现步骤。
- 理解分水岭分割方法的基本原理、实现方法。
二、实验环境
MATLAB 2014以上版本、Win 8\10\11 系统
三、实验原理
1.图像分割原理
图像分割是把图像分割成若干个特定的、具有独特性质的区域并提取出感兴趣的目标的技术和过程。在对图像的研究和应用中,人们往往仅对图像的某些部分感兴趣(目标或背景),一般对应图像中特定的、具有独特性质的区域。为了分析和识别目标,需要将这部分区域分割并提取出来。由于图像分割技术在当今图像工程的发展过程中起着十分重要的作用,得到了广泛应用,促使人们致力于寻找新的理论和方法来提高图像分割的质量,以满足各方面的需求。
涉及函数:imread、figure、imshow、subplot、rgb2gray、imwrite、edge、graythresh
四、实验内容
(1)新建一个m文件,从桌面示例图像文件夹中读取一张彩色图像,转换为灰度图,分别使用Robert、Sobel、Canny、Laplacian算子检测图像边缘,并将原图及边缘检测结果显示在同一figure界面,比较检测结果异同。
clc;clear;close all;
I=imread('V.jpg');
gray_img = rgb2gray(I);
BW1=edge(gray_img,'Roberts',0.04);
BW2=edge(gray_img,'Sobel',0.04);
BW3=edge(gray_img,'Canny',0.04);
BW4=edge(gray_img,'log',0.04);
subplot(321),imshow(I),title('原图像')
subplot(323),imshow(BW1),title('Roberts检测图像')
subplot(324),imshow(BW2),title('Sobel检测图像')
subplot(325),imshow(BW3),title('Canny检测图像')
subplot(326),imshow(BW4),title('Laplacian检测图像')
(2)读取一张彩色图像,转换为灰度图,使用最大类间方差法分割图像,原图及分割结果显示在同一界面。
clc;clear;clear all;
% 读取彩色图像
color_img = imread('V.jpg');
% 转换为灰度图像
gray_img = rgb2gray(color_img);
% 最大类间方差法分割图像
threshold = graythresh(gray_img);
seg_img = imbinarize(gray_img, threshold);
% 显示原图及分割结果
figure;
subplot(1,2,1);
imshow(color_img);
title('原图');
subplot(1,2,2);
imshow(seg_img);
title('分割结果');
(3)读取一张彩色图像,使用区域生长法对图像进行分割,原图及分割结果显示在同一界面。
clc;clear;close all;
A0=imread('V.jpg');%读取图像
seed=[1,2];%选择起始位置
thresh=15;%相似性选择阈值
A=rgb2gray(A0);%灰度化
A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]);
A=double(A);%将图像灰度化
B=A;
[r,c]=size(B);%r为行数,c为列
n=r*c;%计算图像包含点的个数
pixel_seed=A(seed(1),seed(2));%原图起始点灰度值
q=[seed(1),seed(2)];%q用来装载起始位置
top=1;%循环判断flag
M=zeros(r,c);%建立一个与原图大小一样的矩阵
M(seed(1),seed(2))=1;%将起始点赋为1,其余为0
count=1;%计数器
while top~=0 %循环结束条件
r1=q(1,1);%起始点行位置
c1=q(1,2);%起始点列位置
p=A(r1,c1);%起始点灰度值
dge=0;
for i=-1:1%周围点循环判断
for j=-1:1
if r1+i<=r & r1+i>0 & c1+j<=c & c1+j>0%保证在点周围范围内
if abs(A(r1+i,c1+j)-p)<=thresh & M(r1+i,c1+j)~=1
top=top+1;%满足判定条件则top+1,top为多少,则q的行数有多少
q(top,:)=[r1+i,c1+j];%将满足判定条件的周围点位置赋予q,q记载了满足判定的每一外点
M(r1+i,c1+j)=1;%满足判定条件将M中相对应的点赋1
count=count+1;%统计满足条件的点个数,其实与top此时的值一样
B(r1+i,c1+j)=1;%满足判定条件将B中相对应点赋值1
end
if M(r1+i,c1+j)==0;%如果M中相对应的值为0,将dge赋值为1,也就是说这几个点不满足条件
dge=1;
end
else
dge=1;%在图像外将dge赋值为1
end
end
end
%此时对周围几点判断完毕,在点在图像外或不满足判定条件则将dge赋为1,满足条件dge为0
if dge~=1
B(r1,c1)=A(seed(1),seed(2));%将原图起始位置赋予B
end
if count>=n%如果满足判定条件的点个数大于等于n
top=1;
end
q=q(2:top,:);
top=top-1;
end
subplot(121),imshow(A,[]);
subplot(122),imshow(B,[]);
(4)读取一张彩色图像,使用一般分水岭算法对图像进行分割,原图及分割图像显示在同一界面。
clc;clear;close all;
% 读取彩色图像
image = imread('V.jpg');
% 将图像转换为灰度图像
gray_image = rgb2gray(image);
% 对灰度图像进行分水岭分割
segmented_image = watershed(gray_image);
% 将原图和分割图像显示在同一界面
figure;
subplot(1,2,1);
imshow(image);
title('原图');
subplot(1,2,2);
imshow(segmented_image);
title('分割图像');
实验七、图像识别与分类
一、实验目的
- 了解图像识别与分类技术相关基础知识;
- 掌握几种图像特征提取方法的基本原理、实现步骤
- 了解图像识别与分类的基本原理、实现步骤。
- 掌握基础图像识别与分类任务设计方法,并编程实现。
二、实验环境
MATLAB 2014以上版本、Win 8\10\11 系统
三、实验原理
图像识别是指通过计算机对图像进行处理、分析和处理,以识别各种不同模式的目标和对象的技术,图像分类则是根据目标的不同特征基于分类器或判别器判别输入图像所属类别过程。图像的识别与分类是数字图像处理与分析领域中最为经典的应用与任务之一。
传统图像识别与分类方法基本流程如下:
涉及函数:imread、figure、imshow、subplot、rgb2gray、imwrite、imdilate、bwmorph、strel、imerode等
四、实验内容
(1)新建一个m文件,从桌面示例图像文件夹中读取一张彩色图像,转换为灰度图,使用strel构造两个不同的结构元素,接着利用imdilate函数分别进行膨胀处理,并将原图及两个膨胀处理结果显示在同一figure界面。
clc;clear;close all;
I=imread('V.jpg');
J=rgb2gray(I);
se1=strel('ball',5,5);
se2=strel('octagon',3);
K1=imdilate(J,se1);
K2=imdilate(J,se2);
figure
subplot(131),imshow(I),title('原图像')
subplot(132),imshow(K1),title('膨胀结果1')
subplot(133),imshow(K2),title('膨胀结果2')
(2)从桌面示例图像文件夹中读取一张彩色图像,转换为灰度图,使用strel构造两个不同的结构元素,接着利用imerode函数分别进行腐蚀处理,并将原图及两个腐蚀处理结果显示在同一figure界面。
clc;clear;close all;
I=imread('V.jpg');
J=rgb2gray(I);
se1=strel('ball',5,5);
se2=strel('octagon',3);
K1=imerode(J,se1);
K2=imerode(J,se2);
figure
subplot(131),imshow(I),title('原图像')
subplot(132),imshow(K1),title('腐蚀结果1')
subplot(133),imshow(K2),title('腐蚀结果2')
(3)使用im2bw函数将下图转为二值图像,使用开运算先腐蚀后膨胀,分别提取图中的矩形块及线段,结果显示在同一figure,分别命名为“原始二值图像”、“矩形块提取结果”、“线段提取”。
clc;clear;close all;
% 读取图像
image = imread('a.jpg');
% 将图像转为二值图像
binary_image = im2bw(image);
% 创建一个新的figure,并将原始二值图像显示在第一个子图中
figure;
% 子图1:原始二值图像
subplot(1, 3, 1);
imshow(binary_image);
title('原始二值图像');
% 应用开运算进行腐蚀和膨胀
se = strel('square', 5); % 定义一个5x5的正方形结构元素
opened_image = imopen(binary_image, se);
% 子图2:矩形块提取结果
subplot(1, 3, 2);
imshow(opened_image);
title('矩形块提取结果');
% 提取线段
line_image = binary_image - opened_image;
% 子图3:线段提取结果
subplot(1, 3, 3);
imshow(line_image);
title('线段提取');
% 调整子图的布局
sgtitle('图像处理结果');
(4)将下图转为二值图像,并进行降噪、锐化处理,通过形态学运算提取轮廓,并进行计数。
clc;clear;close all;
% 读取图像
image = imread('b.jpg');
% 将图像转为灰度图像
grayImage = rgb2gray(image);
% 将灰度图像转为二值图像
binaryImage = imbinarize(grayImage);
% 降噪处理
denoisedImage = medfilt2(binaryImage);
% 锐化处理
sharpKernel = fspecial('unsharp');
sharpImage = imfilter(denoisedImage, sharpKernel, 'replicate');
% 形态学运算提取轮廓
se = strel('disk', 1); % 创建一个半径为1的圆形结构元素
morphImage = imtophat(sharpImage, se);
% 计数轮廓
[~, count] = bwlabel(morphImage);
% 显示处理结果
figure;
subplot(2, 2, 1);
imshow(binaryImage);
title('二值图像');
subplot(2, 2, 2);
imshow(denoisedImage);
title('降噪处理');
subplot(2, 2, 3);
imshow(sharpImage);
title('锐化处理');
subplot(2, 2, 4);
imshow(morphImage);
title('形态学运算提取轮廓');
% 显示轮廓数量
disp(['轮廓数量:', num2str(count)]);