精华内容
下载资源
问答
  • 基于FPGA灰度图像的形态学膨胀算法的实现1 背景知识腐蚀与膨胀是形态学滤波的两个基本运算,通过腐蚀和膨胀两种运算可以实现多种功能,主要如下:(1)消除噪声;(2)分割出独立的...

    基于FPGA灰度图像的形态学膨胀算法的实现

    1 背景知识

        腐蚀与膨胀是形态学滤波的两个基本运算,通过腐蚀和膨胀两种运算可以实现多种功能,主要如下:

    (1) 消除噪声;

    (2)分割出独立的图像元素;

    (3)在图像中连接相邻的元素;

    (4)寻找图像中明显的极大值和极小值区域;

    (5)求出图像的梯度。

     

    图1 腐蚀膨胀示意图

    图1 a为大小为448X425像素的灰度级X射线图像;b使用半径为2个像素的圆盘形结构元对图像的腐蚀结果;c用相同的结构元对图像的膨胀结果。原图有Lixi公司提供。

    1)形态学滤波之膨胀

       膨胀(dialate)就是求局部最大值的操作。

       从数学角度来看就是将图像f和核(结构元)b进行卷积的一个过程。

       当b的原点位于(x,y)处时,

    展开全文
  • 关于形态学膨胀的部分代码
  • 二值图像腐蚀操作属于图像形态学的范畴,形态学运算是只针对二值图像进行,并依据数学形态学(Mathermatical Morphogy)集合论方法发展起来的数字图像处理方法,它主要包括腐蚀,膨胀,开,闭,击中,击不中等。...

    二值图像腐蚀函数

    [算法说明]

      二值图像腐蚀操作属于图像形态学的范畴,形态学运算是只针对二值图像进行,并依据数学形态学(Mathermatical Morphogy)集合论方法发展起来的数字图像处理方法,它主要包括腐蚀,膨胀,开,闭,击中,击不中等。

      图像形态学运算,要使用结构元素,所谓结构元素是指具有某种确定形状的基本结构,它的选择一般要求其具有旋转不变性或者镜像不变性,即:结构元素的原点在其几何中心处,周围像素关于原点对称。

      在这里我们选取如下的结构元素:

      我们假设结构元素为S,则腐蚀算法如下:

      其中,F为二值图像原图,X为结构元素原点所在的二值图像中的连通域。

      假设F中目标像素为255(白色),非目标为0(黑色),当结构元素S原点移动到点(x,y)时,如果S中所有点均包含在X中(X中对应在S中所有点的位置均为255),则在腐蚀后的二值图像中,对应于S原点的位置为255(白色),否则为0(黑色)。

      用通俗的话来说就是:用结构元素作为模板在原始二值图像种平滑一遍,扫描图像的每一个像素,用结构元素中的每一个元素与其覆盖的二值图像做“与”操作(假设结构元素都为1),如果结果都为1,则二值图像中对应结构元素原点位置的像素值为1,否则为0。
    [函数代码]

            /// 

            /// Corrosion process.

            /// 

            /// The source image(It should be the binary image).

            /// 

            public static WriteableBitmap CorrosionProcess(WriteableBitmap src)21图像腐蚀运算

            {

                if (src != null)

                {

                    int w = src.PixelWidth;

                    int h = src.PixelHeight;

                    WriteableBitmap corrosionImage = new WriteableBitmap(w, h);

                    byte[] temp = src.PixelBuffer.ToArray();

                    byte[] tempMask = (byte[])temp.Clone();

                    for (int j = 0; j < h; j++)

                    {

                        for (int i = 0; i < w ; i ++)

                        {

                            if (i == 0 || i == w - 1 || j == 0 || j == h - 1)

                            {

                                temp[i * 4 + j * w * 4] = (byte)255;

                                temp[i * 4 + 1 + j * w * 4] = (byte)255;

                                temp[i * 4 + 2 + j * w * 4] = (byte)255;

                            }

                            else

                            {

                                if (tempMask[i * 4 - 4 + j * w * 4] == 255 && tempMask[i * 4 + j * w * 4] == 255 && tempMask[i * 4 + 4 + j * w * 4] == 255

                                    && tempMask[i * 4 + (j - 1) * w * 4] == 255 && tempMask[i * 4 + (j + 1) * w * 4] == 255)

                                {

                                    temp[i * 4 + j * w * 4] = (byte)255;

                                    temp[i * 4 + 1 + j * w * 4] = (byte)255;

                                    temp[i * 4 + 2 + j * w * 4] = (byte)255;

                                }

                                else

                                {

                                    temp[i * 4 + j * w * 4] = 0;

                                    temp[i * 4 + 1 + j * w * 4] = 0;

                                    temp[i * 4 + 2 + j * w * 4] = 0;

                                }

                            }

                        }

                    }

                    Stream sTemp = corrosionImage.PixelBuffer.AsStream();

                    sTemp.Seek(0, SeekOrigin.Begin);

                    sTemp.Write(temp, 0, w * 4 * h);

                    return corrosionImage;

                }

                else

                {

                    return null;

                }   

            }

    [图像效果]

    Fig.1原图                                Fig.2效果图



    二值图像膨胀函数

    [算法说明]

      膨胀算法也是属于形态学算法的范畴,前一节已经简单介绍了形态学,这里不再累赘。

      我们这里介绍的膨胀算法依旧采用上一节腐蚀中的结构元素S,则算法过程如下:

      用通俗的话讲就是,用结构元素作为模板在原始二值图像种平滑一遍,扫描图像的每一个像素,用结构元素中的每一个元素与其覆盖的二值图像做“或”操作(假设结构元素都为1),如果结果为1,则二值图像中对应结构元素原点位置的像素值为1,否则为0。

    [函数代码]

            /// 

            /// Dilation process.

            /// 

            /// The source image(It should be the binary image).

            /// 

            public static WriteableBitmap DilationProcess(WriteableBitmap src)22图像膨胀运算

            {

                if (src != null)

                {

                    int w = src.PixelWidth;

                    int h = src.PixelHeight;

                    WriteableBitmap dilationImage = new WriteableBitmap(w, h);

                    byte[] temp = src.PixelBuffer.ToArray();

                    byte[] tempMask = (byte[])temp.Clone();

                    for (int j = 0; j < h; j++)

                    {

                        for (int i = 0; i < w; i++)

                        {

                            if (i == 0 || i == w - 1 || j == 0 || j == h - 1)

                            {

                                temp[i * 4 + j * w * 4] = (byte)255;

                                temp[i * 4 + 1 + j * w * 4] = (byte)255;

                                temp[i * 4 + 2 + j * w * 4] = (byte)255;

                            }

                            else

                            {

                                if (tempMask[i * 4 - 4 + j * w * 4] == 255 || tempMask[i * 4 + j * w * 4] == 255 || tempMask[i * 4 + 4 + j * w * 4] == 255

                                    || tempMask[i * 4 + (j - 1) * w * 4] == 255 || tempMask[i * 4 + (j + 1) * w * 4] == 255)

                                {

                                    temp[i * 4 + j * w * 4] = (byte)255;

                                    temp[i * 4 + 1 + j * w * 4] = (byte)255;

                                    temp[i * 4 + 2 + j * w * 4] = (byte)255;

                                }

                                else

                                {

                                    temp[i * 4 + j * w * 4] = 0;

                                    temp[i * 4 + 1 + j * w * 4] = 0;

                                    temp[i * 4 + 2 + j * w * 4] = 0;

                                }

                            }

                        }

                    }

                    Stream sTemp = dilationImage.PixelBuffer.AsStream();

                    sTemp.Seek(0, SeekOrigin.Begin);

                    sTemp.Write(temp, 0, w * 4 * h);

                    return dilationImage;

                }

                else

                {

                    return null;

                }

            }

    [图像效果]

    Fig.1原图                                Fig.2效果图




    二值图像开运算函数

    [算法说明]

      开运算就是先进性一次腐蚀后进行一次膨胀。算法过程如公式2-(27)。

    [函数代码]

            /// 

            /// Open operate process.

            /// 

            /// The source image(It should be the binary image).

            /// 

            public static WriteableBitmap OpenOperateProcess(WriteableBitmap src)23图像开运算

            {

                if (src != null)

                {

                    WriteableBitmap temp = DilationProcess(CorrosionProcess(src));

                    return temp;

                }

                else

                {

                    return null;

                }

            }

    [图像效果]

    Fig.1原图                                Fig.2效果图



    二值图像闭运算函数

    [算法说明]

      闭运算就是先进性一次膨胀后进行一次腐蚀。算法过程如公式2-(28)。

    [函数代码]

            /// 

            /// Close operate process.

            /// 

            /// The source image(It should be the binary image).

            /// 

            public static WriteableBitmap CloseOperateProcess(WriteableBitmap src)24图像闭运算

            {

                if (src != null)

                {

                    WriteableBitmap temp = CorrosionProcess(DilationProcess(src));

                    return temp;

                }

                else

                {

                    return null;

                }

            }

    [图像效果]

    Fig.1原图                                Fig.2效果图


    demo 下载: http://www.zealfilter.com/forum.php?mod=viewthread&tid=30&extra=page%3D1

    展开全文
  • 形态学——腐蚀,膨胀,细化算法,用的c语言实现,可以参考一下
  • 数字图像处理形态学算法中膨胀算法基于MATLAB实现(自己编写),不是调用库函数
  • 若该文为原创文章,未经允许不得转载 原博主博客地址:...本文章博客地址: OpenCV开发笔记(二十一):算法基础之形态学滤波-膨胀 前言 本篇章开始学习形态学滤波-膨胀。 ...
    展开全文
  • (MATLAB)三维形态学腐蚀膨胀算法(代码)

    千次阅读 热门讨论 2020-12-04 10:14:28
    MATLAB三维形态学腐蚀膨胀操作代码。做三维形态学操作的时候,没找到MATLAB自带的函数,所以自己写了一个。

    (MATLAB)三维形态学腐蚀膨胀算法(代码)

    by HPC_ZY

    MATLAB三维形态学腐蚀膨胀操作代码。做三维形态学操作的时候,没找到MATLAB自带的函数,所以自己写了一个。

    膨胀

    膨胀比较简单,总之就是原始图像某一位置为1时,把周围的全置为1

    %% 三维膨胀
    function out = dilate3d(in,r)
    
    [R,C,S] = size(in);
    % 生成球形结构元
    [se,n,rx,ry,rz] = strel3d(r);
    
    out = false(R,C,S);
    for i = 1+rx:R-rx
        for j = 1+ry:C-ry
            for k = 1+rz:S-rz
                if in(i,j,k) == 1                
                    for idx = 1:n
                        out(i+se(idx,1),j+se(idx,2),k+se(idx,3)) = 1;
                    end
                end
            end
        end
    end
    
    end
    

    腐蚀

    与膨胀相反,当原始图像某邻域范围内全为1,中心点才能置为1

    %% 三维腐蚀
    function out = erode3d(in,r)
    % 生成球形结构元
    [R,C,S] = size(in);
    [se,n,rx,ry,rz] = strel3d(r);
    
    out = false(R,C,S);
    for i = 1+rx:R-rx
        for j = 1+ry:C-ry
            for k = 1+rz:S-rz
                out(i,j,k) = 1;
                for idx = 1:n
                    if in(i+se(idx,1),j+se(idx,2),k+se(idx,3))<1
                        out(i,j,k) = 0;
                        break;                    
                    end
                end                                   
            end
        end
    end
    
    end
    

    结构元与其他函数

    生成结构元的函数,建议三个方向半径一致。
    注:由于此处结构元特殊的判定方式,当三个方向半径不一致时,最终尺寸不一定等于用户输入的尺寸,但大体形态是相同的

    %% 生成三维球形结构元
    function [se,n,rx,ry,rz] = strel3d(r)
    
    % 判断用户输入半径
    if length(r)<2
        rx = r;
        ry = r;
        rz = r;
    elseif length(r)>2
        rx = r(1);
        ry = r(2);
        rz = r(3);
    else
        rx = r(1);
        ry = r(1);
        rz = r(2);
    end
    
    % 生成球形二值图 并获得目标索引
    [x,y,z] = meshgrid(-rx:rx,-ry:ry,-rz:rz);
    [x,y,z] = find3d(sqrt(x.^2+y.^2+z.^2)<(rx+ry+rz)/2.5); % 注意这里的判定方式
    se = [x-rx-1,y-ry-1,z-rz-1];
    
    n = size(se,1);
    
    end
    

    find3函数(类似MATLAB自带的find,但这里是三维的)

    %% 找到满足条件的值,类似MATLAB自带的find,但这里是三维的
    function [x,y,z] = find3d(in)
    
    [M,N,~] = size(in);
    
    idx = find(in);
    
    z = ceil(idx/M/N);
    idx = idx-(z-1)*M*N;
    y = ceil(idx/M);
    x = idx-(y-1)*M;
    
    end
    

    测试

    clear; close all; clc
    
    %% 生成测试图像(三维)
    im = zeros(50,50,50);
    im(20:30,20:30,10:40) = 1;
    
    %% 形态学操作
    % 膨胀
    im1 = dilate3d(im,5);
    
    % 腐蚀
    im2 = erode3d(im,3);
    im3 = erode3d(im,[3,3,10]);
    
    %% 显示结果
    viewer3d(im,double(im1),im,double(im2),im,double(im3))
    % 注意,仅仅运行到这里,是什么都不会显示的哦
    % viewer3d是可视化界面,你得和它互动,要显示什么你的自己学。
    % 这个东西怎么用,就参考“其他=2.关于viewer3d函数”
    

    测试结果如下,其中 红色为原始模型,绿色为操作后模型,黄色为重叠部分
    在这里插入图片描述


    其他

    1. 为了简便易理解,所以没有进行优化,运行速度一般
    2. 关于viewer3d函数,可查看另一篇文章
    3. 三维开闭运算可以组合腐蚀膨胀实现,这里就不贴代码了
    4. 如果有其他问题或需求,欢迎评论区留言或私信
    展开全文
  • 摘 要: 本文介绍了数学形态学中结构元素为4连通或8连通的3×3邻域时腐蚀、膨胀运算的快速算法。区域采用线段编码表示,腐蚀与膨胀运算在当前线段与其相邻的上下线段之间通过逻辑运算实现。4连通邻域结构元素下作腐蚀...
  • 这里介绍一种基于形态学膨胀操作的提取连通分量的方法。 以8连通的情况为例,对于图(a)的内含多个连通分量的图像A,从仅为连通分量A1内部某个的图像B开始,不断采用如图©所示的结构S进行膨胀。由于其他连通分量...
  • 基本的形态学变换是膨胀和腐蚀,由这两个变换可以衍生出更多的形态学运算,如开运算、闭运算和形状分解,等等。 膨胀 形态学变换 膨胀 采用向量加法对两个几何进行合并。膨胀 A+B 是所有向量加之和的集合。 在这个...
  • 二值形态学中的运算对象是集合, 但实际运算中, 当涉及两个集合时并不把它们看作是互相对等的。 一般设A为图像集合, S为结构元素, 数学形态学运算是用S对A进行操作。 结构元素本身也是一个图像集合, 不过通常其...
  • 使用两种大小尺寸的形态学膨胀算子优化带内重要系数编码,并对两种膨胀方式采用不同的算术编码模型,克服了传统单一算子不能平衡膨胀速度和膨胀质量的不足。使用差分缩减方式对各小波系数聚类簇的起始位置和稀疏系数...
  • 在matlab环境编程实现了形态学的核心算法膨胀、腐蚀,进一步可用它们的组合实现形态学的开运算,闭运算,交替滤波、混合滤波、交替混合滤波、梯度、多分辨分析,等。 可用于一维信号的时域分析处理。希望对你有用...
  • Matlab 形态学常用算法

    2021-04-30 02:32:02
    腐蚀:是膨胀的反操作,一般来说膨胀会扩张区域和腐蚀缩小区域膨胀可以填补细小的坑洞而腐蚀可以消除细的突起,maltab中使用imdalite(A,B)表示使用核B膨胀A区域,核B可以通过strel函数获得,如strel('disk',3)表示...
  • 形态学——膨胀

    千次阅读 2018-08-03 17:40:18
    1、基本概念 膨胀是将与目标区域的背景点合并到该目标...3、算法步骤 1)扫描原图,找到第一个像素值为0的背景点; 2)将预先设定好形状以及原点位置的结构元素的原点移到该点; 3)判断该结构元素所覆盖的像素...
  • 数学形态学的细化算法,涉及数学形态的膨胀、腐蚀、开、闭、击中击不中变换
  • 使用两种大小尺寸的形态学膨胀算子优化带内重要系数编码,并对两种膨胀方式采用不同的算术编码模型,克服了传统单一算子不能平衡膨胀速度和膨胀质量的不足.使用差分缩减方式对各小波系数聚类簇的起始 位置和稀疏...
  • C#膨胀腐蚀算法实现(vs2017可用),请在二值图的情况下使用
  • 在matlab环境编程实现了形态学的核心算法膨胀、腐蚀,进一步可用它们的组合实现形态学的开运算,闭运算,交替滤波、混合滤波、交替混合滤波、梯度、多分辨分析,等。 可用于一维信号的时域分析处理。希望对你有用...
  • 针对在岩石变形实验的熔融图像处理中,图像的曝光不均、单个像素点灰度值异常和裂痕带来的分割噪声问题,本文提出了一种基于数学形态学中的腐蚀、膨胀方法的自适应阈值分割算法,通过和全局阈值法和局部阈值法的对比...
  • 图像的形态学处理,可以完成开运算 闭运算 腐蚀 膨胀 TopHat变换,形态学梯度处理等算法,对于学习图像处理有很大的帮助
  • 基本的算法:膨胀腐蚀,开操作,闭操作,击中击不中变换几种算法进行组合,就可以实现一些非常复杂的功能,而且逻辑严密。这里给出形态学的一般原理,以及用形态学进行边界提取,角点提取好骨架提取的原代码一 引言...
  • 形态学处理 一 膨胀 二 腐蚀 三 开运算 四 闭运算 五 形态学梯度 六 顶帽 七 黑帽 形态学处理 一 膨胀  代码: #include &lt;opencv2/core/core.hpp&gt; #include &lt;ope...
  • 形态学滤波算法

    千次阅读 2014-06-23 22:31:00
    由于系统需要对数据进行实时滤波,所以研究了一下fir,iir和形态学滤波,发现形态学滤波是个相当不错的东东,对滤除尖峰...图二,将形态学滤波算法加入Qt中,对眼电进行实时滤波处理,效果如图:
  • 图像形态学膨胀算子

    千次阅读 2018-03-03 16:42:49
    膨胀运算在数字形态中的作用是把图像周围的背景点合并到物体中。如果两个物体之间距离比较近,那么膨胀运算可能会使这两个物体连接在一起。膨胀对填补图像分割后物体中的空洞很有用。 dilation1(Region, ...
  • 二值形态学——膨胀,腐蚀

    千次阅读 2011-05-18 16:06:00
    最近在做一个Motion Detection的课题,在课题中提取的运动物体往往由离散的点组成,如果要用连通分量的计算方法提取每个运动物体的轮廓不太容易,为此要将由离散点组成的图像进行膨胀,腐蚀运算。 膨胀 ...
  •   这篇文章就慢慢一边做实验一边写基本的形态学处理的内容,看着阮老师翻译的书直接用MATLAB靠自己的记忆写程序。慢慢更这篇,一边理解一边更,包括边界提取、孔洞填充(重点,因为我要考的课有道题就考这个)、骨架...
  • %开始膨胀 dilater = img; for i = sortrow:rows+sortrow-1 for j = sortcol:cols+sortcol-1 win = tempimg(i-sortrow+1:i+sortrow-1, j-sortcol+1:j+sortcol-1); dilater(i-sortrow+1, j-sortcol+1) = max( max...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,275
精华内容 2,110
关键字:

形态学膨胀算法