图像的测量之投影与纹理


一、投影

水平投影有什么作用呢?
可以起到一个定位的作用,比如说,我们想要定位车牌号。我们把图像处理之后,用垂直投影,可以很快的对其进行定位以即分割

水平投影的实现步骤

  1. 图像二值化,物体为黑,背景为白。

  2. 循环各行,依次判断每一列的像素是否为黑,统计所有黑像素的个数。设该行共有M个黑像素,则把该行从第一列到第M列设置为黑

垂直投影的实现步骤
  1. 图像二值化,物体为黑,背景为白。

  2. 循环各列,依次判断每一行的像素是否为黑,统计所有黑像素的个数。设该列共有M个黑像素,则把该列从第一行到第M行设置为黑

效果图如下

image.png

水平投影效果如下

image.png

image.png

二、纹理分析

什么是纹理呢?

  • 纹理就是指在图像中反复出现的局部模式和他们的排列规则

  • 纹理特征反应了物体本身的属性,有助于将两种不同的物理分开来

  • 通过对图像的纹理分析获得关于景物纹理特征和结构的定景分析描述和解释。这就是图像纹理分析的任务。

  • 纹理是图像的像素灰度级或者颜色的某种变化,反复出现纹理基元和它的排列规则。而且这种变化是空间排列的

  • 纹理是由纹理级元组测而成的

那什么是纹理分析呢?

纹理分析是指通过图像处理技术抽取出纹理特征,获得纹理的定量或者定性描述的处理过程,获得纹理的定量或者定性描述的处理过程,它首先从像素触发,检测出纹理基元,找出纹理基元排列的信息,建立纹理基元的模型,通过纹理分析获取纹理基元的排列信息及分布信息

纹理分析的基础方法

  • 统计方法
    1. 空间域:基于统计图像像素灰度级的分布状况,利用直方图
    2. 频域:通过傅里叶变换将图像变换到频率域然后抽取相应的象征量

  • 结构方法:用于印刷或者版画样等一类纹理基元及其排列比较规则的图像

直方图统计特征分析法

大体步骤如下
1. 对于一副图像,选择合适的领域大小
2. 对每个像素,计算出其领域中的灰度直方图
3. 比较求出的直方图与已知的各种纹理基元的直方图之间的相似性。
4. 若相似,说明存在已知的纹理基元

如何判断直方图的相似性呢?

均值方差法
求出两个图像直方图的均值和方差,如果两幅图像的均值和方差相差均在阈值之内,则说明两个直方图是相似的。

直方图的均值:所有像素值相加除以像素个数
直方图的方差:每一个颜色减去均值的平方,再乘以颜色的个数再除以总个数。

该算法实现起来非常简单

def Texture_1(img1,img2):
    def getStatic(img):
        static=np.zeros(shape=256,dtype=int)
        for y in range(0,len(img)):
            for x in range(0,len(img[y])):
                c=img[y,x,0]
                static[c]=static[c]+1
        return static
    # 先统计直方图
    static1=getStatic(img1)
    static2=getStatic(img2)
    s1=0
    s2=0
    #再计算直方图的平均灰度
    for i in range(0,256):
        s1=s1+static1[i]*i
        s2=s2=static2[i]*i
    avg1=s1/(len(img1)*len(img1[0]))
    avg2 = s2 / (len(img2) * len(img2[0]))
    #再计算方差
    for c in range(0,256):
        t1=(c-avg1)*static1[c]
        t2=(c-avg2)*static2[c]
    t1=t1/(len(img1)*len(img1[0]))
    t2=t2/(len(img2)*len(img2[0]))
    return np.abs(t1-t2)

Kolmogorov-Smirnov检测法
对于两幅图像,分别求出其累计直方图,然后取其累计直方图差值的最大值

H(z)=\int_{0}^{Z}h(x)dx

KS=max|H_1(z)-H_2(Z)|
然后再求出直方图之间差值的的和值,为SD
SD=\sum h_1(z)-h_2(z)
如果|KS-SD|在阈值之内,则相似

def Texture_2(img1,img2):
    #下面是用来求一副图像的直方图
    def getStatic(img):
        static=np.zeros(shape=256,dtype=int)
        for y in range(0,len(img)):
            for x in range(0,len(img[y])):
                c=img[y,x,0]
                static[c]=static[c]+1
        return static

    #下面的函数是用来求一副图像的累计直方图
    def getStatic1(img):
        static=np.zeros(shape=256,dtype=int)
        for y in range(0,len(img)):
            for x in range(0,len(img[y])):
                c=img[y,x,0]
                static[c]=static[c]+1
                if c>0:
                    static[c]=static[c]+static[c-1]
        return static
    static1=getStatic(img1)
    static2=getStatic(img2)
    # 用来参数KS
    KS=np.max(static1-static2)
    # 用来求参数SD
    SD=np.sum((getStatic(img1)-getStatic(img2)),axis=0)
    return np.abs(KS-SD)


边缘方向直方图分析法

灰度级直方图不能反应图像的二维灰度变化,图像边缘包含有大量的二维信息,取沿着边缘走向的像素的领域,分析其直方图,若在直方图上的某一个灰度范围内有尖峰,可以说明在这个范围内,纹理具有方向性。因此,单纯的分析边缘方向的直方图可以得到一些纹理信息

图像自相关函数分析法

P(x,y)=\frac{\sum_{i=0}\sum_{j=0}f(i,j)f(i+x,j+y)}{\sum_{i=0}\sum_{j=0} f(i,j)}\\ d=(x^2+y^2)^{\frac{1}{2}}

  • 利用p(x,y)随着x,y大小而变化的规律可以找到描述图像的纹理特征。

  • 自相关函数随着x、y大小而变化,与图像纹理粗细的变化有者对应的关系,如果纹理比较粗,则P(x,y)随着d增加而下降速度较慢,如果纹理比较细,则随着d增加而下降速度较快

灰度共生矩阵特征分析法

因为灰度级直方图分析法无法反应出像素之间灰度级空间相关性的规律。所以是有一定缺陷的,而灰度共生矩阵特征分析法,很好点的解决了这个问题。

  • 相邻某一间隔的两个像素,他们之间要么具有相同的灰度级,要么具有不相同的灰度级,如果能找到这样两个像素的联合分布的统计形式,对于图像的纹理分析很有意义

灰度-梯度共生矩阵分析法
  • 将其灰度进行正规化处理

  • 利用梯度算子,可以得到梯度图像

  • 经过正规化处理,可以得到两个正规化矩阵:灰度矩阵、梯度矩阵

正规化处理
每个像素乘以它的灰度值的个数,然后除以最大值


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864