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")

在线教程

人工智能书籍

第一阶段:零基础入门(3-6个月)

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

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

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

第三阶段:工作应用

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

相关推荐
白玉cfc4 分钟前
【OC】单例模式
开发语言·ios·单例模式·objective-c
十六点五5 分钟前
Java NIO的底层原理
java·开发语言·python
猿究院-赵晨鹤5 分钟前
Java I/O 模型:BIO、NIO 和 AIO
java·开发语言
网易伏羲5 分钟前
网易伏羲亮相Arm Unlocked 2025,携手Arm探索中国人工智能创新之路
人工智能·游戏ai·网易伏羲
跟橙姐学代码13 分钟前
不要再用 print() 了!Python logging 库才是调试的终极武器
前端·python
寒月霜华17 分钟前
机器学习ML-简介、数据获取、网页数据抓取
人工智能·机器学习
little_xianzhong21 分钟前
步骤流程中日志记录方案(类aop)
java·开发语言
抓饼先生24 分钟前
C++ 20 视图view笔记
linux·开发语言·c++·笔记·c++20
程序猿阿伟28 分钟前
《AI游戏开发中的隐性困境:从战斗策略失效到音效错位的深度破局》
人工智能
FisherYu32 分钟前
AI环境搭建pytorch+yolo8搭建
前端·计算机视觉