使用Numpy和Opencv完成图像的基本数据分析(Part IV)

图像
本文是使用python进行图像基本处理系列的第四部分,在本人之前的文章里介绍了一些非常基本的图像分析操作,见文章《使用numpy和opencv完成图像的基本数据分析part i》、《使用numpy和opencv完成图像的基本数据分析 part ii》及《使用numpy和opencv完成图像的基本数据分析 part iii》,下面我们将继续介绍一些有关图像处理的好玩内容。
本文介绍的内容基本反映了我本人学习的图像处理课程中的内容,并不会加入任何工程项目中的图像处理内容,本文目的是尝试实现一些基本图像处理技术的基础知识,出于这个原因,本文继续使用scikit-image,numpy数据包执行大多数的操作,此外,还会时不时的使用其他类型的工具库,比如图像处理中常用的opencv等:
本系列分为四个部分,分别为part i、part ii、part iii及part iv。刚开始想把这个系列分成两个部分,但由于内容丰富且各种处理操作获得的结果是令人着迷,因此不得不把它分成四个部分。系列所有的源代码地址:github-image-processing-python。现在,让我们开始吧!
阈值
大津法|otsu
阈值处理是图像处理中非常基本的操作。将灰度图像转换为单色是常见的图像处理任务。而且,一个好的算法总是以良好的基础开始!
otsu阈值处理是一种简单而有效的全局自动阈值处理方法,用于二值化灰度图像,比如前景(foreground)和背景(background)。在图像处理中,otsu阈值处理方法(1979)完全基于对图像直方图执行的计算,该算法假设图像由两个基本类组成——前景和背景。当取最佳阈值时,前景和背景两部分之间的差别应该是最大的,在otsu算法中所采用的衡量差别的标准就是较为常见的最大类间方差。前景和背景之间的类间方差如果越大,就说明构成图像的两个部分之间的差别越大,当部分目标被错分为背景或部分背景被错分为目标,都会导致两部分差别变小,当所取阈值的分割使类间方差最大时就意味着错分概率最小 然后,它计算最小阈值,最小化这两个类的类方差的加权。
目前,otsu阈值法被广泛应用于医学成像、低级计算机视觉的许多应用中,该算法有很多优点和假设。
otsu阈值法的数学公式在我的个人主页上有所介绍,在那里详细解释了otsu阈值法背后的数学原理。
算法
如果我们把一个简单的数学融入到简单的步进算法中,上述的解释就会演变成:
计算每个强度等级的直方图和概率。设置初始μi。从阈值 t=0逐步到t=l-1:更新:wi和μi计算:σ2b(t)
期望阈值对应于σ2b(t)的最大值。
从上图可以看出,分离效果不错,但看起来并不是很好。如果假设直方图具有双峰分布( bimodal distribution),并且假设在两个峰之间具有深且尖锐的波谷,则otsu阈值法能够表现出相对良好的性能 。
因此,假设图像的前景区域与背景区域差别比较小,则直方图不再呈现双峰分布,并且前景与背景强度的差异与平均差异相比较大,或图像被加性噪声严重破坏时,灰度直方图两峰之间的波谷值会降低,其尖锐性也会大打折扣。
结论:由otsu阈值法确定的某些可能不正确的阈值将导致分割错误,但我们可以进一步改进该方法。
k均值聚类|kmeans clustering
k-均值聚类是矢量量化的一种方法,最初是应用于信号处理中,目前常用于数据挖掘中的聚类分析。在otsu阈值法中,我们找到了最小化内插像素方差的阈值。因此,我们可以不从灰度图像中寻找合适的阈值,而可以在彩色空间中去寻找聚类,通过这样的处理,最终演变为 k-均值聚类技术。
为了对图像进行聚类,需要将其转换为二维数组。
接下来,我们使用scikit-learn中的集群方法来创建集群。我们将n_clusters设置为5,表明最终会形成五个簇。最终的聚类效果会在生成的图像中展示,从图中可以看到,已经将其划分为具有不同颜色的五个部分。
将聚类簇的个数设置为5是为了演示例子,我们同样可以更改群集的数量,通过设置不同的集群数来进行对比实验,以可视化的方式验证具有不同颜色的图像,以最终确定,选择多少的群集数量才是比较合适的。
一旦形成了簇,我们就可以使用簇中心和标签重新创建图像,以显示具有分组模式的图像。
线型检测
霍夫变换|hough transform
霍夫变换是图像处理中比较流行的一种技术。如果我们能用数学形式表示出某个形状,那么它久可以用来检测出任何形状。即使图像形状被稍微扭曲或者被破坏,它也可以从中检测出形状。在通过代码实现该算法之前,我们不会过于深入地分析霍夫变换的基本原理,而是还提供一些资源来使得读者能够更详细地理解它。
霍夫变换的数学公式可以在我的主页查看,并且,主页上也详细解释了霍夫变换算法背后的数学原理。
算法
拐角或边缘检测ρ范围和θ范围创建ρ:-dmax ~dmax;θ:-90~90;霍夫累加器二维数组的行数等于ρvalues的数量,列数等于θ的数量;在累加器中投票对于每个边缘点和每个θ值,找到最接近的ρvalue并在累加器中递增该索引;峰值检测累加器中的局部最大值表示输入图像中最突出线条的参数;
边缘检测
边缘检测是一种用于查找图像内对象边界的图像处理技术,其工作原理是检测亮度的不连续性。常见的边缘检测算法包括
索贝尔算子(sobel)卡尼算子(canny)普鲁伊特算子(prewitt)罗伯茨算子(roberts)模糊逻辑方法(fuzzy logic)
在这里,我们介绍一种最流行的方法,即 canny 边缘检测(canny edge detection)。
canny边缘检测
该方法是一种能够检测图像中宽范围边缘的多级边缘检测操作。一般而言,canny边缘检测算法可以分解为以下5个步骤:
1.应用高斯滤波器;2.找到强度梯度;3.应用非最大抑制;4.应用双重阈值;5.通过滞后跟踪边缘;
以上是canny边缘检测的算法概述,有关更全面的概述,请查看本文末尾给定链接。由于本文的长度限定,本文在此处不展示完整的实现代码,而是直观地概述该代码的相关算法。
canny边缘检测的处理过程可以在此查看,同样,该链接将重定向回我的个人主页,主页上详细解释了canny边缘检测算法背后的数学知识。
以上是关于python中基本图像处理最后的第4部分,整个系列的源代码可在此处访问。
相关
使用numpy和opencv完成图像的基本数据分析(part i);使用numpy和opencv完成图像的基本数据分析(part ii);使用numpy和opencv完成图像的基本数据分析(part iii);