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

第三阶段:工作应用

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

相关推荐
封步宇AIGC几秒前
量化交易系统开发-实时行情自动化交易-Okex交易数据
人工智能·python·机器学习·数据挖掘
z千鑫2 分钟前
【人工智能】利用大语言模型(LLM)实现机器学习模型选择与实验的自动化
人工智能·gpt·机器学习·语言模型·自然语言处理·自动化·codemoss
小爬虫程序猿2 分钟前
如何利用Python解析API返回的数据结构?
数据结构·数据库·python
shelly聊AI4 分钟前
AI赋能财务管理,AI技术助力企业自动化处理财务数据
人工智能·财务管理
波点兔4 分钟前
【部署glm4】属性找不到、参数错误问题解决(思路:修改模型包版本)
人工智能·python·机器学习·本地部署大模型·chatglm4
佚明zj1 小时前
全卷积和全连接
人工智能·深度学习
一点媛艺3 小时前
Kotlin函数由易到难
开发语言·python·kotlin
程序小旭3 小时前
机器视觉基础—双目相机
计算机视觉·双目相机
姑苏风3 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
qzhqbb4 小时前
基于统计方法的语言模型
人工智能·语言模型·easyui