Advertisement

python图像缺陷检测_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),而对于彩色图来说则有三个通道(数值分别为0、1、2),具体对应于BGR各通道。需要注意的是,在使用这些值时必须将其包裹在方括号内以确保正确性。

mask:遮罩图像。 若对全图进行统计,则结果为空;而当需要对部分图像计算其直方图时,则需相应构建炎状的遮罩来进行处理。

histSize:灰度级的个数, 需要中括号,比如[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)

该方法采用cv.HISTCMP_CHISQR参数进行计算;其特点是当计算出的卡方值较小时表示两组数据之间的相关性较高。该方法的最大计算结果无上限;最小计算结果为0。

采用的方法是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")

源码加群:850591259

全部评论 (0)

还没有任何评论哟~