Halcom 发表于 2017-2-5 12:07:42

改进的多算子边缘检测算法

(1)Sobel算子对于图像边缘检测,Sobel算子对噪声具有平滑抑制作用,但是得到的边缘较粗,且可能出现伪边缘,Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。(2)Prewitt算子对于图像边缘检测,Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用,然而Prewitt算子图像边缘检测的判定是欠合理的,会造成边缘点的误判。(3)Canny算子对于图像边缘检测,Canny边缘检测算法是高斯函数的一阶导数,Canny边缘检测弱化了噪音的影响,然而Canny算子对图像边缘检测,边缘检测过于细化,同样不利于图像纹理特征的提取。(4)Roberts算子能够较好的去除伪边缘,定位较准,垂直方向边缘的性能好于斜线方向,然而Roberts算子对噪声敏感,无法抑制噪声的影响,提取图像边缘较粗。(5)Laplacian算子是最简单的各向同性微分算子,具有旋转不变性,比较适用于改善因为光线的漫反射造成的图像模板,又Laplacian算子对噪声比较敏感,对于图像纹理特征提取较容易出现伪边缘,图像产生较细的边缘,且对细节有较强的响应较细。(6)kirsch方向算子融合后的图像边缘分割能够较好的去除噪音的影响,而且相对于Sobel算子、Prewitt算子、Canny算子、Roberts算子、Lapacian算子而言,图像分割较好,没有伪边缘出现,对噪声不敏感,然而kirsch方向算子根据图像灰度梯度进行处理,丢失了局部的边缘特征,造成特征丢失。综合上述六种算子,本章提出一种多算子融合的图像边缘提取方法,该方法客户了噪声的影响,严格按照灰度梯度来,模拟人的视觉生理特征,对图像进行边缘提取,该多算子结合Sobel算子、Prewitt算子、Canny算子、Roberts算子、kirsch方向算子的优点,各算子之间相互取并集最终得到相应的图像边缘,采用多算子融合的图像边缘检测,程序如下:% 图像边缘纹理处理
% 提取每幅图像研究位置的坐标,保持在eyelocs
clc,clear,close all                  % 清屏、清工作区、关闭窗口
warning off                         % 消除警告
feature jit off                        % 加速代码执行
geshi = { '*.bmp','Bitmap image (*.bmp)';...
         '*.jpg','JPEG image (*.jpg)';...
       '*.*','All Files (*.*)'};
= uigetfile(geshi,'导入外部数据',...
'*.bmp','MultiSelect','on');% 选中所有的图片
% 如果选择了图片文件,生成图片文件的完整路径,否则退出程序,不再运行后面命令
if ~isequal(,);
    FileFullName = strcat(FilePath,FileName);
else
    return;
end
n = length(FileFullName);                        % 选择的图片文件个数
for i = 1 : n
    irow=[];icol=[];img=[];
    % 依次读取每一张图片
    im = imread(FileFullName{i});               % 读取图像
    if size(im,3)==1
      a=im;
    else
      hsi=rgb2hsi(im);
      H = hsi(:, :, 1);
      S = hsi(:, :, 2);
      I = hsi(:, :, 3);
      a= I;
    %   a= rgb2gray(im);
    end
    a = medfilt2(a,);                        % 中值滤波
    b = edge(a,'sobel');                            %% sobel算子
    c = edge(a,'prewitt');                        %% prewitt算子
    d = edge(a,'canny') ;                           %% canny算子
    e = edge(a,'Roberts') ;                         %% Roberts算子
    f = kirsch_algorithm(a);                         %% kirsch方向算子
    p=max(b,c);
    p=min(d,p);
    p=max(e,p);
    p=max(f,p);
    imwrite(p,strcat('.\bw_pic\',num2str(i),'.bmp'),'bmp');
end




页: [1]
查看完整版本: 改进的多算子边缘检测算法