【数字图像处理】顶帽变换和底帽变换

文章链接:http://blog.csdn.net/kk55guang2/article/details/78490069

顶帽变换和底帽变换

灰度级图像 f 的顶帽变换(top-hat transformation)定义为f减去其开操作:
That(f)=f−(f°b)

类似地,f 的底帽变换(bottom-hat transformation)定义为f的闭操作减去f:
Bhat(f)=(f?b)−f

  这两个变换的主要应用之一是,用一个结构元通过开操作或闭操作从一副图像中删除物体,而不是拟合被删除的物体。然后,差操作得到一副仅保留已删除分量的图像。顶帽变换用于暗背景上的亮物体,而底帽变换则用于相反的情况。由于这一原因,当谈到这两个变换时,常常分别称为白顶帽变换和黑底帽变换。它们一个重要用途是校正不均匀光照的影响。[1]
实例
  下面,我们通过一个实例来说明此方法,对于图1(a),可以看到光照明显不均匀,左边光照更强,直接进行otsu法全局阈值得到图1(b),可以看到左边的硬币分割出错。
  由于原图是背景亮,前景暗,对原图进行底帽变换以解决光照不均匀的问题,这里先给出处理结果,如图1(c)和(d),可以看到底帽变换后的图像删除了大部分非均匀背景,最后阈值处理后,左边的硬币被分割出来,有少量残缺,但是影响不大,后续可以通过形态学的其他处理将残缺补齐。

                图1 处理图像
  那么为什么底帽变换或顶帽变换可以达到上述效果呢,下面以底帽变换为例,通过图像的灰度三维图来进行解释。
  底帽变换为f的闭操作减去f,闭运算可以几何意义是让球体紧贴在曲面的上表面滚动,此时球体任何部分所能达到的最低点即构成了闭运算f?bf?b的曲面。[2]
  图2为原图灰度三维图,上方弯曲的走势显示了图像各部分光照不均匀造成的背景灰度不均现象,其中凹陷对应图像中灰度值比较小的区域,也就是图像中的硬币。

  通过选取大于硬币大小的合适结构元,可以看成一个球体在灰度曲面上滚动,球体下表面的轨迹构成闭运算的曲面,如图3所示,原图中的凹陷都被填上,可以近似代表不均匀的背景。闭运算完之后再减去原图像即可得到背景近似均匀的图像,如图4所示,对应的灰度图可以看图1(c),可以看到不均匀的背景被大致去除,这将十分有助于后面的阈值分割。

参考程序:

//Image_Use为原图像,Image为处理图像副本
                      for (int i = 0; i < Use_ROWS; i++)
                            {
                                for (int j = 0; j < Use_Line; j++)
                                {
                                  Image[i][j] = Image_Use[i][j];
                                }
                            }
                    //二值化
                    int i,j;
                    int Threshold;
                    Threshold = GetOSTU(Image);
                    for(i = 0; i < Use_ROWS; i++)
                    {
                        for(j =0; j < Use_Line; j++)
                        {

                          if(Image[i][j] >= Threshold)
                                Image[i][j]=255;
                          else
                                Image[i][j]=0;

                        }
                    }

                    //去噪:不处理四边
                    int bai;
                    for(i = 1; i < Use_ROWS-1; i++)
                    {
                        for( j=1; j < Use_Line-1; j++)
                        {
                          if(Image[i][j] == 255) continue;
                          bai = Image[i-1][j] + Image[i-1][j-1] + Image[i-1][j+1] +Image[i][j+1] +Image[i][j-1] +Image[i+1][j] +Image[i+1][j-1] +Image[i+1][j+1] ;
                          if(bai == 2040)
                          Image[i][j] = 255;

                        }
                    }

                    //开操作
                     for (int i = 1; i < Use_ROWS-1; i++)
                            {
                                for (int j = 1; j < Use_Line - 1; j++)
                                {
                                    if (Image[i][j] == 255 &&
                                        Image[i][j + 1] == 255 &&
                                        Image[i][j - 1] == 255)
                                    {
                                        Image[i][j] = 255;
                                    }

                                }
                            }
                    for (int i = 1; i < Use_ROWS-1; i++)
                            {
                                for (int j = 1; j < Use_Line - 1; j++)
                                {
                                    if (Image[i][j] == 255 ||
                                        Image[i][j + 1] == 255 ||
                                        Image[i][j - 1] == 255)
                                    {
                                        Image[i][j] = 255;
                                    }
                                }
                            }
                  //原图像-开操作
                  for (int i = 0; i < Use_ROWS; i++)
                            {
                                for (int j = 0; j < Use_Line; j++)
                                {
                                  Image_Use[i][j] = Image_Use[i][j] - Image[i][j];
                                }
                            }  

                  //再进行顶帽变换的图像进行二值化
                 Threshold = GetOSTU(Image_Use);
                  for(i = 0; i < Use_ROWS; i++)
                    {
                        for(j =0; j < Use_Line; j++)
                        {

                          if(Image_Use[i][j] >= Threshold)
                                Image_Use[i][j]=255;
                          else
                                Image_Use[i][j]=0;

                        }
                    }
                    //去噪:不处理四边
                    for(i = 1; i < Use_ROWS-1; i++)
                    {
                        for( j=1; j < Use_Line-1; j++)
                        {
                          if(Image_Use[i][j] == 255) continue;
                          bai = Image_Use[i-1][j] + Image_Use[i-1][j-1] + Image_Use[i-1][j+1] +Image_Use[i][j+1] +Image_Use[i][j-1] +Image_Use[i+1][j] +Image_Use[i+1][j-1] +Image_Use[i+1][j+1] ;
                          if(bai == 2040)
                          Image_Use[i][j] = 255;
                        }
                    }

参考文献
[1]《数字图像处理》(第3版),冈萨雷斯著,阮秋琦译,电子工业出版社,2013年;
[2]《数字图像处理与机器视觉——Visual C++与Matlab实现》,张铮,王艳平,薛桂香等编著,人民邮电出版社,2014年

原文地址:https://www.cnblogs.com/-wenli/p/11980413.html

时间: 2024-08-28 14:10:51

【数字图像处理】顶帽变换和底帽变换的相关文章

C++数字图像处理(1)-伽马变换

https://blog.csdn.net/huqiang_823/article/details/80767019 1.算法原理    伽马变换(幂律变换)是常用的灰度变换,是一种简单的图像增强算法.数学公式如下:(1)    式(1)中,r为输入的灰度值,取值范围为[0, 1].C称为灰度缩放系数,用于整体拉伸图像灰度,通常取值为1.gamma取值灰度输入输出曲线图如下:图(1) gamma曲线图    从图(1)可知:当gamma>1.0时,伽马变换将拉低图像灰度值,图像视觉上变暗:当ga

MATLAB数字图像处理(一)基础操作和傅立叶变换

数字图像处理是一门集计算机科学.光学.数学.物理学等多学科的综合科学.随着计算机科学的发展,数字图像处理技术取得了巨大的进展,呈现出强大的生命力,已经在多种领域取得了大量的应用,推动了社会的发展.其中,遥感领域中,对于影像数据的处理均基于数字图像处理的技术.而遥感影像数据作为地理信息科学的重要数据源,如何从中获取有用的信息,是地理信息数据处理中重要的内容. MATLAB作为数学领域应用最广泛的一种软件,集成了对于图片处理的函数和功能,成为了处理数字图像问题的佼佼者.其出众的计算能力和简便的绘图能

数字图像处理【一】基础理论

1. 基本处理流程: a) 图像预处理: 1) 点运算(灰度直方图/灰度线性变换/灰度对数变换/伽马变换/灰度阈值变换/分段线性变换/直方图均衡化/直方图规定化) 2) 几何变换(图像平移/图像镜像/图像转置/图像缩放/图像旋转/插值算法/图像配准) 3) 空间域图像增强(空间域滤波/图像平滑/中值滤波/图像锐化) 4) 频域图像增强(傅里叶变换/频率滤波) 5) 彩色图像处理(彩色模型(RGB/CMY/CMYK/HSI/HSV/YUV/YIQ/Lab)/彩色补偿/彩色平衡) 6) 形态学图像处

初始----python数字图像处理--:环境安装与配置

一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因此,我们这里使用python这个脚本语言来进行数字图像处理. 要使用python,必须先安装python,一般是2.7版本以上,不管是在windows系统,还是linux系统,安装都是非常简单的. 要使用python进行各种开发和科学计算,还需要安装对应的包.这和matlab非常相似,只是matla

OpenCV-跟我一起学数字图像处理之直方图均衡化

从这篇博文开始,小生正式从一个毫不相干专业转投数字图像处理.废话不多说了,talk is cheap. show me the code. 直方图均衡化目的 由于一些图像灰度的分布过于集中,这样会导致图像的层次不够分明,直方图均衡化就是为了让图像的灰度分布更均匀,图像的层次感更强. 数学原理 基于连续灰度分布的结论推导 直方图均衡化属于数字图像处理中灰度变换(intensity transformation)的内容,灰度变换的目的就是找到一个合适的映射函数s=T(r).将原图像的灰度值映射到新的

《数字图像处理原理与实践(MATLAB版)》一书之代码Part5

本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part5,辑录该书第225至第280页之代码(此处应部分读者之需求调整了代码发布的顺序--详细说明请见下面的文章链接),供有需要读者下载研究使用.代码执行结果请参见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MATLAB版)>一书代码发布的说明 http://blog.csdn.net/baimafujinji/article/details/40987807 P245 I = imread(

数字图像处理 简单介绍

 数字图像处理发展概况 数字图像处理发展概况数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程.数字图像处理最早出现于20世纪50年代,当时的电子计算机已经发展到一定水平,人们開始利用计算机来处理图形和图像信息.数字图像处理作为一门学科大约形成于20世纪60年代初期.早期的图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的.图像处理中,输入的是质量低的图像,输出的是改善质量后的图像

数字图像处理-----直方图均衡化

直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等.这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果. 直方图是表示数字图像中每一灰度出现频率的统计关系.直方图能给出图像灰度范围.每个灰度的频度和灰度的分布.整幅图像的平均明暗和对比度等概貌性描述.灰度直方图是灰度级

【数字图像处理之(三)】用图像增强谈灰度变换

前面已经说了,数字图像处理是指通过计算机对数字图像进行去除噪声.增强.复原.分割.提取特征等处理的方法和技术. 其主要目的有三个方面: 提高图像的视感质量,如进行图像的亮度.彩色变换,增强.抑制某些成分,对图像进行几何变换等,以改善图像的质量. 图像数据的变换.编码和压缩,以便于图像的存储和传输. 提取图像中所包含的某些特征或特殊信息,这些被提取的特征或信息往往为计算机分析图像提供便利.提取特征或信息的过程是模式识别或计算机视觉的预处理.提取的特征可以包括很多方面,如频域特征.灰度或颜色特征.边