当前位置:   article > 正文

9 直方图_直方图测试用例

直方图测试用例

学习视频可参见python+opencv3.3视频教学 基础入门

outline

  • 图像直方图
  • 直方图均衡化
  • 直方图应用

1.图像直方图(histogram)

  • 图像直方图定义

    • 一个灰度级在范围[0,L-1]的数字图像的 直 方图是一个离散函数
      h ( r k ) = n k h\left( r_k \right) =n_k h(rk)=nk

    • nk是图像中灰度级为rk的像素个数 rk 是第k个灰度级,k = 0,1,2,…,L-1

    • 直方图是一个统计特征

    • 测试用例1,图像灰度直方图

    • def plot_demo(image):
          #image.ravel()将numpy数组扁平化为一维数组,会改变原数组
          #flatten()也是扁平化成一维数组,但是不会改变原数组
          plt.hist(image.ravel(),256,[0,256]) # 256为bins数量,[0, 256]为范围,即灰度范围
          plt.show()
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • image-20201007112704778

    • 测试用例2,图像三通道的直方图

    • def image_hist(image):
          color=("blue","green","red")
          for i ,color in enumerate(color):
              hist=cv.calcHist([image],[i],None,[256],[0,256])
              plt.plot(hist,color=color)
              plt.xlim([0,256])
          plt.show()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • image-20201007112749242

2.直方图均衡化

  • 希望一幅图像的像素占有全部可能的灰度级且分布均匀,能够具有 高对比度;

  • 基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加 了像素灰度值的动态范围,从而达到增强图像整体对比度的效果

  • 直方图均衡化的前提条件是图像是灰度图

  • 全局直方图均衡化

    • 测试用例

    • def equalHist_demo(image):
          gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
          # 全局直方图均衡化,用于增强图像对比度,即黑的更黑,白的更白
          dst = cv.equalizeHist(gray)
          cv.imshow("equalHist_demo", dst)
      • 1
      • 2
      • 3
      • 4
    • 测试结果如下:

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FmD70ozg-1604485890744)(F:\公众号\小郭学数据\tu\image-20201007114101556.png)]

    • 全局直方图均衡化会自动增强整个图像的对比度,增强效果不易控制,实际效果不理想

  • 局部自适应直方图均衡化

    • 测试用例

    • # 局部直方图均衡化
          # clipLimit参数表示对比度的大小。tileGridSize参数表示每次处理块的大小 。
          clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
          clahe_dst = clahe.apply(gray)
          cv.imshow("clahe", clahe_dst)
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 测试结果如下:

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFQe4Pws-1604485890745)(https://gitee.com/guohui7/weixinpicture/raw/master/img/image-20201007114828732.png)]

    • 效果相比较全局较好

3.直方图应用

3.1比较两张图的相似度

  • 巴氏距离

    • 测量两个离散或连续概率分布的相似性
    • image-20201007172523422
    • 完全匹配为1,完全不匹配则为0
  • 相关性

    • image-20201007173039365
    • 其中image-20201007173211297
    • N等于直方图中bin的个数,如果H1 = H2,即两个图的直方图一样,分子等于分母,值为1,所以在不严格的情况下,当值为1时,可以认为两个图是一样的。
    • 但是也有可能出现两个图不一样,直方图却是一样的,因为直方图计算的是像素点个数的分布情况,但是不会显示像素点的位置,所以有可能会出现两幅图片不一样,但是相同像素的个数完全一样,那他们的直方图也是一样的。
    • 越趋近于1,相似度越高,相关性比较的值为0,相似度最低,
  • 卡方

    • image-20201007173517269
    • 值为0时,相似度最高。
    • 卡方比较来源于卡方检验,卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合。
  • 测试用例:

  • def create_rgb_hist(image):
        h, w, c = image.shape
        rgbhist=np.zeros([16*16*16,1],np.float32)    #rgb三通道的数值压缩到一通道
        bsize = 256 / 16
        for row in range(h):
            for col in range(w):
                b=image[row,col,0]
                g = image[row, col, 1]
                r = image[row, col, 2]
                index = b//bsize * 16 * 16 + g // bsize * 16 + r // bsize
                rgbhist[np.int(index), 0] = rgbhist[np.int(index), 0] + 1
        return rgbhist
    
    def hist_compare(image1,image2):
        hist1=create_rgb_hist(image1)
        hist2=create_rgb_hist(image2)
        #巴氏距离
        match1=cv.compareHist(hist1,hist2,method=cv.HISTCMP_BHATTACHARYYA)
        #相关性
        match2 = cv.compareHist(hist1, hist2, method=cv.HISTCMP_CORREL)
        #卡方
        match3 = cv.compareHist(hist1, hist2, method=cv.HISTCMP_CHISQR)
        print("巴式距离:%s, 相关性:%s, 卡方:%s" % (match1, match2, match3))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 测试结果:

  • image-20201007174209006

  • 巴式距离:0.9928062493065918, 相关性:-0.00022964846595475527, 卡方:76225.92207299198
    
    • 1

3.2 直方图反向投影—目标检测

  • 反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的特征。反向投影在某一位置的值就是原图对应位置像素值在原图像中的总数目。

  • 反向投影原理

    • image-20201007180119474
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1RBGsYbj-1604485890759)(F:\公众号\小郭学数据\tu\image-20201007180204326.png)]
    • 一个区间点越多,在反向投影矩阵中就越亮。
  • 2d直方图显示测试用例

    • def hist2d_demo(image):
          hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
          hist = cv.calcHist([image], [0, 1], None, [180, 360], [0, 180, 0, 256])  # 计算直方图
          print(hist.shape)
          # cv.imshow("hist2d_demo", hist)
          plt.imshow(hist, interpolation="nearest")  # 直方图显示
          plt.title("2D Histogram")
          plt.show()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 结果如下:

    • image-20201007181934884

    • y轴表示h色相,x轴表示s饱和度

  • 直方图反向投影测试用例

    • def back_projection_demo():
          """
              反向投影可以用来做图像分割,或者在图像中找寻我们感兴趣的部分。
              它会输出与输入图像(待搜索)同样大小的图像,其中的每一个像素值代表了输入图像上对应点属于目标对象的概率。
              输出图像中像素值越高(越白)的点就越可能代表我们要搜索的目标 (在输入图像所在的位置)。
              直方图投影经常与camshift 算法等一起使用。
              步骤:
              1. 准备一张包含我们要查找目标的图像创建直方图。最好使用颜色直方图,因为一个物体的颜色要比它的灰度能更好的被用来进行图像分割与对象识别。
              2. 把这个颜色直方图投影到输入图像中寻找我们的目标,
              3. 设置适当的阈值对概率图像进行二值化
              """
          sample = cv.imread("./images/huang.png")
          target = cv.imread("./images/lena.jpg")
          roi_hsv = cv.cvtColor(sample, cv.COLOR_BGR2HSV)
          target_hsv = cv.cvtColor(target, cv.COLOR_BGR2HSV)
      
          cv.imshow("sample", sample)
          cv.imshow("target", target)
      
          roiHist = cv.calcHist([roi_hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
      
          # 归一化:原始图像,结果图像,映射到结果图像中的最小值,最大值,归一化类型
          # cv.NORM_MINMAX对数组的所有值进行转化,使它们线性映射到最小值和最大值之间
          cv.normalize(roiHist, roiHist, 0, 255, cv.NORM_MINMAX)
          dst = cv.calcBackProject([target_hsv], [0, 1], roiHist, [0, 180, 0, 256], 1)
          cv.imshow("backProjectionDemo", dst)
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
    • 测试结果:

    • image-20201007185814566

  • 测试结果:

  • [外链图片转存中…(img-5E8igLbd-1604485890763)]

结语

以上内容仅是自我学习时记录的笔记,欢迎大家批评指正,一起学习进步。欢迎大家关注我的公众号小郭学数据。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/46723
推荐阅读
相关标签
  

闽ICP备14008679号