数字图像处理:图像分割
数字图像处理:图像分割
直接跳转到代码
前言:这个实验分成两部分代码,分别对应1和2
- 膨胀:将与目标区域的背景点合并到该目标物中,使目标物边界向外部扩张的处理,把二值图像各1像素连接成分的边界扩大一层。具体操作为:图像中关心的像素(结构元素B中值为1的部分)有1,则结果赋值为1,没有1,则赋值0。
腐蚀:消除连通域的边界点,使边界向内收缩的处理。贴标签是对不同连通域区分和标记的基本算法,把二值图像各1像素连接成分的边界点去掉从而缩小一层。 - 开操作:先腐蚀再膨胀,可以去掉目标外的孤立点
闭操作:先膨胀再腐蚀,可以去掉目标内的孔。
注:别忘了图片的路径改成自己的
一、实验目的
理解和掌握图像分割的基本理论和算法,练习使用形态学、区域、边界和阈值的方法结合图像增强复原的相关知识对图像进行分割处理。
二、实验内容
1.读入一幅图像,对图像进行如下操作:
(1) 用膨胀腐蚀等形态学方法对图像进行去噪、增强处理。改变结构元素,观察处理后的图像是否有明显的差别。
(2) 用开操作和闭操作等形态学方法去除指纹图像中的细小颗粒,连接断裂的指纹。
(3) 在上一步用形态学方法处理后的指纹图像基础上,运用全局阈值实现图像的二值化。
2.读入一幅图像,利用边缘检测和分水岭方法(watershed)对图像进行前景分割。在调用watershed函数前,利用prewitt算子或者全局阈值等方法增强图像边缘。
实验结果图如下:
1. 第一部分实验结果(两种图片来观察结果,此外我在作腐蚀时改变了两种结构元素来进行观察)
2. 第二部分实验结果(两种图片来观察结果):
代码如下:
###### 第一部分代码%手动实现膨胀和腐蚀
%img=imread('finger_noise.tif');
img=im2bw(imread('test.png'));
figure('name','实验结果');
number=5;% 定义number行图片
subplot(number,3,1);
imshow(img);
title('原图');
subplot(number,3,4);
imshow(img);
title('原图');
subplot(number,3,7);
imshow(img);
title('原图');
B=[0 1 0
1 1 1
0 1 0]; %结构元素
[row,col]=size(img);%获得图像的高和宽
%对img进行膨胀
imgdilate=img;
for i=2:row-1
for j=2:col-1
pitch=img(i-1:i+1,j-1:j+1);
convtmp= pitch.*B; %用img中的一块与结构元素作卷积
if sum(convtmp(:))>0
imgdilate(i,j)=1;%非零则赋值1
else
imgdilate(i,j)=0;%零则仍赋值0
end
end
end
subplot(number,3,2);
imshow(imgdilate);
title('膨胀后结果');
%对img进行腐蚀
imgerode=img;
C=sum(B(:)); %结构元素B中关心的元素个数
for i=2:row-1
for j=2:col-1
pitch=img(i-1:i+1,j-1:j+1);
convtmp= pitch.*B; %用img中的一块与结构元素作卷积
if sum(convtmp(:))<C
imgerode(i,j)=0;
else
imgerode(i,j)=1;
end
end
end
subplot(number,3,3);
imshow(imgerode);
title('腐蚀后结果');
B= [1 1 1;1 1 1;1 1 1]%更改结构元素[1 1 1;1 1 1;1 1 1],[1 0 1;0 1 0;1 0 1]
%开操作(对腐蚀后的图像再进行一次膨胀)
imgopen=imgerode;
for i=2:row-1
for j=2:col-1
pitch=imgerode(i-1:i+1,j-1:j+1);
convtmp= pitch.*B; %用img中的一块与结构元素作卷积
if sum(convtmp(:))>0 %非零则赋值1
imgopen(i,j)=1;
else
imgopen(i,j)=0;%零则仍赋值0
end
end
end
subplot(number,3,5);
imshow(imgopen);
title('开操作后结果,结构元素为[1 1 1;1 1 1;1 1 1]');
%闭操作(对膨胀后的图像再进行一次腐蚀)
imgclose=imgdilate;
C=sum(B(:)); %结构元素B中关心的元素个数
for i=2:row-1
for j=2:col-1
pitch=imgdilate(i-1:i+1,j-1:j+1);
convtmp= pitch.*B; %用img中的一块与结构元素作卷积
if sum(convtmp(:))<C
imgclose(i,j)=0;
else
imgclose(i,j)=1;
end
end
end
subplot(number,3,6);
imshow(imgclose);
title('闭操作后结果,结构元素为[1 1 1;1 1 1;1 1 1]');
B= [1 0 1;0 1 0;1 0 1]%更改结构元素[1 1 1;1 1 1;1 1 1],[1 0 1;0 1 0;1 0 1]
%开操作(对腐蚀后的图像再进行一次膨胀)
imgopen=imgerode;
for i=2:row-1
for j=2:col-1
pitch=imgerode(i-1:i+1,j-1:j+1);
convtmp= pitch.*B; %用img中的一块与结构元素作卷积
if sum(convtmp(:))>0 %非零则赋值1
imgopen(i,j)=1;
else
imgopen(i,j)=0;%零则仍赋值0
end
end
end
subplot(number,3,8);
imshow(imgopen);
title('开操作后结果,结构元素为[1 0 1;0 1 0;1 0 1]');
%闭操作(对膨胀后的图像再进行一次腐蚀)
imgclose=imgdilate;
C=sum(B(:)); %结构元素B中关心的元素个数
for i=2:row-1
for j=2:col-1
pitch=imgdilate(i-1:i+1,j-1:j+1);
convtmp= pitch.*B; %用img中的一块与结构元素作卷积
if sum(convtmp(:))<C
imgclose(i,j)=0;
else
imgclose(i,j)=1;
end
end
end
subplot(number,3,9);
imshow(imgclose);
title('闭操作后结果,结构元素为[1 0 1;0 1 0;1 0 1]');
subplot(number,3,10);
imshow(imgdilate);
title('原图');
%确定全局阈值T
T=0.5*(double(min(imgdilate(:)))+double(max(imgdilate(:))));%设置初始阈值为最大灰度和最小灰度值和的一半
done=false;
while ~done
g=imgdilate>=T;%分成两组像素,灰度值大于或者等于T的和灰度值小于T的
Tnext=0.5*(mean(imgdilate(g))+mean(imgdilate(~g)));%新阈值两个范围内像素平均值和的一半
done=abs(T-Tnext)<0.5; %0.5是自己指定的参数
T=Tnext;
end
imout2=im2bw(imgdilate,T);
subplot(number,3,11);
imshow(imout2);
title('膨胀后全局二值化');
%确定全局阈值T
T=0.5*(double(min(imgerode(:)))+double(max(imgerode(:))));%设置初始阈值为最大灰度和最小灰度值和的一半
done=false;
while ~done
g=imgerode>=T;%分成两组像素,灰度值大于或者等于T的和灰度值小于T的
Tnext=0.5*(mean(imgerode(g))+mean(imgerode(~g)));%新阈值两个范围内像素平均值和的一半
done=abs(T-Tnext)<0.5; %0.5是自己指定的参数
T=Tnext;
end
imout3=im2bw(imgerode,T);
subplot(number,3,12);
imshow(imout3);
title('腐蚀后全局二值化');
第二部分代码
%pic =imread('finger.tif')
pic =imread('rice.tif')
number=2
subplot(number,3,1);
imshow(pic);
title('原图');
% 使用prewitt算子增强
G=imfilter(pic,fspecial('prewitt'));%生成’prewitt’模板,并对输入图像做边缘增强,再加上原图像
subplot(number,3,2);
imshow(G);
title('prewitt算子增强后图像');
L=watershed(G); %分水岭算法
wr=L==0; %取出边缘
subplot(number,3,3);
imshow(wr);
title('分水岭');
pic(wr)=255;
subplot(number,3,5);
imshow(uint8(pic));
title('前景分割结果');