import
numpy
as
np
from
PIL
import
Image
,
ImageDraw
,
ImageFont
import
matplotlib
.
pyplot
as
plt
def
cv2ImgAddText
(
img
,
text
,
left
,
top
,
textColor
=
(
0
,
255
,
0
)
,
textSize
=
20
)
:
if
(
isinstance
(
img
,
np
.
ndarray
)
)
:
img
=
Image
.
fromarray
(
cv2
.
cvtColor
(
img
,
cv2
.
COLOR_BGR2RGB
)
)
draw
=
ImageDraw
.
Draw
(
img
)
fontStyle
=
ImageFont
.
truetype
(
"font/simsun.ttc"
,
textSize
,
encoding
=
"utf-8"
)
draw
.
text
(
(
left
,
top
)
,
text
,
textColor
,
font
=
fontStyle
)
return
cv2
.
cvtColor
(
np
.
asarray
(
img
)
,
cv2
.
COLOR_RGB2BGR
)
plt
.
rcParams
[
'font.family'
]
=
'SimHei'
img0
=
cv2
.
imread
(
r
"C:\Users\pc\Desktop\0.bmp"
)
cv2
.
imshow
(
'img'
,
img0
)
img1
=
cv2
.
cvtColor
(
img0
,
cv2
.
COLOR_BGR2GRAY
)
for
i
in
range
(
1
,
6
)
:
defect_img0
=
cv2
.
imread
(
r
"C:\Users\pc\Desktop\%d.bmp"
%
i
)
defect_img1
=
cv2
.
cvtColor
(
defect_img0
,
cv2
.
COLOR_BGR2GRAY
)
hist0
=
cv2
.
calcHist
(
[
img1
]
,
[
0
]
,
None
,
[
256
]
,
[
0.0
,
255.0
]
)
hist1
=
cv2
.
calcHist
(
[
defect_img1
]
,
[
0
]
,
None
,
[
256
]
,
[
0.0
,
255.0
]
)
plt
.
title
(
"原图与待检测img%d对比"
%
i
)
plt
.
plot
(
hist0
,
label
=
'原图'
)
plt
.
plot
(
hist1
,
label
=
'待检测img%d'
%
i
)
rst
=
cv2
.
compareHist
(
hist0
,
hist1
,
method
=
cv2
.
HISTCMP_CORREL
)
cv2
.
imshow
(
str
(
i
)
+
".img"
,
cv2ImgAddText
(
defect_img0
,
"合格"
if
rst
>=
0.95
else
"不合格"
,
20
,
20
,
(
255
,
0
,
0
)
,
25
)
)
plt
.
xlim
(
[
0
,
256
]
)
plt
.
legend
(
loc
=
'upper left'
)
plt
.
show
(
)
cv2
.
waitKey
(
0
)
问题及解决方法
1.获取原图的直方图
参考链接
方式:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]])
-
images
:输入的图像
-
channels
:选择图像的通道
-
mask
:是一个大小和
image
一样的
np
数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为
None
,表示处理整幅图像。
-
histSize
:使用多少个
bin
(柱子),一般为256
-
ranges
:像素值的范围,一般为[0,255]表示0~255
该函数结果返回一个二维数组,该数组反应画面中亮度的分布和比例。
2.比较两个直方图的相似度
参考链接
方式:
cv2.compareHist(H1, H2, method)
-
H1
:第一个直方图数组
-
H2
:第二个直方图数组(与第一个纬度相同)
-
method
:所使用的方式
该函数返回一个
[0,1]
的相似度值,值越接近一就表名相似度越高。
3.相似度参数微调
由于
compareHist
函数返回一个
[0,1]
的值,需要自己调整一个阈值来选取哪些合格,经过调整后,发现阈值取
[0.90, 0.95]
能够正确选取与实验的结果,代码中取的是0.95,即待检测图与原图之间的相似度如果小于0.95则不合格。
4.通过plot显示原图与待检测图的关系折线
参考链接
通过
calcHist
函数返回的hist数组值,运用
matplotlib
绘制原图和待检测图之间的关系折线图。对比两个曲线的差异。
题目描述利用opencv或其他工具编写程序实现缺陷检测。实现过程# -*- coding: utf-8 -*-'''作者 : 丁毅开发时间 : 2021/4/21 15:30'''import cv2import numpy as npfrom PIL import Image, ImageDraw, ImageFontimport matplotlib.pyplot as plt#用于给图片添加中文字符的函数def cv2ImgAddText(img, text, left
点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达今天来一个
缺陷
检测
的实例,如下是原图,第二个和第三个黑色部件有
缺陷
思路: ①提取OK部件轮廓做model ②遍历部件轮廓,做差分,形态学处理 ③结果判断绘制 上代码(含注释):import cv2
import numpy as np
# 获取模板ROI
def get_templa...
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入
欢迎使用Markdown编辑器
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
import numpy as np
img = cv.imread('star.jpg')
img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,thresh = cv.threshold(img_gray, 127,...