0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍MATLAB一种算法实现方式

电子工程师 来源:未知 作者:刘勇 2018-08-27 10:32 次阅读

本篇文章要分享的是基于MATLAB的腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,腐蚀在二值图像的基础上做“收缩”或“细化”操作,膨胀在二值图像的基础上做“加长”或“变粗”的操作。

什么是二值图像呢?把一幅图片看做成一个二维的数组,那么二值图像是一个只有0和1的逻辑数组,我们前面Sobel边缘检测后的图像输出边缘效果,设置个阈值,大于阈值输出为1,小于阈值输出为0,最后输出就是一幅二值图像了。

腐蚀

腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。用3X3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为1,结果图像的该像素为1。否则为0。结果会使二值图像小一圈。

有一个形象的比喻来可以说明该运算,用0表示蛀虫,1表示大米。蛀虫腐蚀大米的过程便是腐蚀运算,

腐蚀

如图所示,对于一个像素矩阵而言,只要有蛀虫(0)的存在,大米(1)就会被腐蚀掉了,即使只存在一个蛀虫(0),但是还是会被蛀虫腐蚀完毕,最后一幅图上面由于没有蛀虫(0)所以大米完好无损。

关于算法的实现,可以用下式子来表示,即3x3像素的运算:

P = P11 & P12 & P13 & P21 & P22 & P23 & P31 & P32 & P33

FPGA中,为了通过面积去换速度,我们将上式改变如下:

P1 = P11 & P12 & P13

P2 = P21 & P22 & P23

P3 = P31 & P32 & P33

P = P1 & P2 & P3

MATLAB中可以直接写一个按位或运算。

膨胀

膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空洞。用3X3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为0,结果图像的该像素为0,。否则为1。结果使二值图像扩大一圈。

先腐蚀后膨胀的过程称为开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显的改变其面积。先膨胀后腐蚀的过程称为比运算,用来填充物体内细小空间、连接邻近物体、平滑其边界的同时并不明显改变其面积。

膨胀算法用最简单的比喻来描述:0表示害虫,1表示青蛙,青蛙吃了害虫表示膨胀运算,我们用3*3像素阵列来解释:

膨胀

如图所示,图左只有害虫(0),所以害虫都活着,中间那个图,虽然只有一个害虫,但是还是会被青蛙全部吃掉,最右边的那幅图,都是青蛙,所以青蛙始终是青蛙。

关于算法的实现,可以用下式子来表示,即3x3像素的运算:

P = P11 | P12 | P13 | P21 | P22 | P23 | P31 | P32 | P33

在HDL中,为了通过面积去换速度,我们将上式改变如下:

P1 = P11 | P12 | P13

P2 = P21 | P22 | P23

P3 = P31 | P32 | P33

P = P1 | P2 | P3

MATLAB中可以直接写一个按位与运算。

开运算闭运算

先腐蚀后膨胀叫开运算,开运算的作用是清除图像边缘周围非边缘的细小的点。先膨胀后腐蚀为闭运算,闭运算的作用是清除图像内部的空洞,

如果我们的目标物体外面有很多无关的小区域,就用开运算去除掉;如果物体内部有很多小黑洞,就用闭运算填充掉。

MATLAB逻辑运算函数

bitand(), 对十进制数进行逐位逻辑与运算:先将十进制数转换成二进制数,然后逐位与运算,其运算结果转换为十进制。

bitor(), 对十进制数进行逐位逻辑或运算:先将十进制数转换成二进制数,然后逐位与运算,其运算结果转换为十进制。

MATLAB代码实现

1 %RGB_YCbCr  2 clc;  3 clear all;  4 close all;  5   6 RGB_data = imread('lena.jpg');  7   8 R_data =  RGB_data(:,:,1);  9 G_data =  RGB_data(:,:,2);  10 B_data =  RGB_data(:,:,3);  11   12 %imshow(RGB_data);  13   14 [ROW,COL, DIM] = size(RGB_data); 
 15   16 Y_data = zeros(ROW,COL);  17 Cb_data = zeros(ROW,COL);  18 Cr_data = zeros(ROW,COL);  19 Gray_data = RGB_data;  20   21 for r = 1:ROW 
 22   for c = 1:COL  23     Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);  24     Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;  25     Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;  26   end  27 end 
 28   29 Gray_data(:,:,1)=Y_data;  30 Gray_data(:,:,2)=Y_data;  31 Gray_data(:,:,3)=Y_data;  32   33 figure;  34 imshow(Gray_data);  35   36 %Median Filter  37 imgn = imnoise(Gray_data,'salt & pepper',0.02); 
 38   39 figure;  40 imshow(imgn);  41   42 Median_Img = Gray_data;  43 for r = 2:ROW-1  44   for c = 2:COL-1  45     median3x3 =[imgn(r-1,c-1)  imgn(r-1,c) imgn(r-1,c+1)  46           imgn(r,c-1)   imgn(r,c)   imgn(r,c+1)  47           imgn(r+1,c-1)   imgn(r+1,c) imgn(r+1,c+1)];  48     sort1 = sort(median3x3, 2, 'descend'); 49     sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');  50     sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');  51     sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');  52     mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');  53     Median_Img(r,c) = mid_num(2);  54   end  55 end  56   57 figure;  58 imshow(Median_Img);  59   60 %Sobel_Edge_Detect  61   62 Median_Img = double(Median_Img);  63 Sobel_Threshold = 150;  64 Sobel_Img = zeros(ROW,COL);  65   66 for r = 2:ROW-1  67   for c = 2:COL-1  68     Sobel_x = Median_Img(r-1,c+1) + 2*Median_Img(r,c+1) + Median_Img(r+1,c+1) - Median_Img(r-1,c-1) - 2*Median_Img(r,c-1) - Median_Img(r+1,c-1);  69     Sobel_y = Median_Img(r-1,c-1) + 2*Median_Img(r-1,c) + Median_Img(r-1,c+1) - Median_Img(r+1,c-1) - 2*Median_Img(r+1,c) - Median_Img(r+1,c+1);  70     Sobel_Num = abs(Sobel_x) + abs(Sobel_y);  71     %Sobel_Num = sqrt(Sobel_x^2 + Sobel_y^2);  72     if(Sobel_Num > Sobel_Threshold)  73       Sobel_Img(r,c)=255;  74     else  75       Sobel_Img(r,c)=0;  76     end  77   end  78 end  79   80 figure;  81 imshow(Sobel_Img);  82   83 %imopen Erosion_Dilation  84 %Erosion  85 % Erosion_img = zeros(ROW,COL);  86 % for r = 2:ROW-1  87   % for c = 2:COL-1  88     % and1 = bitand(Sobel_Img(r-1, c-1), bitand(Sobel_Img(r-1, c), Sobel_Img(r-1, c+1)));  89     % and2 = bitand(Sobel_Img(r, c-1), bitand(Sobel_Img(r, c), Sobel_Img(r, c+1)));  90     % and3 = bitand(Sobel_Img(r+1, c-1), bitand(Sobel_Img(r+1, c), Sobel_Img(r+1, c+1)));  91     % Erosion_img(r, c) = bitand(and1, bitand(and2, and3));  92   % end  93 % end  94   95 % figure;  96 % imshow(Erosion_img);  97   98 % %Dilation  99 % Dilation_img = zeros(ROW,COL);100 % for r = 2:ROW-1101   % for c = 2:COL-1102     % or1 = bitor(Erosion_img(r-1, c-1), bitor(Erosion_img(r-1, c), Erosion_img(r-1, c+1)));103     % or2 = bitor(Erosion_img(r, c-1), bitor(Erosion_img(r, c), Erosion_img(r, c+1)));104     % or3 = bitor(Erosion_img(r+1, c-1), bitor(Erosion_img(r+1, c), Erosion_img(r+1, c+1)));105     % Dilation_img(r, c) = bitor(or1, bitor(or2, or3));106   % end107 % end108 109 % figure;110 % imshow(Dilation_img);111 112 %imclose Erosion_Dilation113 %Dilation114 Dilation_img = zeros(ROW,COL);115 for r = 2:ROW-1116   for c = 2:COL-1117     or1 = bitor(Sobel_Img(r-1, c-1), bitor(Sobel_Img(r-1, c), Sobel_Img(r-1, c+1)));118     or2 = bitor(Sobel_Img(r, c-1), bitor(Sobel_Img(r, c), Sobel_Img(r, c+1)));119     or3 = bitor(Sobel_Img(r+1, c-1), bitor(Sobel_Img(r+1, c), Sobel_Img(r+1, c+1)));120     Dilation_img(r, c) = bitor(or1, bitor(or2, or3));121   end122 end123 124 figure;125 imshow(Dilation_img);126 127 %Erosion128 Erosion_img = zeros(ROW,COL);129 for r = 2:ROW-1130   for c = 2:COL-1131     and1 = bitand(Dilation_img(r-1, c-1), bitand(Dilation_img(r-1, c), Dilation_img(r-1, c+1)));132     and2 = bitand(Dilation_img(r, c-1), bitand(Dilation_img(r, c), Dilation_img(r, c+1)));133     and3 = bitand(Dilation_img(r+1, c-1), bitand(Dilation_img(r+1, c), Dilation_img(r+1, c+1)));134     Erosion_img(r, c) = bitand(and1, bitand(and2, and3));135   end136 end137 138 figure;139 imshow(Erosion_img);

处理后结果对比

为了可以清晰的看到图像边缘的变化,我们把黑色作为背景,白色作为边缘。

Sobel边缘检测后的lena

腐蚀后的lena

膨胀后的lena

先腐蚀后膨胀开运算lena

先膨胀后腐蚀闭运算lena

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    182

    文章

    2963

    浏览量

    230160

原文标题:基于MATLAB的腐蚀膨胀算法实现

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FFT 算法一种 FPGA 实现

    本帖最后由 lee_st 于 2017-11-22 08:28 编辑 摘 要: FFT 运算在OFDM 系统中起调制和解调的作用。针对OFDM 系统中FFT 运算的要求, 研究了一种易于
    发表于 11-21 15:55

    一种基于FPGA的实时视频图像处理算法研究与实现

    摘要为有效提高视频监控应用领域中多屏幕画面显示的清晰度、分辨度等问题,提出了一种基于FPGA的实时视频图像处理算法。文中介绍了系统的整体结构,然后针对FPGA模块介绍了视频图像的缓存及
    发表于 06-28 07:06

    介绍一种防止相位假信号的具体算法

    什么是S参数测量?S参数插补算法是什么?介绍一种防止级联的S参数出现相位假信号的具体算法
    发表于 04-30 07:00

    介绍一种基于Winpcap的网络视频流识别算法

    本文设计了一种基于Winpcap的网络视频流识别算法实现了对网络流媒体的发现。
    发表于 06-03 06:34

    如何去实现一种错误控制编码的算法

    什么是错误控制编码?如何去实现一种错误控制编码的算法?什么是解码算法
    发表于 06-21 08:13

    如何去实现一种方波控制算法

    无刷直流电机可分为哪几种?什么是方波控制?如何去实现一种方波控制算法?有哪些步骤?
    发表于 08-10 07:14

    果蝇优化算法MATLAB实现

    果蝇优化算法MATLAB实现发布时间:2018-10-12 23:28,浏览次数:1183, 标签:MATLAB果蝇优化算法--
    发表于 08-17 07:28

    一种解决函数优化问题的免疫算法

    一种解决函数优化问题的免疫算法:介绍了免疫算法的基本概念,以及人工免疫系统中的克隆选择原理,基于该原理,结合遗传策略中的高斯变异算子,提出一种
    发表于 11-08 16:47 14次下载

    一种多核混合分区调度算法设计与实现

    一种多核混合分区调度算法设计与实现_郝继锋
    发表于 01-07 19:00 1次下载

    BP算法及其matlab实现

    高级自动控制算法:BP算法及其matlab实现
    发表于 12-02 11:45 2次下载

    Matlab关于Apriori算法设计

    本文详细介绍Matlab关于Apriori算法设计。Apriori算法一种最有影响的挖掘布尔关联规则频繁项集的
    发表于 02-02 16:20 5113次阅读
    <b class='flag-5'>Matlab</b>关于Apriori<b class='flag-5'>算法</b>设计

    如何实现一种改进的Bayer图像彩色恢复差值算法

    传感器采集到的都是经过滤波镜·片后的Bayer格式马赛克图像,为了恢复丢失掉的色彩信息,必须经过插值计算。针对图像采集系统处理的实时性要求,结合自适应插值法和三角函数法则,提出了一种适用于硬件实现
    发表于 04-02 09:33 8次下载

    文详解限流算法实现方式

    不依赖外部库的情况下,限流算法有什么实现的思路?本文介绍了3实现限流的方式
    的头像 发表于 05-25 12:00 1389次阅读

    MATLAB/simulink中建模时的两不同实现方式

    导读:本期文章主要介绍MATLAB/simulink中建模时的两不同实现方式一种是直接用现
    的头像 发表于 09-15 10:07 1830次阅读

    MATLAB/simulink中两实现建模方式的优势

    导读:本期文章主要介绍MATLAB/simulink中建模时的两不同实现方式一种是直接用现
    的头像 发表于 09-15 10:10 4913次阅读