• python opencv图像缺陷比对(轮廓比对)


    机器视觉缺陷检测实验

    一、实验目的

    1)利用python编写程序实现对图像的缺陷检测;

    2)通过轮廓对比检测出合格产品与不合格产品;

    3)实现在图像上显示文本提示信息;

    二、题目描述

    1)读取标准图像并显示;

    2)利用for循环读取待测的对比图像;

    3)将标准图像与一张待测图像进行中值滤波、图像差分、灰度化处理、轮廓提取、最后提取轮廓总数;

    4)将合格产品的轮廓数进行提炼,采用if语句利用轮廓数判断待测图像是否合格;

    5)在合格图像上显示“合格”字样的提示信息,不合格则在相应图像上显示“不合格”。

    三、实现过程及运行效果

    实验标准图像如下:

    3.1标准图像

    实验步骤:

    1)读取标准图像并利用for循环读取待测的对比图像;

    2)将标准图像与一张待测图像进行中值滤波、图像差分、灰度化处理、轮廓提取、最后提取轮廓总数;

    代码实例:

    import cv2

    import numpy as np

    from PIL import Image, ImageDraw, ImageFont

    minThres = 6

    # 读取图像1

    img=cv2.imread('0.bmp')#读取标准图像 

    cv2.imshow('YuanTu',img)

    cv2.waitKey(0)

    cv2.destroyAllWindows()

    for i in range(1,6):

    imgi=cv2.imread('{}.bmp'.format(i))#依次读取待测图像

    #中值滤波

    img1 = cv2.medianBlur(img,15)

    # 图像差分

    diff = cv2.absdiff(img1, imgi)

    #灰度图

    gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)

    # 二值化

    _,thres = cv2.threshold(gray,minThres,255,cv2.THRESH_BINARY)

    # 查找轮廓

    contours,hierarchy = cv2.findContours(thres, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

    3)将合格产品的轮廓数进行提炼,采用if语句利用轮廓数判断待测图像是否合格;

    代码实例:

    if len(contours)>1000:

    print('合格')

    else:

    Print(‘不合格’)

    4)在合格图像上显示“合格”字样的提示信息,不合格则在相应图像上显示“不合格”。

    代码实例:

    if len(contours)>1000:

    print('合格')

    #在图像上显示是否合格

    src1 = Image.fromarray(cv2.cvtColor(imgi, cv2.COLOR_BGR2RGB))

    font = ImageFont.truetype('simsun.ttc', 30)

    # 文字输出位置

    position = (5,5)

    # 输出内容

    str = '合格'

    draw = ImageDraw.Draw(src1)

    draw.text(position, str, font=font, fill=(255, 0, 0))

    src1 = cv2.cvtColor(np.asarray(src1), cv2.COLOR_RGB2BGR)

    cv2.imshow("CeShi",src1)

    cv2.waitKey(0)

    else:

    print('不合格')

    #在图像上显示是否合格

    src2 = Image.fromarray(cv2.cvtColor(imgi, cv2.COLOR_BGR2RGB))

    font = ImageFont.truetype('simsun.ttc', 30)

    # 文字输出位置

    position = (5,5)

    # 输出内容

    str = '不合格'

    draw = ImageDraw.Draw(src2)

    draw.text(position, str, font=font, fill=(255, 0, 0))

    src2 = cv2.cvtColor(np.asarray(src2), cv2.COLOR_RGB2BGR)

    cv2.imshow("CeShi",src2)

    cv2.waitKey(0)

     

    3.4.1检测结果图

    3.4.2检测结果图

     

    3.4.3检测结果图

     

    四、问题及解决方法

    1)刚开始自己想的是将两张灰度图利用equals()函数进行比对看能否通过,结果不难想象确实太天真,这错误很低级了,数据类型都没分清楚的;

    2)在网上查找资料一直找不到怎么直接对两张图像进行缺陷检测比对,只有一个差分检测;

    3)有找到一个关于差异检测的相关资料可是发现其中一个SIF算法被申请了专利不能使用;

    4)最后通过仔细研读了一个博主的代码,几次运行测试发现了轮廓数可以作为判断依据来实现我的目的,所以大胆采用了这一方法,成功实现了本次实验。

    五、实验总结

    本次实验让我感觉机器视觉实验越来越上升了难度,同时发现老师的高科技实验软件太厉害了,简单方便,科技的力量。本次实验花费了我足足一天的时间才勉强完成任务,之后应该还有一次更加困难的挑战,没有撤退可言唯有迎难而上。

  • 相关阅读:
    Document
    Echarts 图例交互事件,及使用
    Echarts 入门之基础使用(部份 API)
    对比 continue、break 在循环中的作用
    Markdown 简要语法速成
    CSS 实现必填项前/后添加红色*、√、X、▲
    9.React Context 上下文
    [leetcode sort]179. Largest Number
    [leetcode tree]102. Binary Tree Level Order Traversal
    [leetcode tree]101. Symmetric Tree
  • 原文地址:https://www.cnblogs.com/Wang1107/p/12632951.html
Copyright © 2020-2023  润新知