实现用三种边缘检测算子对一幅图像提取边缘
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现用三种边缘检测算子对一幅图像提取边缘,给出结果并分析。
用sobel,log,candy三种算子对图像进行边缘提取:
f = imread('E:\木子的U盘\大三的木子\第一学期\数字图像处理\xback.jpg');
f = rgb2gray(f); %将图像转化为灰度图像
[gsobel_default,ts] = edge(f,'sobel');%利用sobel算子的默认语法得到边缘图像subplot(231);
imshow(gsobel_default);
title('g sobel default');
[glog_default,tlog]=edge(f,'log');%利用log算子的默认语法得到边缘图像subplot(233);
imshow(glog_default);
title('g log default');
[gcanny_default,tc]=edge(f,'canny');%利用candy算子的默认语法得到边缘图像subplot(235);
imshow(gcanny_default);
title('g canny default');
gSobel_best=edge(f,'sobel',0.05);%减少不必要的细节
subplot(232);
imshow(gSobel_best);
title('g sobel best');
gLog_best=edge(f,'log',0.003,2.25);%
subplot(234);
imshow(gLog_best);
title('g log best');
gCanny_best=edge(f,'canny',[0.04 0.10],1.5);%
subplot(236);
imshow(gCanny_best);
title('g canny best');
MATLAB图像显示如下:
分析如下:
sobel得出的结果与试图检测边缘的目标相差太远。
log结果与sobel结果相比要好一些,与log默认值得出的结果相比要好很多。
而candy结果也要远远好于前两种。
除了检测期望的特征外,candy检测还产生了最清晰的图。
2
实现基本全局阈值处理、Otsu方法对一幅图像进行分割,给出结果并分析两种方法
基本全局阈值处理和Otsu方法处理程序如下:
f = imread('coins.png');
subplot(221);
imshow(f);
title('原图');
level = graythresh(f);% OTSU 阈值
BW = im2bw(f,level);
subplot(222);
imshow(BW);
title('使用OTSU阈值分割图');
count=0; %使用基本全局阈值分割
T=mean2(f);
done=false;
while -done
count=count+1;
g=f>T;
Tnext=0.5*(mean(f(g))+mean(f(-g)));
done=abs(T-Tnext)<0.5;
T=Tnext;
end
count;
count=2;
T;
T=125.3860;
g=im2bw(f,T/255);%分割图像
subplot(223);
imshow(f);
title('原图');
subplot(224);
imshow(g);
title('使用基本全局阈值分割图');
MATLAB显示结果如下:
分析:基本全局阈值处理算法在两次迭代后就收敛了,并且得到了一个靠近灰度中点的阈值。
可以期待一个良好的分割,因为直方图中的模式间有较好的分离度。
使用Otus阈值与基本全局阈值得到的阈值几乎相同,由分割效果图可知,两个的分离度相似。
实现课件中区域生长的程序,采用鼠标点击选取种子点,选取两幅典型图像进行试验,并分析区域生长算法的特点。
将课件中的程序在MATLAB中运行,读入两幅图像,分别是CT图像和超声图像:
I = imread('E:\木子的U盘\大三的木子\第一学期\数字图像处理\ct.jpg');
if( ~( size(I,3)-3 ))
I = rgb2gray(I);
end
I = im2double(I);
gausFilter = fspecial('gaussian',[5 5],0.5);
I = imfilter(I,gausFilter,'replicate');
subplot(2,2,1),imshow(I,[]);
[y,x] = getpts; %鼠标选点,回车确定
x = round(x(1)); %选择种子点
y = round(y(1));
J = zeros(size(I));
% 主函数的返回值,记录区域生长所得到的区域
Isizes = size(I);
reg_mean = I(x,y );
% 分割得到区域内的平均值,初始化为种子点的灰度值
reg_size = 1; %·分割得到区域初始化为一个种子点
neg_free = 10000;
%动态分配内存时每次申请的连续空间大小
neg_list = zeros(neg_free,3);
%定义邻域列表,预先分配用于存储待分析的像素点的坐标值和灰度值的空间
neg_pos = 0;%用于记录neg_list 中待分析像素点的个数
pixdist = 0; %记录最新像素点增加到分割区域后的距离侧度
neigb = [ -1 0;1 0; 0 -1; 0 1]; %四个邻域像素的位置
%开始区域生长,当所有待分析的邻域像素点和已经分割好的区域像素点的灰度值距离大于reg_maxdis,区域生长结束
while (pixdist < 0.06 && reg_size < numel(I))
%增加新的邻域像素到neg_list中
for j=1:4
xn = x + neigb(j,1);
yn = y + neigb(j,2);
%检查邻域像素是否超过图像的边界
ins = (xn>=1)&&(yn>=1)&&(xn<=Isizes(1))&&(yn<=Isizes(1));
%如果邻域像素在图像内部,并且尚未分割好,将它添加到邻域列表中
if( ins && J(xn,yn)==0)
neg_pos = neg_pos+1;
neg_list(neg_pos,:) =[ xn, yn, I(xn,yn)];
%存储对应点的灰度值
J(xn,yn) = 1;
%标注该邻域点像素已经被访问过,并不意味着它在分割区域内
end
end
%从所有待分析的像素点中选择一个像素点,该点的灰度值和已经分割好区域灰度均值的差的绝对值时所待分析像素中最小的
dist = abs(neg_list(1:neg_pos,3)-reg_mean);
[pixdist,index] = min(dist);
%计算区域的新的均值
reg_mean = (reg_mean * reg_size +neg_list(index,3))/(reg_size + 1);
reg_size = reg_size + 1;
%将旧的种子点标记为已经分割好的区域像素点
J(x,y)=2; %标志该像素点已经是分割好的像素点
x = neg_list(index,1);
y = neg_list(index,2);
neg_list(index,:) = neg_list(neg_pos,:);
neg_pos = neg_pos -1;
end
J = (J==2); %我们之前将分割好的像素点标记为2
subplot(2,2,2),imshow(J);
J = bwmorph(J,'dilate'); %补充空洞
[w,h]=size(J);
J1=I+J;
J2=zeros(w,h,3);
for i=1:w
for j=1:h
if(J(i,j)==1)
J2(i,j,1)=J1(i,j); J2(i,j,2)=0; J2(i,j,3)=0;
else
J2(i,j,1)=J1(i,j); J2(i,j,2)=I(i,j); J2(i,j,3)=I(i,j);
end
end
end
subplot(2,2,3),imshow(J);
subplot(2,2,4),imshow(J2);
分别用鼠标选取种子点,按回车键后,两幅图片显示结果如下:
讨论:
区域生长算法对CT图像、MR图像以及所有的具有边界效应,或者是该区域与外界区域有明显差距的图像,分割效果很好。
对感兴趣区域与外接区域存在边缘连通现象的图像,分割效果很差。
如超声图像,肝脏对超声的反应就是“均匀性”散点回声。
这造成“基于邻域像素相似性”分割很难应用。
阈值设置的小,造成分割不完整;阈值设置得太大,造成过分割现象。
区域生长算法的优点是计算简单,其缺点是需要人工交互以获得种子像素点,在每个需分割的区域中植入一个种子点;区域生长对噪声敏感,会导致分割出的区域存在空洞或将应该分开的区域连接起来。