精华内容
下载资源
问答
  • matlab分水岭算法

    2011-12-02 09:53:36
    matlab分水岭算法,一个基础的matlab分水岭算法代码,可根据其进行移植和更改
  • Matlab实现分水岭算法,这个算法是图像边缘检测的常用算法。
  • 图像分割分水岭算法MATLAB代码

    热门讨论 2010-06-07 23:21:49
    数字图像处理 图像分割分水岭算法代码 matlab
  • 分水岭算法是现在医学图像分割的经典算法,具有非常高的参考价值
  • matlab分水岭代码

    2009-09-26 11:44:14
    包含了分水岭算法及其改进算法的matlab代码
  • 基于matlab分水岭算法分割黏连细胞程序代码。。。。。
  • 分水岭算法MATLAB编程代码解析

    千次阅读 2015-10-11 15:48:27
    主要讲述分水岭matlab编程,其中包括步骤和解析。


    close all;


    %%
    %Step 1: 彩色图像->灰度图像
    rgb = imread('pears.png');
    I = rgb2gray(rgb);
    figure;subplot(121)
    imshow(I)
    %Step 2: 利用梯度实现图像的分割
    %使用sobel算子进行边缘检测,
    text(732,501,'Image courtesy of Corel','FontSize',7,'HorizontalAlignment','right')
    hy = fspecial('sobel');
    hx = hy';
    Iy = imfilter(double(I), hy, 'replicate');%实现线性空间滤波函数,一种采用滤波处理的影像增强方法。其理论基础是空间卷积和空间相关。目的是改善影像质量,包括去除高频噪声与干扰,及影像边缘增强、线性增强以及去模糊等。
    Ix = imfilter(double(I), hx, 'replicate');
    gradmag = sqrt(Ix.^2 + Iy.^2);%求模
    subplot(122), imshow(gradmag,[]), title('gradmag')
    %直接用分水岭
    %L=watershed(gradmag);
    %Lrgb=label2rgb(L);
    %figure;imshow(Lrgb),
    %title('Lrgb')
    %No. 如果没有额外的预处理,如下面的标记计算,使用分水岭变换直接结果往往是“过度分割。” 
    % 以下是标记前景和背景物体
    %各种程序可以在这里应用到找到前景标记,它必须连接内的每个前景对象的像素的斑点。在这个例子中,你将使用名为“开放由重建”及以上的图像“闭合由重建”为“干净”的形态学技术。这些操作将创建一个可以使用imregionalmax位于每个对象内部平最大值。
    %Step 3:形态学开操作
    se = strel('disk', 20);%圆形结构元素
    Io = imopen(I, se);%形态学开操作
    figure;subplot(121)
    imshow(Io), title('Io')%显示执行后的图
    %Step 4:腐蚀与重建
    Ie = imerode(I, se);%对图像进行腐蚀
    Iobr = imreconstruct(Ie, I);%对图像进行重建
    subplot(122);imshow(Iobr), %显示重建后的图像
    title('Iobr')
    %Step 5:形态学关操作
    Ioc = imclose(Io, se);%形态学关操作
    figure;subplot(121)
    imshow(Ioc), 
    title('Ioc')
    %Step 6:图像膨胀与求反
    Iobrd = imdilate(Iobr, se);%对图像进行膨胀
    Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
    Iobrcbr = imcomplement(Iobrcbr);%对图像求反
    subplot(122);imshow(Iobrcbr), 
    title('Iobrcbr')
    %%Step 7:获得局部最大值
    fgm = imregionalmax(Iobrcbr);%获得局部最大值
    figure;imshow(fgm), 
    title('fgm')
    %Step 8:在原图上显示极大值区域
    I2 = I;
    I2(fgm) = 255;%局部极大值处像素值设为255
    figure;imshow(I2), 
    title('fgm superimposed on original image')%在原图上显示极大值区域
    se2 = strel(ones(5,5));%构建元素
    fgm2 = imclose(fgm, se2);%关操作
    fgm3 = imerode(fgm2, se2);%腐蚀
    fgm4 = bwareaopen(fgm3, 20);%开操作
    %Step 9:显示修改后的极大区域
    I3 = I;
    I3(fgm4) = 255;%前景设置为255
    figure;subplot(121),
    imshow(I3)%显示修改后的极大区域
    title('fgm4 superimposed on original image')
    %现在标记背景, 在清理后的图像,Iobrcbr,暗像素属于背景,所以你可以从一个阈值操作。
    %Step 10:转化为二值图像
    bw = im2bw(Iobrcbr, graythresh(Iobrcbr));
    subplot(122);imshow(bw),
    title('bw')
    %背景像素是黑色的,但理想地,我们不希望的背景标记是太靠近我们目标对象的边缘。我们通过'骨骼化'进行细分,对二值图像的距离进行分水岭变换,然后寻找分水岭的界线。
    %Step 11:
    D = bwdist(bw);%计算距离
    DL = watershed(D);%分水岭变换
    bgm = DL == 0;%求取分割边界
    figure; imshow(bgm), %显示分割后的边界
    title('Watershed ridge lines (bgm)')
    gradmag2 = imimposemin(gradmag, bgm | fgm4);%置最小值
    L = watershed(gradmag2);%分水岭变换
    I4 = I;
    I4(imdilate(L == 0, ones(3, 3)) | bgm | fgm4) = 255;%前景及边界处置255
    figure; subplot(121)
    imshow(I4)%突出前景及边界
    title('Markers and object boundaries')
    Lrgb = label2rgb(L, 'jet', 'w', 'shuffle');%转化为伪彩色图像
    subplot(122); imshow(Lrgb)%显示伪彩色图像
    title('Colored watershed label matrix')
    figure; imshow(I), 
    hold on
    himage = imshow(Lrgb);%在原图上显示伪彩色图像
    set(himage, 'AlphaData', 0.3);
    title('Lrgb superimposed transparently on original image')
    展开全文
  • matlab分水岭算法源代码肺癌检测 使用MATLAB中的图像处理算法检测肺癌 该项目使用MATLAB来实现图像处理算法。 图像处理工具箱在项目中经常使用。 分割算法的使用基于:。 该项目的目的是提出一种系统,该系统可以...
  • 代码实现: f=imread('C:\Users\lenovo\Desktop\3(1).bmp'); % 读入图像 figure,imshow(f); % 显示原始图像 title('原始图像'); bw=imbinarize(f,graythresh(f)); % 转换为黑白二值图像 figure; imshow(bw); title...

    个人邮箱:570664186@qq.com,如有疑问请备注CSDN

    代码实现:

    f=imread('C:\Users\lenovo\Desktop\3(1).bmp');     % 读入图像
    figure,imshow(f);        % 显示原始图像
    title('原始图像'); 
    bw=imbinarize(f);    % 转换为黑白二值图像
    figure;
    imshow(bw);       
    title('二值图像');      
    bwc=~bw;    % 图像反色,黑白反转
    dst=bwdist(bwc);     % 图像距离
    ws=watershed(-dst);   % 分水岭算法
    figure;
    imshow(ws);                                      
    title('分水岭算法后距离变换');                  
    w=ws==0;
    rf=bw&~w;  %原图灰度图与分水岭算法处理后的图进行重叠
    figure,imshow(rf);                        
    title('分水岭算法和原始图像重叠后的图像');         
    
    h=fspecial('sobel');    % 获得纵方向的sobel算子
    fd=im2double(f);  % 数据类型转换-》双精度浮点型
    %使用梯度算子进行计算
    sq=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);  
    sqoc=imclose(imopen(sq,ones(3,3)),ones(3,3));  % 图像闭合运算
    wsd=watershed(sqoc);     %分水岭运算
    figure;
    imshow(wsd);       
    title('梯度图像');            
    
    wg=wsd==0;
    rfg=f;
    rfg(wg)=255;
    figure;
    imshow(rfg);                            
    title('分水岭图像和原始图像叠加后图像');      
    im=imextendedmin(f,18);   %用来修改图像,使其只是在特定的要求位置有局部极小。
    %这里可以使用imimposemin来修改梯度幅值图像
    Lim=watershed(bwdist(im));
    figure,imshow(Lim);                          
    title('分水岭标志图像');                 
    em=Lim==0;
    rfmin=imimposemin(sq,im|em);
    wsdmin=watershed(rfmin);
    figure,imshow(rfmin);                  
    title('流域-梯度和标记控制');         
    rfgm=f;
    rfgm(wsdmin==0)=255;
    figure,imshow(rfgm);       
    title('分水岭和原始图像叠加后图像'); 
    

    参考博主:

    基于Matlab的标记分水岭分割算法
    分水岭算法的原理、改进及matlab实现
    分水岭算法 matlab的三种实现方法

    感觉文章不错的同学麻烦动动小手点点关注订阅呗,您的肯定是对我持续更新最大的支持!

    展开全文
  • 首先对图像进行开闭腐蚀等处理,并进行形态学重建,最后利用分水岭算法对苹果进行了有效的分割
  • matlab分水岭算法代码项目名称:CT扫描图像中对比度差的晶界的分割(硕士论文) 介绍 什么是晶界? 自然界中大多数无机材料(例如,普通金属,许多陶瓷,岩石)都是多晶结构,由大量单晶(或晶粒)制成。 另外,两...
  • matlab分水岭算法代码基于迭代H最小值的标记控制分水岭,用于细胞核分割 考虑到一组不同的h值,提出的算法可迭代地标识标记。 在每次迭代中,它使用特定的h值定义一组候选项,并从这些候选项中选择标记(只要它们...
  • otsu算法代码分割 在 matlab 中通过分水岭算法将手写文档图像分割为其基本实体,即句子、单词和字符。 介绍 所提出方法的新颖之处在于使用分水岭算法检测句子的文本行并进行后续分割。 分割手写文档的基本实体的过程...
  • matlab分水岭算法源代码Dockerized应用程序用于基于板的循环免疫荧光(pCycIF)成像数据的细分 细分方法 精确分割细胞核和细胞质的能力可能会在密集堆积的细胞图像中混淆。 使用标准的阈值处理算法(例如Otsu阈值...
  • matlab实现图像分水岭分割算法并且有改进的算法实现,两者相互比较效果,并且文档最后直接复制了全部的实现代码
  • matlab分水岭算法代码使用机器学习从MEG数据检测轻度颅脑损伤 该存储库包含VeeraItälinna用于硕士论文的代码。 储存库结构 dicom2nifti 包含用于将DICOM文件转换为NIfTI格式的MATLAB脚本。 pipeline-tbi 包含源...
  • matlab分水岭算法源代码Pulmonary Toolkit是一个用于3D医学肺部图像分析的软件套件,可用于学术研究。 这是实验研究软件,主要用于支持我们自己的工作。 但是,我们很高兴您使用该软件,因此,我们已根据开放源代码...
  • 基于Matlab的标记分水岭分割算法

    千次阅读 2017-11-01 13:56:53
    基于Matlab的标记分水岭分割算法    (2011-05-21 13:57:31) 转载▼ 标签:  matlab   标记分水岭   分割   代码     lyqmath ...Separating touch

    基于Matlab的标记分水岭分割算法 

     (2011-05-21 13:57:31)
    标签: 

    matlab

     

    标记分水岭

     

    分割

     

    代码

     
     

    lyqmath

    http://blog.sina.com.cn/lyqmath

    1 综述

    Separating touching objects in an image is one of the more difficult image processing operations. The watershed transform is often applied to this problem. The watershed transform finds "catchment basins"(集水盆) and "watershed ridge lines"(山脊线) in an image by treating it as a surface where light pixels are high and dark pixels are low.

    如果图像中的目标物体是连接在一起的,则分割起来会更困难,分水岭分割算法经常用于处理这类问题,通常会取得比较好的效果。分水岭分割算法把图像看成一幅“地形图”,其中亮度比较强的区域像素值较大,而比较暗的区域像素值较小,通过寻找“汇水盆地”和“分水岭界限”,对图像进行分割。

    Segmentation using the watershed transform works better if you can identify, or "mark," foreground objects and background locations. Marker-controlled watershed segmentation follows this basic procedure:

    直接应用分水岭分割算法的效果往往并不好,如果在图像中对前景对象和背景对象进行标注区别,再应用分水岭算法会取得较好的分割效果。基于标记控制的分水岭分割方法有以下基本步骤:

    1. Compute a segmentation function. This is an image whose dark regions are the objects you are trying to segment.

    1.计算分割函数。图像中较暗的区域是要分割的对象。

    2. Compute foreground markers. These are connected blobs of pixels within each of the objects.

    2.计算前景标志。这些是每个对象内部连接的斑点像素。

    3. Compute background markers. These are pixels that are not part of any object.

    3.计算背景标志。这些是不属于任何对象的像素。

    4. Modify the segmentation function so that it only has minima at the foreground and background marker locations.

    4.修改分割函数,使其仅在前景和后景标记位置有极小值。

    5. Compute the watershed transform of the modified segmentation function.

    5.对修改后的分割函数做分水岭变换计算。

    Use by Matlab Image Processing Toolbox

    使用MATLAB图像处理工具箱

    注:期间用到了很多图像处理工具箱的函数,例如fspecial、imfilter、watershed、label2rgb、imopen、imclose、imreconstruct、imcomplement、imregionalmax、bwareaopen、graythresh和imimposemin函数等。

     

    2 步骤

     

    Step 1: Read in the Color Image and Convert it to Grayscale

    第一步:读入彩色图像,将其转化成灰度图像

    clc; clear all; close all;

    rgb = imread('pears.png');

    if ndims(rgb) == 3

        I = rgb2gray(rgb);

    else

        I = rgb;

    end

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(1, 2, 1); imshow(rgb); title('原图');

    subplot(1, 2, 2); imshow(I); title('灰度图');

     

    基于Matlab的标记分水岭分割算法 

    Step 2: Use the Gradient Magnitude as the Segmentation Function

    第2步:将梯度幅值作为分割函数

    Use the Sobel edge masks, imfilter, and some simple arithmetic to compute the gradient magnitude. The gradient is high at the borders of the objects and low (mostly) inside the objects.

    使用Sobel边缘算子对图像进行水平和垂直方向的滤波,然后求取模值,sobel算子滤波后的图像在边界处会显示比较大的值,在没有边界处的值会很小。

    hy = fspecial('sobel');

    hx = hy';

    Iy = imfilter(double(I), hy, 'replicate');

    Ix = imfilter(double(I), hx, 'replicate');

    gradmag = sqrt(Ix.^2 + Iy.^2);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(1, 2, 1); imshow(I,[]), title('灰度图像')

    subplot(1, 2, 2); imshow(gradmag,[]), title('梯度幅值图像')

    基于Matlab的标记分水岭分割算法 

    Can you segment the image by using the watershed transform directly on the gradient magnitude?

    可否直接对梯度幅值图像使用分水岭算法?

    L = watershed(gradmag);

    Lrgb = label2rgb(L);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(1, 2, 1); imshow(gradmag,[]), title('梯度幅值图像')

    subplot(1, 2, 2); imshow(Lrgb); title('梯度幅值做分水岭变换')

    基于Matlab的标记分水岭分割算法 

    No. Without additional preprocessing such as the marker computations below, using the watershed transform directly often results in "oversegmentation."

    直接使用梯度模值图像进行分水岭算法得到的结果往往会存在过度分割的现象。因此通常需要分别对前景对象和背景对象进行标记,以获得更好的分割效果。

    Step 3: Mark the Foreground Objects

    第3步:标记前景对象

    A variety of procedures could be applied here to find the foreground markers, which must be connected blobs of pixels inside each of the foreground objects. In this example you'll use morphological techniques called "opening-by-reconstruction" and "closing-by-reconstruction" to "clean" up the image. These operations will create flat maxima inside each object that can be located using imregionalmax.

    有多种方法可以应用在这里来获得前景标记,这些标记必须是前景对象内部的连接斑点像素。这个例子中,将使用形态学技术“基于开的重建”和“基于闭的重建”来清理图像。这些操作将会在每个对象内部创建单位极大值,使得可以使用imregionalmax来定位。

    开运算和闭运算:先腐蚀后膨胀称为开;先膨胀后腐蚀称为闭。开和闭这两种运算可以除去比结构元素小的特定图像细节,同时保证不产生全局几何失真。开运算可以把比结构元素小的突刺滤掉,切断细长搭接而起到分离作用;闭运算可以把比结构元素小的缺口或孔填充上,搭接短的间隔而起到连接作用。

    Opening is an erosion followed by a dilation, while opening-by-reconstruction is an erosion followed by a morphological reconstruction. Let's compare the two. First, compute the opening using imopen.

    开操作是腐蚀后膨胀,基于开的重建(基于重建的开操作)是腐蚀后进行形态学重建。下面比较这两种方式。首先,用imopen做开操作。

    se = strel('disk', 20);

    Io = imopen(I, se);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(1, 2, 1); imshow(I, []); title('灰度图像');

    subplot(1, 2, 2); imshow(Io), title('图像开操作')

    基于Matlab的标记分水岭分割算法 

    Next compute the opening-by-reconstruction using imerode and imreconstruct.

    接下来,通过腐蚀后重建来做基于开的重建计算。

    Ie = imerode(I, se);

    Iobr = imreconstruct(Ie, I);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(1, 2, 1); imshow(I, []); title('灰度图像');

    subplot(1, 2, 2); imshow(Iobr, []), title('基于开的重建图像')

    基于Matlab的标记分水岭分割算法 

    Following the opening with a closing can remove the dark spots and stem marks. Compare a regular morphological closing with a closing-by-reconstruction. First try imclose:

    开操作后,接着进行闭操作,可以移除较暗的斑点和枝干标记。对比常规的形态学闭操作和基于闭的重建操作。首先,使用imclose:

    Ioc = imclose(Io, se);

    Ic = imclose(I, se);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(2, 2, 1); imshow(I, []); title('灰度图像');

    subplot(2, 2, 2); imshow(Io, []); title('开操作图像');

    subplot(2, 2, 3); imshow(Ic, []); title('闭操作图像');

    subplot(2, 2, 4); imshow(Ioc, []), title('开闭操作');

    基于Matlab的标记分水岭分割算法 


    Now use imdilate followed by imreconstruct. Notice you must complement the image inputs and output of imreconstruct. IM2 = imcomplement(IM) computes the complement(补集) of the image IM. IM can be a binary, intensity, or RGB image. IM2 has the same class and size as IM.

    现在使用imdilate,然后使用imreconstruct。注意必须对输入图像求补,对imreconstruct输出图像求补。IM2 = imcomplement(IM)计算图像IM的补集。IM可以是二值图像,或者RGB图像。IM2与IM有着相同的数据类型和大小。

    Iobrd = imdilate(Iobr, se);

    Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));

    Iobrcbr = imcomplement(Iobrcbr);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(2, 2, 1); imshow(I, []); title('灰度图像');

    subplot(2, 2, 2); imshow(Ioc, []); title('开闭操作');

    subplot(2, 2, 3); imshow(Iobr, []); title('基于开的重建图像');

    subplot(2, 2, 4); imshow(Iobrcbr, []), title('基于闭的重建图像');

     

    基于Matlab的标记分水岭分割算法 

    As you can see by comparing Iobrcbr with Ioc, reconstruction-based opening and closing are more effective than standard opening and closing at removing small blemishes without affecting the overall shapes of the objects. Calculate the regional maxima of Iobrcbr to obtain good foreground markers.

    通过比较Iobrcbr和loc可以看到,在移除小污点同时不影响对象全局形状的应用下,基于重建的开闭操作要比标准的开闭重建更加有效。计算Iobrcbr的局部极大来得到更好的前景标记。

    fgm = imregionalmax(Iobrcbr);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(1, 3, 1); imshow(I, []); title('灰度图像');

    subplot(1, 3, 2); imshow(Iobrcbr, []); title('基于重建的开闭操作');

    subplot(1, 3, 3); imshow(fgm, []); title('局部极大图像');

    基于Matlab的标记分水岭分割算法 

    To help interpret the result, superimpose(叠加) the foreground marker image on the original image.

    为了帮助理解这个结果,叠加前景标记到原图上。

    It1 = rgb(:, :, 1);

    It2 = rgb(:, :, 2);

    It3 = rgb(:, :, 3);

    It1(fgm) = 255; It2(fgm) = 0; It3(fgm) = 0;

    I2 = cat(3, It1, It2, It3);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(2, 2, 1); imshow(rgb, []); title('原图像');

    subplot(2, 2, 2); imshow(Iobrcbr, []); title('基于重建的开闭操作');

    subplot(2, 2, 3); imshow(fgm, []); title('局部极大图像');

    subplot(2, 2, 4); imshow(I2); title('局部极大叠加到原图像');

    基于Matlab的标记分水岭分割算法 

    Notice that some of the mostly-occluded and shadowed objects are not marked, which means that these objects will not be segmented properly in the end result. Also, the foreground markers in some objects go right up to the objects' edge. That means you should clean the edges of the marker blobs and then shrink them a bit. You can do this by a closing followed by an erosion.

    注意到大多闭塞处和阴影对象没有被标记,这就意味着这些对象在结果中将不会得到合理的分割。而且,一些对象的前景标记会一直到对象的边缘。这就意味着应该清理标记斑点的边缘,然后收缩它们。可以通过闭操作和腐蚀操作来完成。

    se2 = strel(ones(5,5));

    fgm2 = imclose(fgm, se2);

    fgm3 = imerode(fgm2, se2);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(2, 2, 1); imshow(Iobrcbr, []); title('基于重建的开闭操作');

    subplot(2, 2, 2); imshow(fgm, []); title('局部极大图像');

    subplot(2, 2, 3); imshow(fgm2, []); title('闭操作');

    subplot(2, 2, 4); imshow(fgm3, []); title('腐蚀操作');

    基于Matlab的标记分水岭分割算法 

    This procedure tends to leave some stray isolated pixels that must be removed. You can do this using bwareaopen, which removes all blobs that have fewer than a certain number of pixels. BW2 = bwareaopen(BW,P) removes from a binary image all connected components (objects) that have fewer than P pixels, producing another binary image, BW2.

    这个过程将会留下一些偏离的孤立像素,应该移除它们。可以使用bwareaopen,用来移除少于特定像素个数的斑点。BW2 = bwareaopen(BW,P)从二值图像中移除所以少于P像素值的连通块,得到另外的二值图像BW2。

    fgm4 = bwareaopen(fgm3, 20);

    It1 = rgb(:, :, 1);

    It2 = rgb(:, :, 2);

    It3 = rgb(:, :, 3);

    It1(fgm4) = 255; It2(fgm4) = 0; It3(fgm4) = 0;

    I3 = cat(3, It1, It2, It3);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(2, 2, 1); imshow(I2, []); title('局部极大叠加到原图像');

    subplot(2, 2, 2); imshow(fgm3, []); title('闭腐蚀操作');

    subplot(2, 2, 3); imshow(fgm4, []); title('去除小斑点操作');

    subplot(2, 2, 4); imshow(I3, []); title('修改局部极大叠加到原图像');

    基于Matlab的标记分水岭分割算法 

    Step 4: Compute Background Markers

    Now you need to mark the background. In the cleaned-up image, Iobrcbr, the dark pixels belong to the background, so you could start with a thresholding operation.

    第4步:计算背景标记

    现在,需要标记背景。在清理后的图像Iobrcbr中,暗像素属于背景,所以可以从阈值操作开始。

    bw = im2bw(Iobrcbr, graythresh(Iobrcbr));

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(1, 2, 1); imshow(Iobrcbr, []); title('基于重建的开闭操作');

    subplot(1, 2, 2); imshow(bw, []); title('阈值分割');



    基于Matlab的标记分水岭分割算法 


    The background pixels are in black, but ideally we don't want the background markers to be too close to the edges of the objects we are trying to segment. We'll "thin" the background by computing the "skeleton by influence zones", or SKIZ, of the foreground of bw. This can be done by computing the watershed transform of the distance transform of bw, and then looking for the watershed ridge lines (DL == 0) of the result. D = bwdist(BW) computes the Euclidean distance transform of the binary image BW. For each pixel in BW, the distance transform assigns a number that is the distance between that pixel and the nearest nonzero pixel of BW. bwdist uses the Euclidean distance metric by default. BW can have any dimension. D is the same size as BW.

    背景像素在黑色区域,但是理想情形下,不必要求背景标记太接近于要分割的对象边缘。通过计算“骨架影响范围”来“细化”背景,或者SKIZ,bw的前景。这个可以通过计算bw的距离变换的分水岭变换来实现,然后寻找结果的分水岭脊线(DL==0)。D = bwdist(BW)计算二值图像BW的欧几里得矩阵。对BW的每一个像素,距离变换指定像素和最近的BW非零像素的距离。bwdist默认使用欧几里得距离公式。BW可以由任意维数,D与BW有同样的大小。

    D = bwdist(bw);

    DL = watershed(D);

    bgm = DL == 0;

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(2, 2, 1); imshow(Iobrcbr, []); title('基于重建的开闭操作');

    subplot(2, 2, 2); imshow(bw, []); title('阈值分割');

    subplot(2, 2, 3); imshow(label2rgb(DL), []); title('分水岭变换示意图');

    subplot(2, 2, 4); imshow(bgm, []); title('分水岭变换脊线图');

    基于Matlab的标记分水岭分割算法 

    Step 5: Compute the Watershed Transform of the Segmentation Function.

    The function imimposemin can be used to modify an image so that it has regional minima only in certain desired locations. Here you can use imimposemin to modify the gradient magnitude image so that its only regional minima occur at foreground and background marker pixels.

    第5步:计算分割函数的分水岭变换

    函数imimposemin可以用来修改图像,使其只是在特定的要求位置有局部极小。这里可以使用imimposemin来修改梯度幅值图像,使其只在前景和后景标记像素有局部极小。

    gradmag2 = imimposemin(gradmag, bgm | fgm4);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(2, 2, 1); imshow(bgm, []); title('分水岭变换脊线图');

    subplot(2, 2, 2); imshow(fgm4, []); title('前景标记');

    subplot(2, 2, 3); imshow(gradmag, []); title('梯度幅值图像');

    subplot(2, 2, 4); imshow(gradmag2, []); title('修改梯度幅值图像');

    基于Matlab的标记分水岭分割算法 

    Finally we are ready to compute the watershed-based segmentation.

    最后,可以做基于分水岭的图像分割计算。

    Step 6: Visualize the Result

    One visualization technique is to superimpose the foreground markers, background markers, and segmented object boundaries on the original image. You can use dilation as needed to make certain aspects, such as the object boundaries, more visible. Object boundaries are located where L == 0.

    第6步:查看结果

    一个可视化技术是叠加前景标记、背景标记、分割对象边界到初始图像。可以使用膨胀来实现某些要求,比如对象边界,更加清晰可见。对象边界定位于L==0的位置。

    It1 = rgb(:, :, 1);

    It2 = rgb(:, :, 2);

    It3 = rgb(:, :, 3);

    fgm5 = imdilate(L == 0, ones(3, 3)) | bgm | fgm4;

    It1(fgm5) = 255; It2(fgm5) = 0; It3(fgm5) = 0;

    I4 = cat(3, It1, It2, It3);

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(1, 2, 1); imshow(rgb, []); title('原图像');

    subplot(1, 2, 2); imshow(I4, []); title('标记和对象边缘叠加到原图像');

    基于Matlab的标记分水岭分割算法 

    This visualization illustrates how the locations of the foreground and background markers affect the result. In a couple of locations, partially occluded darker objects were merged with their brighter neighbor objects because the occluded objects did not have foreground markers.

    可视化说明了前景和后景标记如何影响结果。在几个位置,部分的较暗对象与它们相邻的较亮的邻接对象相融合,这是因为受遮挡的对象没有前景标记。

    Another useful visualization technique is to display the label matrix as a color image. Label matrices, such as those produced by watershed and bwlabel, can be converted to truecolor images for visualization purposes by using label2rgb.

    另外一个有用的可视化技术是将标记矩阵作为彩色图像进行显示。标记矩阵,比如通过watershed和bwlabel得到的,可以使用label2rgb转换到真彩图像来显示。

    Lrgb = label2rgb(L, 'jet', 'w', 'shuffle');

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(1, 2, 1); imshow(rgb, []); title('原图像');

    subplot(1, 2, 2); imshow(Lrgb); title('彩色分水岭标记矩阵');

     

    基于Matlab的标记分水岭分割算法 

    You can use transparency to superimpose this pseudo-color label matrix on top of the original intensity image.

    可以使用透明度来叠加这个伪彩色标记矩阵在原亮度图像上进行显示。

    figure('units', 'normalized', 'position', [0 0 1 1]);

    subplot(1, 2, 1); imshow(rgb, []); title('原图像');

    subplot(1, 2, 2); imshow(rgb, []); hold on;

    himage = imshow(Lrgb);

    set(himage, 'AlphaData', 0.3);

    title('标记矩阵叠加到原图像');

     

    基于Matlab的标记分水岭分割算法 

    参考:http://blueben-chong.blog.sohu.com/141881444.html

    总结

    代码:

    clc; clear all; close all;

    rgb = imread('pears.png');

    if ndims(rgb) == 3

        I = rgb2gray(rgb);

    else

        I = rgb;

    end

     

    hy = fspecial('sobel');

    hx = hy';

    Iy = imfilter(double(I), hy, 'replicate');

    Ix = imfilter(double(I), hx, 'replicate');

    gradmag = sqrt(Ix.^2 + Iy.^2);

     

    L = watershed(gradmag);

    Lrgb = label2rgb(L);

     

    se = strel('disk', 20);

    Io = imopen(I, se);

     

    Ie = imerode(I, se);

    Iobr = imreconstruct(Ie, I);

     

    Ioc = imclose(Io, se);

     

    Iobrd = imdilate(Iobr, se);

    Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));

    Iobrcbr = imcomplement(Iobrcbr);

     

    fgm = imregionalmax(Iobrcbr);

     

    It1 = rgb(:, :, 1);

    It2 = rgb(:, :, 2);

    It3 = rgb(:, :, 3);

    It1(fgm) = 255; It2(fgm) = 0; It3(fgm) = 0;

    I2 = cat(3, It1, It2, It3);

     

    se2 = strel(ones(5,5));

    fgm2 = imclose(fgm, se2);

    fgm3 = imerode(fgm2, se2);

     

    fgm4 = bwareaopen(fgm3, 20);

    It1 = rgb(:, :, 1);

    It2 = rgb(:, :, 2);

    It3 = rgb(:, :, 3);

    It1(fgm4) = 255; It2(fgm4) = 0; It3(fgm4) = 0;

    I3 = cat(3, It1, It2, It3);

     

    bw = im2bw(Iobrcbr, graythresh(Iobrcbr));

     

    D = bwdist(bw);

    DL = watershed(D);

    bgm = DL == 0;

     

    gradmag2 = imimposemin(gradmag, bgm | fgm4);

    L = watershed(gradmag2);

     

    It1 = rgb(:, :, 1);

    It2 = rgb(:, :, 2);

    It3 = rgb(:, :, 3);

    fgm5 = imdilate(L == 0, ones(3, 3)) | bgm | fgm4;

    It1(fgm5) = 255; It2(fgm5) = 0; It3(fgm5) = 0;

    I4 = cat(3, It1, It2, It3);

     

    Lrgb = label2rgb(L, 'jet', 'w', 'shuffle');

    展开全文
  • 图像分割分水岭算法

    2015-05-31 11:23:40
    matlab编写的分水岭算法实验代码,用于图像分割处理,针对连接在一起的物体图像,进行分割效果较好
  • 分区首先使用分水岭定义算法进行标识,然后主要按照Hanson和Phillips(2001)中描述的方法进行修改。 作者: 道格拉斯·卡尔(Douglas Cahl)和乔治·沃加利斯(George Voulgaris) 地球,海洋与环境学院南卡罗来纳...
  • matlab分水岭算法代码 Chouaib等人的方法,图解和结果。 (2020年) 该存储库从以下论文中收集了用于探索和分析大部分图像的代码: 标题:双重蛋白质/ mRNA本地化筛选揭示了区室化翻译和广泛的共翻译RNA靶向 作者...
  • MATLAB图像处理主要是用到了watershed函数使用方法。 调用格式: L = watershed(A) 返回一个标签矩阵L,该标签矩阵L标识输入矩阵A的分水岭区域。 L = watershed(A,conn) 指定在分水岭计算中使用的连通性。 发电恢复 ...

    分水岭变换将图像视为浅色像素代表高海拔而深色像素代表低海拔的表面,从而在图像中找到“集水盆地”或“分水岭脊线”。 分水岭变换可用于将感兴趣的连续区域分割为不同的对象。

    MATLAB图像处理主要是用到了watershed函数使用方法。

    调用格式:

    L = watershed(A)
    返回一个标签矩阵L,该标签矩阵L标识输入矩阵A的分水岭区域。

    L = watershed(A,conn)
    指定在分水岭计算中使用的连通性。

    发电恢复
    说过的`在这里插入代码片

    close all; clear all; clc;
    I=imread('circbw.tif');
    J=watershed(I,8);   %分水岭分割
    figure; 
    subplot(121);imshow(I);     
    subplot(122);imshow(J); 
    

    `
    在这里插入图片描述

    展开全文
  • matlab分水岭算法源代码PMP-项目-2017 使用ioLight便携式显微镜检测动物粪便中的寄生虫 该项目是多个来源的合作。 它受到以下人员的监督:Joana Grah(剑桥图像分析),Carola Schonlieb(剑桥图像分析),Jasmina ...
  • 图像分割的分水岭算法

    热门讨论 2011-05-08 20:13:22
    图像分割的分水岭算法,能正确分割出所需目标,能成功运行,matlab的完整代码
  • Canny 边缘检测、Sobel 边缘检测、Presitt 边缘检测、Roberts 边缘检测、Laplacian 边缘检测、分水岭分割(算法原理,matlab代码,实验结果,和图像分割的知识都被贴在一个word里面,我做实验上交给老师的)
  • matlab分水岭函数并不能直接得到想要的分割结果。网络上有下面三种处理方式: 代码1: filename=‘1.jpg'; f=imread(filename); f=rgb2gray(f); b1=im2bw(f,0.6); out=edge(f,'canny',0.3); se=strel('disk',1); ...
  • matlab自相关代码快速概述 这是我尝试的2D间隔拍摄电影中用于单个粒子跟踪的链接算法。 该基本思想是从观察得出的,通常情况下,即使没有事先知道通常轨迹的样子,通常在用3D图(两个空间和一个时间维度)绘制视频中...
  • matlab代码,函数形式,试过可用,利用分水岭技术对图像进行分割。
  • matlab聚类kmeans代码 区域形态分析 area-shape-analysis ...watershed(基于标记的分水岭算法)可以参考:《数字图像处理(第二版)》(冈萨雷斯著) 见10.5.4节。 Gonzalez's book of chapter 10.5.4

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
关键字:

matlab分水岭算法代码

matlab 订阅