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:\Windows\Fonts\simsun.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:\Windows\Fonts\simsun.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")
      

      在线教程

      • 麻省理工学院人工智能视频教程 – 麻省理工人工智能课程
      • 人工智能入门 – 人工智能基础学习。Peter Norvig举办的课程
      • EdX 人工智能 – 此课程讲授人工智能计算机系统设计的基本概念和技术。
      • 人工智能中的计划 – 计划是人工智能系统的基础部分之一。在这个课程中,你将会学习到让机器人执行一系列动作所需要的基本算法。
      • 机器人人工智能 – 这个课程将会教授你实现人工智能的基本方法,包括:概率推算,计划和搜索,本地化,跟踪和控制,全部都是围绕有关机器人设计。
      • 机器学习 – 有指导和无指导情况下的基本机器学习算法
      • 机器学习中的神经网络 – 智能神经网络上的算法和实践经验
      • 斯坦福统计学习

        人工智能书籍

        • OpenCV(中文版).(布拉德斯基等)
        • OpenCV+3计算机视觉++Python语言实现+第二版
        • OpenCV3编程入门 毛星云编著
        • 数字图像处理_第三版
        • 人工智能:一种现代的方法
        • 深度学习面试宝典
        • 深度学习之PyTorch物体检测实战
        • 吴恩达DeepLearning.ai中文版笔记
        • 计算机视觉中的多视图几何
        • PyTorch-官方推荐教程-英文版
        • 《神经网络与深度学习》(邱锡鹏-20191121)
        • 第一阶段:零基础入门(3-6个月)

          新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。

          第二阶段:基础进阶(3-6个月)

          熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。

          第三阶段:工作应用

          这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。