• python opencv 图片缺陷检测(讲解直方图以及相关系数对比法)


    一、利用直方图的方式进行批量的图片缺陷检测(方法简单)

    二、步骤(完整代码见最后)

      2.1灰度转换(将原图和要检测对比的图分开灰度化)

        灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关性比较

     

    img = cv2.imread("0.bmp")
    #原图灰度转换
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    
    #循环要检测的图,均灰度化
    for i in range(1, 6):
        t1=cv2.cvtColor(cv2.imread(str(i)+".bmp"),cv2.COLOR_RGB2GRAY)

      2.2 直方图计算(结果其实是二维的图表--用画图的方式展示)

    calcHist参数讲解
    • 第一个参数:必须为列表[],哪怕只有一个图片,image输入图像
    • channels::传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[]传入。
    • mask:掩膜图像。如果统计整幅图,那么为none。主要是如果要统计部分图的直方图,就得构造相应的炎掩膜来计算。
    • histSize:灰度级的个数,需要中括号,比如[256]
    • ranges:像素值的范围,通常[0,256],有的图像如果不是0-256,比如说你来回各种变换导致像素值负值、很大,则需要调整后才可以。
     #直方图计算的函数,反应灰度值的分布情况
        hist = cv2.calcHist([gray], [0], None, [256], [0.0,255.0])
    
        h1 = cv2.calcHist([t1], [0], None, [256], [0.0,255.0])

       2.3 相关性比较

    cv2.compareHist(H1, H2, method)
    其中:

    • H1,H2 分别为要比较图像的直方图
    • method - 比较方式
    • 比较方式(method)
    • 相关性比较 (method=cv.HISTCMP_CORREL) 值越大,相关度越高,最大值为1,最小值为0-----------------------只用一种固然不是很严谨,但这里做示范,把阈值调高也差不多(取大于等于0.9
    • 卡方比较(method=cv.HISTCMP_CHISQR 值越小,相关度越高,最大值无上界,最小值0
    • 巴氏距离比较(method=cv.HISTCMP_BHATTACHARYYA) 值越小,相关度越高,最大值为1,最小值为0
    #相关性计算,采用相关系数的方式
        result = cv2.compareHist(hist,h1,method=cv2.HISTCMP_CORREL)

       2.4 展示结果(判断阈值)

    相关系数含义参考表

     im = Image.open(str(i) + ".bmp")
    
        draw = ImageDraw.Draw(im)
        fnt = ImageFont.truetype(r'C:WindowsFontssimsun.ttc', 30)
        #这里视作》=0.9认为相似,即合格
        if result >=0.9:
            draw.text((5, 10), u'合格', fill='red', font=fnt)
        else:
            draw.text((5, 10), u'不合格', fill='red', font=fnt)
        im.show("result" +str(i) + ".png")

    三、完整代码

    # -*- coding: UTF-8 -*-
    import cv2
    from PIL import Image, ImageDraw, ImageFont
    
    img = cv2.imread("0.bmp")
    #原图灰度转换
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    
    for i in range(1, 6):
        t1=cv2.cvtColor(cv2.imread(str(i)+".bmp"),cv2.COLOR_RGB2GRAY)
    
        #直方图计算的函数,反应灰度值的分布情况
        hist = cv2.calcHist([gray], [0], None, [256], [0.0,255.0])
    
        h1 = cv2.calcHist([t1], [0], None, [256], [0.0,255.0])
        #相关性计算,采用相关系数的方式
        result = cv2.compareHist(hist,h1,method=cv2.HISTCMP_CORREL)
        im = Image.open(str(i) + ".bmp")
    
        draw = ImageDraw.Draw(im)
        fnt = ImageFont.truetype(r'C:WindowsFontssimsun.ttc', 30)
        #这里视作》=0.9认为相似,即合格
        if result >=0.9:
            draw.text((5, 10), u'合格', fill='red', font=fnt)
        else:
            draw.text((5, 10), u'不合格', fill='red', font=fnt)
        im.show("result" +str(i) + ".png")

    参考博文:

    1. Python-Opencv中用compareHist函数进行直方图比较进行对比图片:https://blog.csdn.net/qq_44262417/article/details/89217011
    2. OpenCV-Python 直方图-1:查找、绘制和分析|二十六:http://baijiahao.baidu.com/s?id=1655424859576397139&wfr=spider&for=pc

     希望帮助能大家理解直方图以及比较函数作用!!!

  • 相关阅读:
    Java之this关键字的用法
    JavaSE 之 final 初探
    LinkedList 浅析示例
    HashSet 浅析示例
    ArrayList 浅析示例
    MySQL5.7 修改密码
    IE10 和 Chrome50 对日期 new Date() 支持的区别
    databtables 设置(显示)行号
    团队管理
    财务名称
  • 原文地址:https://www.cnblogs.com/cybg/p/12642030.html
Copyright © 2020-2023  润新知