OpenCV缺陷检测

本文内容出自书籍:
《计算机视觉40例从入门到深度学习(OpenCV-Python)》

简单介绍

轮廓与原始对象高度拟合,包含的信息非常丰富。通过一个对象的最小包围圆形与其轮廓面积的比值,能够将不规则的圆形筛选出来,从而实现缺陷检测
flag{??????i like game}

findContours返回图像内所有轮廓
distanceTransform确定图像前景
minEnclosingCircle通过迭代算法构造一个对象面积最小的包围圆形
circle在图像上画圆

代码

流程图
weread
pillow3.jpg
image

import cv2
import numpy as np

# 步骤1 读取图像
img = cv2.imread("D:\C\copy\pill3.jpg")
cv2.imshow("original", img)
# 步骤2 预处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.THRESH_OTSU otsu's二值化,https://www.cnblogs.com/yinliang-liang/p/9293310.html
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('thresh', thresh)
# 矩形:MORPH_RECT;
# 交叉形:MORPH_CROSS;
# 椭圆形:MORPH_ELLIPSE;
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))  # 产生核的函数
# 开运算
opening1 = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
cv2.imshow('opening1', opening1)
# 步骤3 使用函数distanceTransform()确定前景
dist_transform = cv2.distanceTransform(opening1, cv2.DIST_L2, 3)
ret, fore = cv2.threshold(dist_transform, 0.3*dist_transform.max(), 255, 0)
cv2.imshow('fore', fore)
# 步骤4 去噪处理(对得到的前景图像再次去噪)
kernel = np.ones((3, 3), np.uint8)
opening2 = cv2.morphologyEx(fore, cv2.MORPH_OPEN, kernel)
# 步骤5 提取轮廓
# opening的元素是float32
opening2 = np.array(opening2, np.uint8)
contours, hierarchy = cv2.findContours(
    opening2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE
)
# 步骤6 缺陷检测
count = 0
font = cv2.FONT_HERSHEY_COMPLEX
for cnt in contours:
    (x, y), radius = cv2.minEnclosingCircle(cnt)
    center = (int(x), int(y))
    radius = int(radius)
    # 画圆
    circle_img = cv2.circle(opening2, center, radius, (255, 255, 255), 1)
    # cv2.imshow('cicle'+str(count), circle_img)
    area = cv2.contourArea(cnt)
    area_cirle = 3.14*radius*radius
    if area/area_cirle >= 0.5:
        img = cv2.putText(img, 'OK', center, font, 2, (255, 255, 255), 3)
    else:
        img = cv2.putText(img, 'BAD', center, font, 2, (255, 255, 255), 3)
    count += 1
img = cv2.putText(img, ('sum='+str(count)), (20, 50), font, 2, (255, 255, 255))
cv2.imshow("result", img)
cv2.waitKey()
cv2.destroyAllWindows()
posted @ 2022-11-21 21:29  请去看诡秘之主  阅读(652)  评论(0编辑  收藏  举报