Python教程

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

本文主要是介绍python识别组件轮廓并获得最大轮廓,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

        本文中讲到的光伏组件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开发环境这么友善~~~~

这篇关于python识别组件轮廓并获得最大轮廓的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!