ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python识别组件轮廓并获得最大轮廓

2021-12-03 20:31:22  阅读:314  来源: 互联网

标签:gray python cv2 contours piclist 组件 newimage 轮廓


         在光伏行业胶膜公司工作时,工作中的数据整理的工作单调无趣,作为一个崇尚自动化办公的制造业懒人,怎能忍受?!

        本文中讲到的光伏组件EL测试结果截图就是其中一项,具体内容就是把图中发光的部分截图并保存,单个图片很简单,但数量多起来也是要消耗不少时间,必须想个办法解决一下,每天哪怕省出个把小时抠抠手机摸摸鱼也是好的~~~

         

        碰巧会点python,在逛我大CSDN论坛中发现能实现轮廓识别,再自己改点也就完成了,上报公司还有点奖金,爽歪歪~~~

        下面稍微介绍下核心函数:

        1、由于EL仪器的关系,测试结果会是一个大的发光区域与很多模糊的光点,通过CV2的识别轮廓的方法,会获得一个列表对应一系列的发光轮廓,而测试结果必定是发光轮廓最大的那个,后面的思路也是基于此。

import cv2    
ret, thresh = cv2.threshold(gray.copy(), f, 255, cv2.THRESH_BINARY)
    contours,hierarchy= cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        2、遍历上面获得的发光轮廓列表contours,获得每个发光区域大小newimage.size,并形成一一对应列表piclist,用于后续识别。

    #piclist轮廓列表
    piclist=[]
    for i in range(0,len(contours)):  
        x, y, w, h = cv2.boundingRect(contours[i])   
        newimage=gray[y+2:y+h-2,x+2:x+w-2] # 先用y确定高,再用x确定宽
        #轮廓切片原图并获取图片size,加入列表,用于排除不合理的轮廓
        piclist.append(newimage.size)

        3、识别piclist最大的项并获得对应的index,然后从contours中提取区域并截图保存,由于EL测试中会存在电池片短路,即没有发光区域,所以会有if newimage.size!=0这个判断。

以下是核心函数的全部代码。

def singleCut(inpath,fileName,outpath):
    #开始截图计时
    start = time.process_time()
    #读取图片
    img = cv_imread(inpath)
    
    #转换为灰度图
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #设置阈值 有待商榷
    f=(2*max(gray[2])+3*min(gray[2]))/4#获取组件轮廓
    ret, thresh = cv2.threshold(gray.copy(), f, 255, cv2.THRESH_BINARY)
    contours,hierarchy= cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    #piclist轮廓列表
    piclist=[]
    for i in range(0,len(contours)):  
        x, y, w, h = cv2.boundingRect(contours[i])   
        newimage=gray[y+2:y+h-2,x+2:x+w-2] # 先用y确定高,再用x确定宽
        #轮廓切片原图并获取图片size,加入列表,用于排除不合理的轮廓
        piclist.append(newimage.size)
    
    #关键步骤:获取轮廓列表中图片尺寸最大的切片 即EL中的组件发光区域
    flag=True
    m=0  #test
    for i in range(0,len(contours)):  
        m=m+1
        if i==piclist.index(max(piclist)):
            x, y, w, h = cv2.boundingRect(contours[i])    
            #切片并保存结果
            newimage=img[y+2:y+h-2,x+2:x+w-2] # 先用y确定高,再用x确定宽   
            if newimage.size!=0:
                cv_imwrite( outpath+fileName+".jpg",newimage)
                #cv_imwrite( outpath+"\{}-{}-{}".format(m,max(gray[3]),min(gray[3]))+".jpg",newimage)
            else:
                flag=False
    #结束计时
    end = time.process_time()
    print("截图耗时{}秒".format("%.2f"%(end-start)))
    return flag

我也是在搜索好多CSDN论坛大神的文章后完成的,所以希望能帮到后来人,毕竟我大Python开发环境这么友善~~~~

标签:gray,python,cv2,contours,piclist,组件,newimage,轮廓
来源: https://blog.csdn.net/weixin_42604699/article/details/121705869

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有