数字图像处理笔记(九)基本的形态学算法
0.前言
这篇文章就慢慢一边做实验一边写基本的形态学处理的内容,看着阮老师翻译的书直接用MATLAB靠自己的记忆写程序。慢慢更这篇,一边理解一边更,包括边界提取、孔洞填充(重点,因为我要考的课有道题就考这个)、骨架、连通分量、细化、裁剪等等。
1.边界提取
表示为 β(A)\beta(A)β(A) 的集合 AAA 的边界可以先用 BBB 对 AAA 服饰,而后做 AAA 和 腐蚀结果的之间的集合之差得到,即β(A)=A−(A⊖B)\beta(A) = A - (A \ominus B)β(A)=A−(A⊖B)
我在思考边界提取和边缘提取到底有什么区别,就写了写对比了下,思考了下。
边界:专门指外部的轮廓
边缘:在数字图像处理中专门指灰度突变的地方
然后写了个程序对比了下,发现其实确实形态学处理起来还真有点带感。
程序的思路是读入彩色图像,然后将彩色图转灰度图之后利用 edge 提取边缘,以及提取3个通道的分量去提取边缘,然后进行对比。
而边界提取可以直接在彩色空间中操作,所以我用上面的公式,直接得到彩色的边界,然后在彩色边界中提取R、G、B分量,之后进行显示对比。其中结构元是 5*5 的 strucure
先看下面的结果吧
以前手撸过canny边缘的算法,这次用了系统自带的 edge 函数,二阶边缘,速度快、识别效率高,但是MATLAB中 edge 函数需要转换到灰度空间去做,并且最后一步连通的时候出来结果是 二值图 ,采用 rgb2gray 函数不免会有灰度损失,而直接直接提取各个分量容易造成在浮点型转化的时候的精度损失。左边的图是边缘提取的结果,是黑白二值图 ,而右边的是利用上面公式提取出来的 彩色边界 ,看到轮廓分明,神清气爽。
再看下面的另一个结果吧
诚如我在之前说的,利用 edge 函数需要在灰度图像进行,所以我提取R、G、B空间进行边缘提取,但是由于提取出来的灰度图每个灰度值不一样,所以容易导致了可能灰度突变的地方不一样,所以显示出的 边缘 有些不一样,而利用传统的边界提取方法的边界提取的绝对一样,仅仅只是在灰度显示有差别罢了,况且人眼还识别不出来。
1.1总结
边缘和边界的提取有差别,并且有不同的方法,在边界提取的时候结构元的大小选择也有考究,需要再进一步思考吧!
1.2代码
%Coding = UTF8
%By neverland!
%Nov 19th
%version1.0%读入图像im = imread('test.jpg');
%操作gray_im = rgb2gray(im); %灰度图r = im(:,:,1); %红g = im(:,:,2); %绿b = im(:,:,3); %蓝r_edge = edge(r,'canny'); %红边缘g_edge = edge(g,'canny'); %绿边缘b_edge = edge(b,'canny'); %蓝边缘%显示图像subplot(2,3,1);imshow(r_edge); title('红通道canny边缘','fontsize',20);subplot(2,3,2);imshow(g_edge); title('绿通道canny边缘','fontsize',20);subplot(2,3,3);imshow(b_edge); title('蓝通道canny边缘','fontsize',20);%利用边界提取的方法提取str_ = ones(5,5); %结构元combined_edge = im - imerode(im,str_); %边界提取%显示图像subplot(2,3,4);r_edge2 = combined_edge(:,:,1);imshow(r_edge2);title('第二种方法提红边界','fontsize',20); subplot(2,3,5);g_edge2 = combined_edge(:,:,2);imshow(g_edge2);title('第二种方法提绿边界','fontsize',20);b_edge2 = combined_edge(:,:,3);subplot(2,3,6);imshow(b_edge2);title('第二种方法提蓝边界','fontsize',20);%开启另一个窗口对比figuregray_edge = edge(gray_im,'canny');subplot(1,2,1);imshow(gray_edge); title('灰度图像提取边缘','fontsize',20);subplot(1,2,2);imshow(combined_edge);title('利用形态学处理提取的边界','fontsize',20);
2.孔洞填充
孔洞是和背景相互连接的边界所包围的一个背景区域,如下面图所示,红色部分框起来的部分就是孔洞,在《数字图像处理第三版》中,处理孔洞一共有3种方法,但是在各种paper里也提出了其他的方法,其实不外乎就是基本的形态学处理、种子填充、扫描线 ,由于书上给的方法很难实现,实验的时候直接用了一个 imfill 的函数,感觉好菜,不过确实如果要知道孔洞的一个起始点,这样好费劲,还不自动。
2.1 形态学的方法
Xk=(XK−1⊕B)h∪AChhk=1,2,3,⋯X_k = (X_{K-1} \oplus B ) \phantom{h} \cup A^C \phantom{hh} k=1,2,3,\cdotsXk=(XK−1⊕B)h∪AChhk=1,2,3,⋯ 看了看图,实际是就是用了一个结构元从孔洞的一个任意内部开始膨胀,然后再和原图像的补集求交集,因为原图像孔洞部分(挖去的一部分)的值为0,而求完补集之后就变成有值的部分了,那么和做完膨胀的图像求交集就填充了一部分孔洞,然后多做几次,直到不再变化为止。
这种方法费时费力,需要自己先定义一个起始点,然后进行膨胀,然后和补集合求交集,最后再和原来图像求并集,才能得到想要的图。
有一个结构元是十字架,然后比如已经知道了 X0X_0X0 即一个孔洞的起点,用十字架去膨胀,膨胀之后和补集求交就补了一部分,持续下去,直到你认为可以为止,matlab直接使用imfill函数即可,当然如果是手撕算法的话,
就是这样吧。。。把。。。。
%MATLAB内置的函数填充im = imread('kongdong.tif');im_ = im2bw(im);true_im = imfill(im_,'holes');subplot(1,2,1);imshow(im);subplot(1,2,2);imshow(true_im);
%手撕算法A = imread('kongdong.tif');A = im2bw(A); %二值化A_hat = ~A; %A的补集[m,n] = size(A);X = zeros(m,n);[x,y] = find(A==1); %任意选取A中灰度值为1的点的位置 X(x(1),y(1)) = 1; %选取第一个灰度值为1的点为初始点se = [0,1,0;1,1,1;0,1,0]; %结构元flag = 0; % 迭代标志i = 0; %迭代次数while(~flag)i = i + 1;Xp = X;X = imdilate(X,se) & A_hat; %膨胀后与补集求交集if X == Xp flag = 1; endendA_ = ~X | A; %求并集figure(1);subplot(1,2,1);imshow(A);title('二值化后的图','fontsize',30);subplot(1,2,2);imshow(A_);
title('填充结果','fontsize',30);
比imfill好像厉害点。。
https://blog.csdn.net/LYduring/article/details/80443709
这个手撕算法的话引用的是这篇blog里的。
数字图像处理笔记(九)基本的形态学算法相关推荐
- 数字图像处理笔记2-nbsp;边沿检…
原文地址:数字图像处理笔记2- 边沿检测与提取,轮廓跟踪(转)作者:小草帽 7.1 边沿检测 我们给出一个模板 和一幅图象 .不难发现原图中左边暗,右边亮,中间存在着一条明显的边界.进行模板操作后的结 ...
- 数字图像处理笔记-02(图像空域增强技术及联合运用)
数字图像处理笔记-02(图像空域增强技术及联合运用) (一) 图像增强 1.1 基本概念 由于图像在传输或者处理过程中会引入噪声或使图像变模糊,从而降低了图像质量,甚至淹没了特 征,给分析带来了困难. ...
- OpenCV与图像处理学习九——连通区域分析算法(含代码)
OpenCV与图像处理学习九--连通区域分析算法(含代码) 一.连通区域概要 二.Two-Pass算法 三.代码实现 一.连通区域概要 连通区域(Connected Component)一般是指图像中 ...
- Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法
Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法 原文:Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法 [函数名称] 二值图像轮廓提取 ...
- 【数字图像处理matlab】(HSI变换融合算法)
[数字图像处理matlab](HSI变换融合算法) 输入一张高分辨率的全色影像HR,一张低分辨率的多光谱影像MS,采用HSI变换融合算法实现影像融合,其中RGB与HSI影像的相互转换调用自定义函数RG ...
- 数字图像处理笔记(一)——图像存储空间,分辨率,图像内插
数字图像处理笔记(一)--图像存储空间,分辨率,图像内插 本系列笔记是笔者在学习冈萨雷斯<数字图像处理>第三版时做的总结,日后看的时候方便点,如果有幸得到大家的讨论,喜上眉梢. 本节参考书 ...
- 数字图像处理实验(七)| 形态学图像处理{生成结构元素strel、腐蚀运算imerode、膨胀运算imdilate、开运算imopen、闭运算imclose}(附代码和实验截图、汉字视力表项目、总结)
文章目录 一.实验目的 二.实验仪器 三.实验原理 1. 结构元素: 2. 腐蚀运算: 3. 膨胀运算: 4. 开运算: 5. 闭运算: 四.实验内容: 1. 形态学图像处理用于图像边界提取 2.数学 ...
- 数字图像处理笔记(一)基础内容
基础内容 数字图像是什么,和模拟图像又有什么区别 数字图像处理 数字图像处理研究内容 数字图像处理有哪些方法 计算机图形学和数字图像处理的区别 常用的数字图像处理开发工具 数字图像 图像的数学表达 数 ...
- 【图像处理】数字图像处理笔记
文章目录 直方图处理 滤波器 图像复原 形态学图像处理 灰度形态学--多使用平坦结构元(SE)[数字图像处理P428 图像分割 1.canny边缘检测[数字图像处理P463] 图像的表征 特征描述子 ...
- Win8 Metro(C#)数字图像处理--2.60部分彩色保留算法
原文:Win8 Metro(C#)数字图像处理--2.60部分彩色保留算法 [函数名称] 部分彩色保留函数 WriteableBitmap PartialcolorProcess(W ...
最新文章
- 3D Detection 论文汇总
- msvc 编译路径_Colmap编译教程
- Java程序员从笨鸟到菜鸟之(八)反射和代理机制
- mycat配置访问oracle_教程 | MySql都会了,确定不学习一下MyCat分片?
- 顺利搭建了oracle
- common lisp 学习第二天 简单数据库操作
- setyear java_如何在Java中创建不可变类
- SAP License:把握好集成测试大关,ERP就成功了一大半
- 我用Python采集了班花的空间数据集,除了美照竟然再一次发现了她另外的秘密!
- 二分查找向上还是向下取整_113、股市中的跳空缺口判断技巧是向上还是向下
- php 图像居中裁剪函数,PHP 实现的自定义图像居中裁剪函数示例
- c php乱码,Cknife的PHP功能部分修正,解决SHELL无法回显以及中文乱码
- 监控显示服务器超时,监控连接服务器超时怎么解决
- 语义分割之《CCNet: Criss-Cross Attention for Semantic Segmentation》论文阅读笔记
- 导致 Scan VIP 和 Scan Listener(监听程序)出现故障的最常见的 5 个问题 (文档 ID 1602038.1)
- 【免费抢票】6月9日杭州,产品经理会议
- java算法——通过身份证号获取出生的年月日
- 事件回放:因「鹿晗、关晓彤」公布恋情,微博瘫痪了……
- 《小窗幽记》全文 陈继儒
- 主从模式的数据库搭建(主从复制)
热门文章
- 如何修改背景色?证件照背景颜色怎样换成白色?
- 实战1--航空公司客户价值分析(画图篇)
- linux环境使用c语言获取系统时间,并拼接成字符串
- Windows Installer服务总是自动关闭导致无法安装在win10上安装英伟达显卡驱动的解决方案...
- 杭州电子科技大学计算机调剂,2019年杭州电子科技大学硕士研究生调剂公告
- 计算机DSU,研科d5000dsu驱动
- android app 设计,安卓APP新手设计教程:19条Android设计经验大全
- error: invalid operands of types ‘QLabel*‘ and ‘void‘ to binary ‘operator>
- 怎么用命令提示符测试软件网速,cmd指令测试网速技巧
- 您需要计算机管理员提供的权限才能更改,您需要管理员权限才能删除此文件夹...