一、问题
读入一副灰度图像(如果是彩色图像,可以先将其转化为灰度图像),然后提取比较理想的灰度图像边缘。这里以moon.tif为例。
二、算法
大家一开始容易想到直接利用MATLAB的内置函数edge并采用不同边缘提取算子进行边缘提取,但效果不理想,该部分内容已在“图像边缘检测原理和常用检测算子及MATLAB实现”中讲过,这里就不赘述,感兴趣的同学可以阅读。本文提出一种边缘检测新思路,主要算法步骤如下:
1.读入图像 2.图像二值化 3.去除小目标 4.填充图像 5.图像边界平滑 6.边缘提取
三、程序代码
clear all;
close all;
clc;
gray_img = imread('moon.tif'); % 读取图像
%bw=imbinarize(gray_img);%阈值分割
bw=im2bw(gray_img,graythresh(gray_img));%阈值分割
bw2=bwareaopen(bw,100);%去除小区域
figure,imshow(bw2);
bw2_fill=imfill(bw2,'holes');
SE=strel('disk',2);%定义结构元素
%SE=strel('disk',3);%定义结构元素
bw2_fill_open=imopen(bw2_fill,SE);%数学形态学开运算
edge_bw=edge(bw2_fill_open);%对二值图像提取边缘
figure,imshow(edge_bw),title('月亮边缘检测结果');
figure('Name','使用阈值分割和数学形态学运算提取边缘','NumberTitle','off');
subplot(2,3,1),imshow(gray_img),title('原始灰度图像');
subplot(2,3,2),imshow(bw),title('最大类间方差法阈值分割');
subplot(2,3,3),imshow(bw2),title('去除小区域');
subplot(2,3,4),imshow(bw2_fill),title('填充孔洞');
subplot(2,3,5),imshow(bw2_fill_open),title('使用开运算平滑边缘');
subplot(2,3,6),imshow(edge_bw),title('月亮边缘检测结果');
四、主要运行结果
五、结果与讨论
由上面运行结果可以看出,采用上述的算法对边缘检测可以得到比较理想的结果。