复习opencv:螺丝螺纹缺陷检测

这篇具有很好参考价值的文章主要介绍了复习opencv:螺丝螺纹缺陷检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简述

  • 今天收到了一个检测螺牙缺陷的问题,当复习opencv练个手,记录一下基础知识。
  • 这里的代码是检测弯曲的,其他缺陷用yolo处理。
  • 东家给的图片有的是有干扰的(红框标识),所以要求一下最大凸包。
    复习opencv:螺丝螺纹缺陷检测,opencv,计算机视觉,人工智能
  • 里面很多知识是复习用,最终代码在最后一行,给的101张图片,有2个弯曲度超过0.25,来到了0.33以上
  • 有个小技巧可以提高弯直的区分度,这里就不介绍了,需要的私信。

去噪

椒盐噪声

import cv2

img = cv2.imread('image.jpg')
median = cv2.medianBlur(img, 5)
cv2.imshow('Median filter', median)
cv2.waitKey(0)
cv2.destroyAllWindows()

高斯噪声

import cv2

img = cv2.imread('image.jpg')
gaussian = cv2.GaussianBlur(img, (5,5), 0)
cv2.imshow('Gaussian filter', gaussian)
cv2.waitKey(0)
cv2.destroyAllWindows()

小波变换

import cv2
import pywt

img = cv2.imread('image.jpg', 0)
coeffs = pywt.dwt2(img, 'haar')
cA, (cH, cV, cD) = coeffs
cv2.imshow('Wavelet denoising', pywt.idwt2((cA, (None, None, None)), 'haar'))
cv2.waitKey(0)
cv2.destroyAllWindows()

引导滤波

import numpy as np
import cv2

main_path="D:/Handletiling/NG_org_20230602103406819.bmp"

def guideFilter(I, p, winSize, eps):

    mean_I = cv2.blur(I, winSize)    
    mean_p = cv2.blur(p, winSize)       

    mean_II = cv2.blur(I * I, winSize)  
    mean_Ip = cv2.blur(I * p, winSize) 

    var_I = mean_II - mean_I * mean_I  
    cov_Ip = mean_Ip - mean_I * mean_p  

    a = cov_Ip / (var_I + eps)        
    b = mean_p - a * mean_I          

    mean_a = cv2.blur(a, winSize)     
    mean_b = cv2.blur(b, winSize)     

    q = mean_a * I + mean_b
    return q


if __name__ == '__main__':
    eps = 0.01
    winSize = (5,5)
    image = cv2.imread(main_path, cv2.IMREAD_ANYCOLOR)
    image = cv2.resize(image, None,fx=0.7, fy=0.7, interpolation=cv2.INTER_CUBIC)
    I = image/255.0        #将图像归一化
    p =I
    guideFilter_img = guideFilter(I, p, winSize, eps)

    # 保存导向滤波结果
    guideFilter_img  = guideFilter_img  * 255
    guideFilter_img [guideFilter_img  > 255] = 255
    guideFilter_img  = np.round(guideFilter_img )
    guideFilter_img  = guideFilter_img.astype(np.uint8)
    cv2.imshow("image",image)
    cv2.imshow("winSize_5", guideFilter_img )
    cv2.waitKey(0)
    cv2.destroyAllWindows()

求最大凸包

import cv2
import os
import numpy as np
from skimage.measure import label

main_path="D:\Handletiling\luoya/NG/NG_org_20230602103407364.bmp"

##method1 --opencv
def get_lagrest_connect_component1(img):

    # rgb->gray
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # gaussian filter
    img_gray = cv2.GaussianBlur(img_gray, (5, 5), 0)
    # binary exp-threshold=0
    # https://blog.csdn.net/weixin_42272768/article/details/110746790
    _, img_gray = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV)  # ret==threshold
    # find contour
    contours, _ = cv2.findContours(img_gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # cv2.drawContours(img_gray, contours, -1, 255, 3)

    # find the area_max region
    area = []
    for i in range(len(contours)):
        area.append(cv2.contourArea(contours[i]))
    if len(area) >= 1:
        max_idx = np.argmax(area)
        max_contour_area = area[max_idx]

        for k in range(len(contours)):
            if k != max_idx:
                cv2.fillPoly(img_gray, [contours[k]], 0)
    else:
        max_contour_area = 0

    return max_contour_area, img_gray

if __name__ == '__main__':
    img = cv2.imread(main_path)
    max_area, img_gray = get_lagrest_connect_component1(img)
    print(max_area)
    cv2.imwrite('img_gray.jpg', img_gray)

判断曲直

1.查找轮廓,提取凸包
2.获得点集
3.计算导数方差
4.比较阈值

def calccurl(str,thresh):
    img = cv2.imread(str)
    # cv2.imshow('src',img)
    #提取凸包
    max_area, img_gray =get_lagrest_connect_component1(img)

    gray = img_gray
    #阈值处理
    ret,binary = cv2.threshold(gray,127,255,0)
    #查找轮廓,提取凸包
    contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    hull = cv2.convexHull(contours[0])
    cv2.polylines(img_gray,[hull],True,(255,255,0),2)
    min_x=min(hull[:,0,0])
    max_x=max(hull[:,0,0])
    topList=[]
    bottomList=[]
    thresh_left=220
    thresh_right=30
    count=hull.shape[0]
    isthesame=False
    for i in range(hull.shape[0]):
        point = tuple(hull[i][0]) #  
        # cv2.circle(img, point, 1, (0, 255, 0) , 12)
        if point[0]<(max_x-thresh_right) and point[0]>(min_x+thresh_left):
            length=binary.shape[0]
            x1 = np.linspace(start=0, stop=length-1, num=length)
            temp=x1 * (binary[:, point[0]] / 255)
            n = np.sum(temp > 0)
            index=temp.sum()/(n*1.)
            # if i in[0,count-1]:
            #     if not isthesame:
            #         isthesame=True
            #     else:
            #         continue
            if point[1]>index:
                bottomList.append(point)
            else:
                topList.append(point)    

    space = np.linspace(start=min_x+thresh_left, stop=max_x-thresh_right, num=15)
    space= np.ceil(space)
    length = img_gray.shape[0]
    x1 = np.linspace(start=0, stop=length - 1, num=length)
    tempM = (img_gray / 255.)* x1[:,None]

    if len(topList) >len(bottomList):
        topList.clear()
        for x in space:
            temp=tempM[:, int(x)]
            temp = temp[temp != 0]
            topList.append([x,temp.min()])

        line = np.array(topList, dtype=float)

    else:
        bottomList.clear()
        for x in space:
            temp = tempM[:, int(x)]
            temp = temp[temp != 0]
            bottomList.append([x, temp.max()])

        line = np.array(bottomList, dtype=float)
       if line.size > 0:
        #method1
        slopend=(line[-1,1]-line[0,1])/(line[-1,0]-line[0,0])
        slop=(line[1:,1]-line[:-1,1])/((line[1:,0]-line[:-1,0])+0.0001)
        dis=slop-slopend
        std = np.std(dis)
        if std>thresh:
            return 0,std

    return 1,0
        # method2
        # std= np.std(slop)


if __name__ == '__main__':
    filesPath = os.listdir(main_path)
    threshstd=0.025

    files = tqdm(filesPath)
    for file in files:
        absolute_file_path = os.path.join(main_path, file)
        if '.bmp' in absolute_file_path.lower():
            result,std=calccurl(absolute_file_path,threshstd)
            if result:
                print(absolute_file_path+":", std)

复习opencv:螺丝螺纹缺陷检测,opencv,计算机视觉,人工智能文章来源地址https://www.toymoban.com/news/detail-556059.html

结果
--------------------
std: 0.037498851806574245

全部代码

import cv2
import numpy as np

import os
from tqdm import tqdm
import shutil

#需要检测弯曲的图片的文件夹地址
main_path="D:\Handletiling\src"

def get_lagrest_connect_component1(img):

    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    img_gray = cv2.GaussianBlur(img_gray, (5, 5), 0)

    _, img_gray = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV)  # ret==threshold

    contours, _ = cv2.findContours(img_gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    area = []
    for i in range(len(contours)):
        area.append(cv2.contourArea(contours[i]))
    if len(area) >= 1:
        max_idx = np.argmax(area)
        max_contour_area = area[max_idx]

        for k in range(len(contours)):
            if k != max_idx:
                cv2.fillPoly(img_gray, [contours[k]], 0)
    else:
        max_contour_area = 0

    return max_contour_area, img_gray

def calccurl(str,thresh):
    img = cv2.imread(str)

    #提取凸包
    max_area, img_gray =get_lagrest_connect_component1(img)

    gray = img_gray
    #阈值处理
    ret,binary = cv2.threshold(gray,127,255,0)
    #查找轮廓
    contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    hull = cv2.convexHull(contours[0])
    cv2.polylines(img_gray,[hull],True,(255,255,0),2)
    min_x=min(hull[:,0,0])
    max_x=max(hull[:,0,0])
    topList=[]
    bottomList=[]
    thresh_left=220
    thresh_right=30
    count=hull.shape[0]
    isthesame=False
    for i in range(hull.shape[0]):
        point = tuple(hull[i][0]) #
        # cv2.circle(img, point, 1, (0, 255, 0) , 12)
        if point[0]<(max_x-thresh_right) and point[0]>(min_x+thresh_left):
            length=binary.shape[0]
            x1 = np.linspace(start=0, stop=length-1, num=length)
            temp=x1 * (binary[:, point[0]] / 255)
            n = np.sum(temp > 0)
            index=temp.sum()/(n*1.)
            # if i in[0,count-1]:
            #     if not isthesame:
            #         isthesame=True
            #     else:
            #         continue
            if point[1]>index:
                bottomList.append(point)

            else:
                topList.append(point)


    space = np.linspace(start=min_x+thresh_left, stop=max_x-thresh_right, num=15)
    space= np.ceil(space)
    length = img_gray.shape[0]
    x1 = np.linspace(start=0, stop=length - 1, num=length)
    tempM = (img_gray / 255.)* x1[:,None]

    if len(topList) >len(bottomList):
        topList.clear()
        for x in space:
            temp=tempM[:, int(x)]
            temp = temp[temp != 0]
            topList.append([x,temp.min()])

        line = np.array(topList, dtype=float)

    else:
        bottomList.clear()
        for x in space:
            temp = tempM[:, int(x)]
            temp = temp[temp != 0]
            bottomList.append([x, temp.max()])

        line = np.array(bottomList, dtype=float)
    if line.size > 0:
        #method1
        slopend=(line[-1,1]-line[0,1])/(line[-1,0]-line[0,0])
        slop=(line[1:,1]-line[:-1,1])/((line[1:,0]-line[:-1,0])+0.0001)
        dis=slop-slopend
        std = np.std(dis)
        if std>thresh:
            return 0,std

    return 1,0
        # method2
        # std= np.std(slop)

  

if __name__ == '__main__':
    filesPath = os.listdir(main_path)
    threshstd=0.025

    files = tqdm(filesPath)
    for file in files:
        absolute_file_path = os.path.join(main_path, file)
        if '.bmp' in absolute_file_path.lower():
            result,std=calccurl(absolute_file_path,threshstd)
            if not result:
                print(absolute_file_path+"-图片弯曲:", std)
#结果
[00:00<00:01, 44.18it/s]D:\Handletiling\src\NG_org_20230602103409544.bmp-图片弯曲: 0.0334415572613885
[00:00<00:01, 44.24it/s]D:\Handletiling\src\NG_org_20230602103410530.bmp-图片弯曲: 0.037498851806574245

到了这里,关于复习opencv:螺丝螺纹缺陷检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 毕业设计-计算机视觉:刨花板表面小目标缺陷检测系统 人工智能 算法 python

      目录  前言 设计思路 一、课题背景与意义 二、算法理论原理 2.1 自适应空间特征融合模块 2.2 Ghost 模块 三、检测的实现 3.1 数据集 3.2 实验环境搭建 3.3 实验及结果分析 实现效果图样例 最后        📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临

    2024年01月16日
    浏览(55)
  • 计算机竞赛 机器视觉目标检测 - opencv 深度学习

    🔥 优质竞赛项目系列,今天要分享的是 🚩 机器视觉 opencv 深度学习目标检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng

    2024年02月07日
    浏览(70)
  • 计算机竞赛 深度学习 python opencv 火焰检测识别

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的火焰识别算法研究与实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分 工作量:4分 创新点:3分 🧿 更多资料, 项目分享: https://gitee.co

    2024年02月07日
    浏览(54)
  • 计算机竞赛 深度学习 python opencv 动物识别与检测

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的动物识别算法研究与实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分 工作量:4分 创新点:3分 🧿 更多资料, 项目分享: https://gitee.co

    2024年02月07日
    浏览(64)
  • 【计算机视觉·OpenCV】使用Haar+Cascade实现人脸检测

    人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸的外接矩形在图像中的坐标。使用 haar 特征和 cascade 检测器进行人脸检测是一种传统的方式,下面将给出利用 OpenCV 中的 haarcascade 进行人脸检测的代码。 可选的人脸检测模型(区别是检测速度和精度不同

    2023年04月12日
    浏览(63)
  • 计算机设计大赛 深度学习疲劳检测 驾驶行为检测 - python opencv cnn

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习加驾驶疲劳与行为检测 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.com

    2024年03月14日
    浏览(103)
  • 深度学习卫星遥感图像检测与识别 -opencv python 目标检测 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.com/da

    2024年02月03日
    浏览(71)
  • 计算机竞赛 机器视觉人体跌倒检测系统 - opencv python

    🔥 优质竞赛项目系列,今天要分享的是 🚩 机器视觉人体跌倒检测系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/

    2024年02月07日
    浏览(66)
  • 计算机竞赛 图像识别-人脸识别与疲劳检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于图像识别的人脸识别与疲劳检测系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.co

    2024年02月12日
    浏览(74)
  • 计算机视觉+深度学习+机器学习+opencv+目标检测跟踪(代码+视频)

    计算机视觉、深度学习和机器学习是当今最热门的技术,它们被广泛应用于各种领域,如自动驾驶、医学图像分析、安防监控等。而目标检测跟踪技术则是计算机视觉中的一个重要分支,它可以帮助我们在图像或视频中自动识别和跟踪特定的目标。 下面我们来一一介绍这些技

    2024年02月01日
    浏览(112)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包