精华内容
参与话题
问答
  • 图像分割算法

    2019-01-22 15:00:16
    图像处理,模糊C均值聚类图像分割算法,使用matlab实现
  • matlab图像分割算法源码

    千次阅读 多人点赞 2019-03-09 17:37:37
    1.图像反转 MATLAB程序实现如下: I=imread(‘xian.bmp’); J=double(I); J=-J+(256-1); %图像反转线性变换 H=uint8(J); subplot(1,2,1),imshow(I); subplot(1,2,2),imshow(H); 2.灰度线性变换 MATLAB程序...

    MATLAB图像处理的一些算法,前期掌握这些处理简单的图像。。算是分割算法合集

    1.图像反转
    MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    J=double(I);
    J=-J+(256-1); %图像反转线性变换
    H=uint8(J);
    subplot(1,2,1),imshow(I);
    subplot(1,2,2),imshow(H);

    2.灰度线性变换
    MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    subplot(2,2,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    I1=rgb2gray(I);
    subplot(2,2,2),imshow(I1);
    title(‘灰度图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1]
    subplot(2,2,3),imshow(J);
    title(‘线性变换图像[0.1 0.5]’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1]
    subplot(2,2,4),imshow(K);
    title(‘线性变换图像[0.3 0.7]’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    3.非线性变换
    MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    I1=rgb2gray(I);
    subplot(1,2,1),imshow(I1);
    title(‘灰度图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    J=double(I1);
    J=40*(log(J+1));
    H=uint8(J);
    subplot(1,2,2),imshow(H);
    title(‘对数变换图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    4.直方图均衡化
    MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    I=rgb2gray(I);
    figure;
    subplot(2,2,1);
    imshow(I);
    subplot(2,2,2);
    imhist(I);
    I1=histeq(I);
    figure;
    subplot(2,2,1);
    imshow(I1);
    subplot(2,2,2);
    imhist(I1);

    5.线性平滑滤波器
    用MATLAB实现领域平均法抑制噪声程序:
    I=imread(‘xian.bmp’);
    subplot(231)
    imshow(I)
    title(‘原始图像’)
    I=rgb2gray(I);
    I1=imnoise(I,‘salt & pepper’,0.02);
    subplot(232)
    imshow(I1)
    title(‘添加椒盐噪声的图像’)
    k1=filter2(fspecial(‘average’,3),I1)/255; %进行33模板平滑滤波
    k2=filter2(fspecial(‘average’,5),I1)/255; %进行5
    5模板平滑滤波k3=filter2(fspecial(‘average’,7),I1)/255; %进行77模板平滑滤波
    k4=filter2(fspecial(‘average’,9),I1)/255; %进行9
    9模板平滑滤波
    subplot(233),imshow(k1);title(‘33模板平滑滤波’);
    subplot(234),imshow(k2);title('5
    5模板平滑滤波’);
    subplot(235),imshow(k3);title(‘77模板平滑滤波’);
    subplot(236),imshow(k4);title('9
    9模板平滑滤波’);

    6.中值滤波器
    用MATLAB实现中值滤波程序如下:
    I=imread(‘xian.bmp’);
    I=rgb2gray(I);
    J=imnoise(I,‘salt&pepper’,0.02);
    subplot(231),imshow(I);title(‘原图像’);
    subplot(232),imshow(J);title(‘添加椒盐噪声图像’);
    k1=medfilt2(J); %进行33模板中值滤波
    k2=medfilt2(J,[5,5]); %进行5
    5模板中值滤波
    k3=medfilt2(J,[7,7]); %进行77模板中值滤波
    k4=medfilt2(J,[9,9]); %进行9
    9模板中值滤波
    subplot(233),imshow(k1);title(‘33模板中值滤波’);
    subplot(234),imshow(k2);title('5
    5模板中值滤波’);
    subplot(235),imshow(k3);title(‘77模板中值滤波’);
    subplot(236),imshow(k4);title('9
    9模板中值滤波’);

    7.用Sobel算子和拉普拉斯对图像锐化:
    I=imread(‘xian.bmp’);
    subplot(2,2,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I1=im2bw(I);
    subplot(2,2,2),imshow(I1);
    title(‘二值图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    H=fspecial(‘sobel’); %选择sobel算子
    J=filter2(H,I1); %卷积运算
    subplot(2,2,3),imshow(J);
    title(‘sobel算子锐化图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子
    J1=conv2(I1,h,‘same’); %卷积运算
    subplot(2,2,4),imshow(J1);
    title(‘拉普拉斯算子锐化图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    8.梯度算子检测边缘
    用MATLAB实现如下:
    I=imread(‘xian.bmp’);
    subplot(2,3,1);
    imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I1=im2bw(I);
    subplot(2,3,2);
    imshow(I1);
    title(‘二值图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I2=edge(I1,‘roberts’);
    figure;
    subplot(2,3,3);
    imshow(I2);
    title(‘roberts算子分割结果’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I3=edge(I1,‘sobel’);
    subplot(2,3,4);
    imshow(I3);
    title(‘sobel算子分割结果’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I4=edge(I1,‘Prewitt’);
    subplot(2,3,5);
    imshow(I4);
    title(‘Prewitt算子分割结果’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    9.LOG算子检测边缘
    用MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    subplot(2,2,1);
    imshow(I);
    title(‘原始图像’);
    I1=rgb2gray(I);
    subplot(2,2,2);
    imshow(I1);
    title(‘灰度图像’);
    I2=edge(I1,‘log’);
    subplot(2,2,3);
    imshow(I2);
    title(‘log算子分割结果’);

    10.Canny算子检测边缘
    用MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    subplot(2,2,1);
    imshow(I);
    title(‘原始图像’)
    I1=rgb2gray(I);
    subplot(2,2,2);
    imshow(I1);
    title(‘灰度图像’);
    I2=edge(I1,‘canny’);
    subplot(2,2,3);
    imshow(I2);
    title(‘canny算子分割结果’);

    11.边界跟踪(bwtraceboundary函数)
    clc
    clear all
    I=imread(‘xian.bmp’);
    figure
    imshow(I);
    title(‘原始图像’);
    I1=rgb2gray(I); %将彩色图像转化灰度图像
    threshold=graythresh(I1); %计算将灰度图像转化为二值图像所需的门限
    BW=im2bw(I1, threshold); %将灰度图像转化为二值图像
    figure
    imshow(BW);
    title(‘二值图像’);
    dim=size(BW);
    col=round(dim(2)/2)-90; %计算起始点列坐标
    row=find(BW(:,col),1); %计算起始点行坐标
    connectivity=8;
    num_points=180;
    contour=bwtraceboundary(BW,[row,col],‘N’,connectivity,num_points);
    %提取边界
    figure
    imshow(I1);
    hold on;
    plot(contour(:,2),contour(:,1), ‘g’,‘LineWidth’ ,2);
    title(‘边界跟踪图像’);

    12.Hough变换
    I= imread(‘xian.bmp’);
    rotI=rgb2gray(I);
    subplot(2,2,1);
    imshow(rotI);
    title(‘灰度图像’);
    axis([50,250,50,200]);
    grid on;
    axis on;
    BW=edge(rotI,‘prewitt’);
    subplot(2,2,2);
    imshow(BW);
    title(‘prewitt算子边缘检测后图像’);
    axis([50,250,50,200]);
    grid on;
    axis on;
    [H,T,R]=hough(BW);
    subplot(2,2,3);
    imshow(H,[],‘XData’,T,‘YData’,R,‘InitialMagnification’,‘fit’);
    title(‘霍夫变换图’);
    xlabel(’\theta’),ylabel(’\rho’);
    axis on , axis normal, hold on;
    P=houghpeaks(H,5,‘threshold’,ceil(0.3*max(H(?)));
    x=T(P(:,2));y=R(P(:,1));
    plot(x,y,‘s’,‘color’,‘white’);
    lines=houghlines(BW,T,R,P,‘FillGap’,5,‘MinLength’,7);
    subplot(2,2,4);,imshow(rotI);
    title(‘霍夫变换图像检测’);
    axis([50,250,50,200]);
    grid on;
    axis on;
    hold on;
    max_len=0;
    for k=1:length(lines)
    xy=[lines(k).point1;lines(k).point2];
    plot(xy(:,1),xy(:,2),‘LineWidth’,2,‘Color’,‘green’);
    plot(xy(1,1),xy(1,2),‘x’,‘LineWidth’,2,‘Color’,‘yellow’);
    plot(xy(2,1),xy(2,2),‘x’,‘LineWidth’,2,‘Color’,‘red’);
    len=norm(lines(k).point1-lines(k).point2);
    if(len>max_len)
    max_len=len;
    xy_long=xy;
    end
    end
    plot(xy_long(:,1),xy_long(:,2),‘LineWidth’,2,‘Color’,‘cyan’);

    13.直方图阈值法
    用MATLAB实现直方图阈值法:
    I=imread(‘xian.bmp’);
    I1=rgb2gray(I);
    figure;
    subplot(2,2,1);
    imshow(I1);
    title(‘灰度图像’)
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    [m,n]=size(I1); %测量图像尺寸参数
    GP=zeros(1,256); %预创建存放灰度出现概率的向量
    for k=0:255
    GP(k+1)=length(find(I1==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置
    end
    subplot(2,2,2),bar(0:255,GP,‘g’) %绘制直方图
    title(‘灰度直方图’)
    xlabel(‘灰度值’)
    ylabel(‘出现概率’)
    I2=im2bw(I,150/255);
    subplot(2,2,3),imshow(I2);
    title(‘阈值150的分割图像’)
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I3=im2bw(I,200/255); %
    subplot(2,2,4),imshow(I3);
    title(‘阈值200的分割图像’)
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    1. 自动阈值法:Otsu法
      用MATLAB实现Otsu算法:
      clc
      clear all
      I=imread(‘xian.bmp’);
      subplot(1,2,1),imshow(I);
      title(‘原始图像’)
      axis([50,250,50,200]);
      grid on; %显示网格线
      axis on; %显示坐标系
      level=graythresh(I); %确定灰度阈值
      BW=im2bw(I,level);
      subplot(1,2,2),imshow(BW);
      title(‘Otsu法阈值分割图像’)
      axis([50,250,50,200]);
      grid on; %显示网格线
      axis on; %显示坐标系

    15.膨胀操作
    I=imread(‘xian.bmp’); %载入图像
    I1=rgb2gray(I);
    subplot(1,2,1);
    imshow(I1);
    title(‘灰度图像’)
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    se=strel(‘disk’,1); %生成圆形结构元素
    I2=imdilate(I1,se); %用生成的结构元素对图像进行膨胀
    subplot(1,2,2);
    imshow(I2);
    title(‘膨胀后图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    16.腐蚀操作
    MATLAB实现腐蚀操作
    I=imread(‘xian.bmp’); %载入图像
    I1=rgb2gray(I);
    subplot(1,2,1);
    imshow(I1);
    title(‘灰度图像’)
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    se=strel(‘disk’,1); %生成圆形结构元素
    I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀
    subplot(1,2,2);
    imshow(I2);
    title(‘腐蚀后图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    17.开启和闭合操作
    用MATLAB实现开启和闭合操作
    I=imread(‘xian.bmp’); %载入图像
    subplot(2,2,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    I1=rgb2gray(I);
    subplot(2,2,2),imshow(I1);
    title(‘灰度图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    se=strel(‘disk’,1); %采用半径为1的圆作为结构元素
    I2=imopen(I1,se); %开启操作
    I3=imclose(I1,se); %闭合操作
    subplot(2,2,3),imshow(I2);
    title(‘开启运算后图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    subplot(2,2,4),imshow(I3);
    title(‘闭合运算后图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系

    18.开启和闭合组合操作
    I=imread(‘xian.bmp’); %载入图像
    subplot(3,2,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    I1=rgb2gray(I);
    subplot(3,2,2),imshow(I1);
    title(‘灰度图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    se=strel(‘disk’,1);
    I2=imopen(I1,se); %开启操作
    I3=imclose(I1,se); %闭合操作
    subplot(3,2,3),imshow(I2);
    title(‘开启运算后图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    subplot(3,2,4),imshow(I3);
    title(‘闭合运算后图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    se=strel(‘disk’,1);
    I4=imopen(I1,se);
    I5=imclose(I4,se);
    subplot(3,2,5),imshow(I5); %开—闭运算图像
    title(‘开—闭运算图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    I6=imclose(I1,se);
    I7=imopen(I6,se);
    subplot(3,2,6),imshow(I7); %闭—开运算图像
    title(‘闭—开运算图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系

    19.形态学边界提取
    利用MATLAB实现如下:
    I=imread(‘xian.bmp’); %载入图像
    subplot(1,3,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I1=im2bw(I);
    subplot(1,3,2),imshow(I1);
    title(‘二值化图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I2=bwperim(I1); %获取区域的周长
    subplot(1,3,3),imshow(I2);
    title(‘边界周长的二值图像’);
    axis([50,250,50,200]);
    grid on;
    axis on;

    20.形态学骨架提取
    利用MATLAB实现如下:
    I=imread(‘xian.bmp’);
    subplot(2,2,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    axis on;
    I1=im2bw(I);
    subplot(2,2,2),imshow(I1);
    title(‘二值图像’);
    axis([50,250,50,200]);
    axis on;
    I2=bwmorph(I1,‘skel’,1);
    subplot(2,2,3),imshow(I2);
    title(‘1次骨架提取’);
    axis([50,250,50,200]);
    axis on;
    I3=bwmorph(I1,‘skel’,2);
    subplot(2,2,4),imshow(I3);
    title(‘2次骨架提取’);
    axis([50,250,50,200]);
    axis on;

    21.直接提取四个顶点坐标
    I = imread(‘xian.bmp’);
    I = I(:,:,1);
    BW=im2bw(I);
    figure
    imshow(~BW)
    [x,y]=getpts

    展开全文
  • 图像分割算法概述及常用边缘检测算法 Email:whowhoha@outlook.com 一、概述  用计算机进行数字图像处理的目的有两个,一是产生更适合人类视觉观察和识别的图像,二是希望计算机能够自动进行识别和理解图像。无论...

                                                                                  图像分割算法概述及常用边缘检测算法

    一、概述
      用计算机进行数字图像处理的目的有两个,一是产生更适合人类视觉观察和识别的图像,二是希望计算机能够自动进行识别和理解图像。无论是为了何种目的,图像处理的关键一步是对包含有大量各式各样景物信息的图像进行分解。分解的最终结果就是图像被分成一些具有各种特征的最小成分,这些成分就称为图像的基元。产生这些基元的过程就是图像分割的过程。图像分割作为图像处理领域中极为重要的内容之一,是实现图像分析与理解的基础。从概念上来说,所谓图像分割就是按照一定的原则将一幅图像或景物分为若干个部分或子集的过程。目前图像处理系统中我们只能得到二维图像信息,因此只能进行图像分割而不是景物分割(景物是三维信息);图像分割也可以理解为将图像中有意义的特征区域或者需要应用的特征区域提取出来,这些特征区域可以是像素的灰度值、物体轮廓曲线、纹理特性等,也可以是空间频谱或直方图特征等。在图像中用来表示某一物体的区域,其特征都是相近或相同的,但是不同物体的区域之间,特征就会急剧变化。目前已经提出的图像分割方法很多,从分割依据的角度来看,图像的分割方法可以分为相似性分割和非连续性分割。相似性分割就是将具有同一灰度级或相同组织结构的像素聚集在一起,形成图像的不同区域;非连续性分割就是首先检测局部不连续性,然后将它们连接在一起形成边界,这些边界将图像分成不同的区域。由于不同种类的图像,不同的应用场合,需要提取的图像特征是不同的,当然对应的图像特征提取方法也就不同,因此并不存在一种普遍适应的最优方法。
      图像分割方法又可分为结构分割方法和非结构分割方法两大类。结构分割方法是根据图像的局部区域象素的特征来实现图像分割,如阈值分割、区域生长、边缘检测、纹理分析等,这些方法假定事先知道这些区域的特性,或者在处理过程中能够求得这些特性,从而能够寻找各种形态或研究各像素群。非结构分割法包括统计模式识别、神经网络方法或其它利用景物的先验知识实现的方法等等。这些内容由于专业性很强,就不在本文讨论内容中了,有兴趣的读者可以参考图像处理的专业书籍。总之,图像分割可以分为图像的边缘提取和图像的二值化二部分内容,下面我们首先来讨论一下各种常用的图像边缘提取的方法。
    二、图像边缘检测
      数字图像的边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域十分重要的基础,是图像识别中提取图像特征的一个重要属性,图像理解和分析的第一步往往就是边缘检测,目前它以成为机器视觉研究领域最活跃的课题之一,在工程应用中占有十分重要的地位。物体的边缘是以图像的局部特征不连续的形式出现的,也就是指图像局部亮度变化最显著的部分,例如灰度值的突变、颜色的突变、纹理结构的突变等,同时物体的边缘也是不同区域的分界处。图像边缘有方向和幅度两个特性,通常沿边缘的走向灰度变化平缓,垂直于边缘走向的像素灰度变换剧烈,根据灰度变化的特点,可分为阶跃型、房顶型和凸缘型,

      由于边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。一阶微分图像的峰值处对应着图像的边缘点;二阶微分图像的过零点处对应着图像的边缘点。根据数字图像的特点,处理图像过程中常采用差分来代替导数运算,对于图像的简单一阶导数运算,图像边缘提取的常用梯度算子有Robert算子、Sobel算子、Prewitt算子、Krisch算子等。下面以边缘检测Sobel算子为例来讲述数字图像处理中边缘检测的实现:对于数字图像,可以用一阶差分代替一阶微分;

           △xf(x,y)=f(x,y)-f(x-1,y);

                   △yf(x,y)=f(x,y)-f(x,y-1);

      求梯度时对于平方和运算及开方运算,可以用两个分量的绝对值之和表示,Sobel梯度算子是先做成加权平均,再微分,然后求梯度,即: 

                  △xf(x,y)= f(x-1,y+1) + 2f(x,y+1) + f(x+1,y+1)-f(x-1,y-1) - 2f(x,y-1) - f(x+1,y-1);
        △yf(x,y)= f(x-1,y-1) + 2f(x-1,y) +f(x-1,y+1)- f(x+1,y-1) - 2f(x+1,y) - f(x+1,y+1);
        G[f(x,y)]=|△xf(x,y)|+|△yf(x,y)|;
      上述各式中的像素之间的关系见下图

     
          图一:Sober算子中各个像素点的关系图

    常用的检测实现公式列出如下(检测模版可以从相应的算法很容易的得到):
      Roberts算子:G[i,i]=|f[i,j]-f[i+1,j+1]|+|f[i+1,j]-f[i,j+1]|;
      Sobe算子:G[i,i]=|f[i-1,j+1]+2f[i,j+1]+f[i+1,j+1]-f[i-1,j-1]-2f[i,j-1]-f[i+1,j-1]|
               +|f[i-1,j-1]+2f[i-1,j]+f[i-1,j+1]-f[i+1,j-1]-2f[i+1,j]-f[i+1,j+1]|;
      其中G[i,j]表示处理后(i,j)点的灰度值,f[i,j]表示处理前该点的灰度值。

    在视图类中定义了响应菜单命令的边缘检测Sobel算子实现灰度图像边缘检测的函数:

    void CDibView::OnMENUSobel()
    {
     CClientDC pDC(this);
    HDC hDC=pDC.GetSafeHdc();//
    获取当前设备上下文的句柄;
    SetStretchBltMode(hDC,COLORONCOLOR);
    HANDLE data1handle;
     LPDIBHDRTMAPINFOHEADER lpDIBHdr;
     CDibDoc *pDoc=GetDocument();
     HDIB hdib;
     unsigned char *lpDIBBits;
     unsigned char *data;
     hdib=pDoc->m_hDIB;//得到图象数据;
     lpDIBHdr=(LPDIBHDRTMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
     lpDIBBits= lpDIBHdr +* (LPDWORD)lpDIBHdr +256*sizeof(RGBQUAD);
     //得到指向位图像素值的指针;
    data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpDIBHdr->biWidth*8)*lpDIBHdr->biHeight);
     //申请存放处理后的像素值的缓冲区
    data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
     AfxGetApp()->BeginWaitCursor();
     int i,j,buf,buf1,buf2;
     for( j=0; jbiHeight; j++)//以下循环求(x,y)位置的灰度值
      for( i=0; ibiWidth; i++)
     {
       if(((i-1)>=0)&&((i+1)biWidth)&&((j-1)>=0)&&((j+1)biHeight))
       {//对于图像四周边界处的向素点不处理
       buf1=(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))
         +2*(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j))
         +(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1));
        buf1=buf1-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))
         -2*(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j))
         -(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1));

        //以上是对图像进行水平(x)方向的加权微分

        buf2=(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1))
         +2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1))
         +(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1)); 
        buf2=buf2-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))
         -2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))
         -(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1));

        //以上是对图像进行垂直(y)方向加权微分

        buf=abs(buf1)+abs(buf2);//求梯度

       if(buf>255) buf=255;
         if(buf<0)buf=0;
       *(data+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j)=(BYTE)buf;
       }
       else*(data+i*lpDIBHdr->biWidth+j)=(BYTE)0;
      }
     for( j=0; jbiHeight; j++)
     for( i=0; ibiWidth; i++)
     *(lpDIBBits+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j);      //处理后的数据写回原缓冲区
    StretchDIBits(hDC,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,0,0,
    lpDIBHdr->biWidth,lpDIBHdr->biHeight,
    lpDIBBits,(LPDIBHDRTMAPINFO)lpDIBHdr,
    DIB_RGB_COLORS,
    SRCCOPY);

    对于边缘检测,只要知道有若干个检测模板(既边缘检测矩阵),就可以直接实现检测功能了,常用的检测实现公式列出如下(检测模版可以从相应的算法很容易的得到):
      Roberts算子:G[i,i]=|f[i,j]-f[i+1,j+1]|+|f[i+1,j]-f[i,j+1]|;

      Sobe算子:G[i,i]=|f[i-1,j+1]+2f[i,j+1]+f[i+1,j+1]-f[i-1,j-1]-2f[i,j-1]-f[i+1,j-1]|+|f[i-1,j-1]+2f[i-1,j]+f[i-1,j+1]-f[i+1,j-1]-2f[i+1,j]-f[i+1,j+1]|;

      其中G[i,j]表示处理后(i,j)点的灰度值,f[i,j]表示处理前该点的灰度值。

    Kirsch算子实现起来相对来说稍微麻烦一些,它采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方向作出最大响应,运算中取最大值作为图像的边缘输出(上述算法中用到的8个模板在下面的实现代码中给出)。为了便于读者理解该算法的实现,这里我们给出实现该算法的函数代码,读者可以稍加改动应用到自己的项目中去。

    BOOL Kirsch(BYTE *pData,int Width,int Height)
    {//
    定义实现Kirsch算法的8个模板;
    int i,j,s,t,k,max,sum[8];
    statica[3][3]={{+5,+5,+5},{-3,0,-3},{-3,-3,-3}};
    statica1[3][3]={{-3,+5,+5},{-3,0,+5},{-3,-3,-3}};
    statica2[3][3]={{-3,-3,+5},{-3,0,+5},{-3,-3,+5}};
    statica3[3][3]={{-3,-3,-3},{-3,0,+5},{-3,+5,+5}};
    statica4[3][3]={{-3,-3,-3},{-3,0,-3},{+5,+5,+5}};
    statica5[3][3]={{-3,-3,-3},{+5,0,-3},{+5,+5,-3}};
    statica6[3][3]={{+5,-3,-3},{+5,0,-3},{+5,-3,-3}};
    statica7[3][3]={{+5,+5,-3},{+5,0,-3},{-3,-3,-3}};
    BYTE *pData1;
    if(pData==NULL)
    {
    AfxMessageBox("
    图像数据为空,请读取图像数据!");
    return FALSE;
    }
    pData1=(BYTE*)new char[Width*Height];
    if(pData1==NULL)
    {
    AfxMessageBox("
    图像缓冲数据区申请失败,请重新申请图像数据缓冲区!");
    return FALSE ;
    }
    memcpy(pData1,pData, Width*8*Height);
    //kirsch
    算子处理,对每一像素点求取八个方向的导数;;
    for(i=1;i<Height-1;i++)
    for(j=1;j<Width-1;j++)

    sum[1]=sum[2]=sum[3]=sum[4]=sum[5]=sum[6]=sum[7]=sum[8]=0;
    for(t=-1;t<2;t++)
    {
    for(s=-1;s<2;s++)
    {sum[1]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a[1+t][1+s];
    sum[2]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a1[1+t][1+s];sum[3]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a2[1+t][1+s];sum[4]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a3[1+t][1+s];sum[5]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a4[1+t][1+s];sum[6]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a5[1+t][1+s]; sum[7]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a6[1+t][1+s];sum[8]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a7[1+t][1+s];
    }
    }
    //取最大方向的导数;
    for(k=0;k<8;k++)

    max=0; 
    if(max<sum[k])
    max=sum[k];
    }
    if(max<0)
    max=0;
    if(max>255)
    max=255;
    *(pData1+ Width*8*i+j)=max;
    }
    memcpy(pData,pData1, Width*8*Height);
    delete pData1;
    return TRUE;

      另外还有一种称为拉普拉斯的算子是不依赖于边缘方向的二阶微分算子,对于数字图像来说拉普拉斯算子可以简单表示为:G[I,j]=|f[i+1,j]+f[i-1,j]+f(i,j+1)+f[i,j-1]-4f[i,j]|;它是一个标量而不是向量,具有旋转不变,既各向同性的性质,它常常用在图像处理的过程中。梯度算子和拉普拉斯算子对噪声敏感,它们都使噪声成份加强,因此在处理含有较大噪声的图像时,常常先对图像进行平滑操作,然后再进行二阶微分,这就产生了所谓的LOG(又称为Marr方法)边缘检测方法。它先用高斯函数对图像进行平滑,然后再用拉普拉斯算子进行运算。总的来说,传统的边缘检测算子的噪声平滑能力和边缘定位能力是矛盾的,为了克服这个不足,正确地得到图像的边缘信息,人们提出了很多方法,如多尺度空间滤波、Facet模型检测边缘、模板匹配、Hough变换、小波变换、人工神经网络、模糊推理等算法。但这些方法绝大多数没有经典的算法精简,要么难以获得合理的计算复杂度,要么需要人为的调节各种参数,有时甚至难以实时运行。因为传统边缘的定义为图像中灰度的突变,所以这样定义边缘既失去了边缘的部分信息,又把噪声的影响包含在了边缘中。其实,边缘往往具有以下特征:

    1)灰度突变;

    2)是不同区域的边界;

    3)具有方向性;

      根据边缘的这三个特征,可以判断所关心的区域其特征是否存在差异来判断是否存在边缘的可能性。如果特征没有差异,则认为是平滑区;如果特征有差异,则判断为边缘点。

    展开全文
  • 题目: 基于MATLAB的图像分割算法研究 作者姓名 XXX 学号 指导教师 XX教授 学科专业 计算机科学与技术 所在学院 计算机学院 提交日期 引言 数字图像处理技术是一个跨学科的领域。随着计算机科学技术的不断发展...
  • 遥感图像分割算法

    2013-07-27 17:00:50
    遥感图像分割是对遥感图像进行处理的最为关键的一步。马尔科夫随机场模型作为先验模型,在 图像分割领域已经得到了广泛的应用,实践证明该模型有助于提高图像分割的效果。但是由于环境和传感 器的影响,遥感图像具有...
  • 针对传统区域合并算法中存在的分割复杂度高、分割精度低的问题,提出一种将统计理论应用于区域合并的彩色图像分割算法,该算法通过建立图像生成模型,得到新的合并预测准则,有效地避免合并过程中可能导致的区域边界破坏...
  • 本文研究了基于Tsallis熵的多阈值图像分割算法,通过利用图像的灰度直方图信息,近似拟合灰度的概率分布函数,然后设定目标函数,目标函数最大化对应的阈值就是最佳阈值,相比传统算法,Tsallis熵的阈值分割方法,...
  • FLICM图像分割算法

    2020-10-10 14:28:30
    FLICM 算法,是一种基于局部空间信息模糊聚类的鲁棒图像分割算法,来自论文"A Robust Fuzzy Local Information C-Means Clustering Algorithm", IEEE Transactions on Image Processing 19(5) 2010 1328-1337, doi: ...
  • 为解决图像分割算法中聚类数必须事先给定,否则无法进行聚类的问题,基于BIC准则建立了图像聚类算法的新型目标函数,提出了一个自动聚类算法.该算法实现了自动聚类,通过求聚类目标函数的最小值,给出聚类数,从而为聚类数...
  • 对目前几种在图像分割领域得到较多应用的交互式分割 区域生长分割以及阈值 分割算法进行了探讨9并且结合实际CT 片图例分别进行分割实验研究9得到较为满意和 可用性强的结果. 实验表明2阈值分割对于CT 切片的效果最好...
  • 图像分割算法综述概括性介绍了传统的图像分割算法包括区域生长法、分水岭算法等,同时也介绍了结合特定工具如小波分析、小波变换、遗传算法等进行图像分割的方法,最后采用深度学习进行图像分割。
  • 本文首先对颅脑CT图像分割的相关领域进行了系统的分析,涵盖了医学图像分割的研究现状、...然后,着重分析了现有的若干图像分割算法。最后,重点针对颅脑内部结构提取、颅脑出血病灶提取,提出了不同以往的研究方法。
  • FGFCM图像分割算法.zip

    2020-09-12 18:37:52
    FGFCM 算法,是一种基于局部空间信息直方图模糊聚类的图像分割算法,来自论文"Fast and robust fuzzy c-means clustering algorithms incorporating local information for image segmentation", Pattern ...
  • 磁共振(MR)图像由于部分容积效应使其表现出一定的...通过对模拟脑部MR图像和临床脑部MR图像分割实验,表明本文提出的新算法比传统的基于马尔可夫场的图像分割算法和模糊C-均值等图像分割算法有更精确的图像分割能力。
  • 空间约束FCM与MRF结合的侧扫声呐图像分割算法.pdf,针对侧扫声呐图像斑点噪声强、目标分割困难的问题,提出了一种基于空间约束的快速模糊C均值聚类(SCFFCM)与马尔可夫随机场(MRF)相结合的分割算法。为克服噪声干扰,...
  • MR图像分割算法

    2018-06-04 15:56:29
    MR图像分割算法 MR图像分割算法 MR图像分割算法 MR图像分割算法
  • 提出了一种基于量子粒子群的改进模糊聚类图像分割算法。针对FCM图像分割算法对聚类中心初始值比较敏感的缺点,利用量子粒子群优化算法强大的全局搜索能力寻找最优解,能够有效降低图像分割算法对初始值的依赖程度;...
  • 图像分割算法的优缺点比较

    万次阅读 多人点赞 2019-06-11 14:44:14
    数字图像处理常用的图像分割算法有: 基于阀值的分割方法。 基于边缘的分割方法。 基于区域的分割方法。 基于聚类分析的图像分割方法。 基于小波变换的分割方法。 基于数学形态学方法。 基于人工神经网络的方法。 ...

    本文章只做简单介绍各个分割方法,后续会对各个方法一一做详细介绍

    数字图像处理常用的图像分割算法有:

    1. 基于阀值的分割方法。
    2. 基于边缘的分割方法。
    3. 基于区域的分割方法。
    4. 基于聚类分析的图像分割方法。
    5. 基于小波变换的分割方法。
    6. 基于数学形态学方法。
    7. 基于人工神经网络的方法。
    8. 基于遗传算法的方法。

    阈值分割

    1、原理
    用一个或几个阈值将图像的灰度直方图分成几个类, 认为图像中灰度 值在同一类中的像素属于同一物体。(常用的二值分割)
    2、优点
    直接利用图像的灰度特性,所以计算简单、运算效率较高、速度快。
    3、适用范围
    相差很大的不同目标和背景能进行有效的分割。
    4、缺点
    对噪声敏感,对灰度差异不明显以及不同目标灰度值有重叠分割不明显,所以需要与其他方法进行结合。合适的阈值查找。

    边缘分割

    1、原理
    通常不同的区域之间的边缘上像素灰度值的变化往往比较剧烈, 这是边缘检测方法得以实现的主要假设之一。常用灰度的一阶或二阶微分算子进行边缘检测。
    2、优点
    搜索检测的速度快,对边缘检测好。
    3、适用范围
    低噪声干扰,区域之间的性质差别很大(或则说边缘变化大)。
    4、缺点
    不能得到较好的区域结构,边缘检测时抗噪性和检测精度之间的矛盾。精度提高,则会牺牲抗噪性,反之。我们可以设置一个熵,取一个折中的办法,求取熵最大的时候的精度和抗噪性。

    区域分割

    1、原理
    把具有某种相似性质的像索连通,从而构成最终的分割区域。它采用两种方法:分裂和合并
    2、优点
    有效地克服其他方法存在的图像分割空间小连续的缺点,有较好的区域特征。
    3、适用范围
    需得到具有区域结构的分割图。
    4、缺点
    容易造成图像的过度分割,将边缘检测与区域分割结合,可以得到良好的分割效果。

    聚类分析的图像分割

    1、原理
    将图像空间中的像素用对应的特征空间点表示,根据它们在特征空间的聚集对特征空间进行分割,然后将它们映射回原图像空间,得到分割结果。它采用两种方法:K 均值、模糊 C 均值聚类(FCM)算法
    2、优点
    且 FCM 算法对初始参数极为敏感,有时需要人工干预参数的初始化以接近全局最优解,提高分割速度。
    3、适用范围
    适合图像中存在不确定性和模糊性。
    4、缺点
    传统 FCM 算法没有考虑空间信息,对噪声和灰度不均匀敏感。
    聚类分析所要做的工作。
    (1)、聚类的类数如何确定。
    (2)、怎样确定聚类的有效性准则。
    (3)、聚类中心的位置和特性事先不清楚时, 如何设置初始值。
    (4)、运算的开销。

    小波变换的分割

    1、原理
    将基于小波变换的阈值图像分割方法的基本思想是,首先由二进小波变换将图像的直方图分解为不同层次的小波系数,然后依据给定的分割准则和小波系数选择阈值门限,最后利用阈值标出图像分割的区域。
    2、优点
    空域和频域的局域变换,因而能有效地从信号中提取信息,通过伸缩和平移等运算功能对函数或信号进行多尺度分析,解决了傅立叶变换不能解决的许多问题。由于是频域操作,所以对噪声不敏感。
    3、适用范围
    用于边缘检测,可提取多尺度边缘,并可通过对图像奇异度的计算和估计来区分一些边缘的类型。
    4、缺点
    选取合适的滤波器

    基于数学形态学方法

    1、原理
    利用一个称为结构元素的探针来收集图像的信息, 当探针在图像中不断的移动时, 不仅可根据图像各个部分间的相互关系来了解图像的结构特征, 而且利用数学形态学基本运算还可以构造出许多非常有效的图像处理与分析方法。
    2、优点
    定位效果好、分割精度高、抗噪声性能好
    基本的形态运算是腐蚀与膨胀。
    3、适用范围
    可以用于抑制噪声、特性提取、边缘检测、图像分割等图像处理问题,处理灰度图像

    4、缺点
    图像处理后, 依然存在大量与目标不符的短线和孤立点。由于预处理工作的不彻底, 还需要进行一系列的基于点的开( 闭) 运算, 因此运算速度明显下降。克服这些缺陷,将是数学形态学以后的工作方向。

    基于人工神经网络

    1、原理
    通过训练多层感知机来得到线性决策函数,然后用决策函数对像
    素进行分类来达到分割的目的。
    2、优点
    解决图像中的噪声和不均匀问题。
    3、适用范围
    可以用于抑制噪声、特性提取、边缘检测、图像分割等图像处理问题,处理灰度图像

    4、缺点
    选择何种网络结构是这种方法要解决的主要问题。需要大量数据,速度非常慢,结构复杂,分割精度与数据量有关。

    基于遗传算法的方法

    1、原理
    利用 GA 的全局寻优能力及对初始位置的不敏感特性, 可以改进图像分割的性能。
    2、优点
    很强的全局优化搜索能力。
    3、适用范围
    适用于阈值分割法以及区域生长法中,寻找全局最优。

    4、缺点
    其难点在于适应度函数的选择以及交叉概率和变异概率的确定。GA 还有可能收敛于局部最优。

    声明

    这是我自己看了一些论文和文章,从中的一些总结和摘抄,可能我的理解有误,希望大家多多提提宝贵的意见。而且我的语言能力不是太好,大家将就看看。哈哈

    展开全文
  • 为了增强图像分割算法的鲁棒性,避免出现错误或间断的边缘轮廓曲线,获得准确的区域分割线,提出区域边界最优映射分割(ORBM)算法。该算法采用Gibbs分布定义区域分割模型,将多个颜色空间的不同边缘映射求平均值,...
  • 图像分割的质量和速度总是相矛盾的,很多聚类分割算法的实现过程往往更加耗时,缺乏精度或不合实际,因此如何有效的应用聚类算法实现实时自动快速高质量的图像分割仍然是极其重要并尚待有效解决的问题。

空空如也

1 2 3 4 5 ... 20
收藏数 6,089
精华内容 2,435
关键字:

图像分割算法