前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工业器件检测和识别

工业器件检测和识别

作者头像
MachineLP
发布2018-01-09 15:41:35
9140
发布2018-01-09 15:41:35
举报
文章被收录于专栏:小鹏的专栏小鹏的专栏

有问题欢迎微信交流:lp9628

工业器件标定与识别(如下图所示):

 ---->

---->

代码实现:

主要流程:直方图均衡化,去除噪声,二值化,查找轮廓,选出需要轮廓。

代码语言:javascript
复制
# -*- coding: utf-8 -*-

'''
load_img_path: 一级目录,生成图像的路径。
load_database_path:二级目录, 生成图像的路径。
plot: 实现图像中抠图,找到轮廓抠出来。
'''

import numpy as np
import cv2
import os

def load_img_path(imgDir,imgFoldName, img_label):
    imgs = os.listdir(imgDir+imgFoldName)
    imgNum = len(imgs)
    data = []
    label = []
    for i in range (imgNum):
        img_path = imgDir+imgFoldName+"/"+imgs[i]
        data.append(img_path)
        label.append(int(img_label))
    return data,label

def load_database_path(imgDir):
    img_path = os.listdir(imgDir)
    train_imgs = []
    train_labels = []
    for i, path in enumerate(img_path):
        craterDir = imgDir + '/'
        foldName = path
        data, label = load_img_path(craterDir,foldName, i)
        train_imgs.extend(data)
        train_labels.extend(label)
    #打乱数据集
    index = [i for i in range(len(train_imgs))]
    np.random.shuffle(index)
    train_imgs = np.asarray(train_imgs)
    train_labels = np.asarray(train_labels)
    train_imgs = train_imgs[index]
    train_labels = train_labels[index]
    return train_imgs, train_labels


def plot(img_path):

    img = cv2.imread(img_path)
    #img = cv2.resize(img, (200, 100))
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
    # 直方图均衡化
    eq = cv2.equalizeHist(gray)
    # 中通滤波
    b = cv2.medianBlur(eq, 9)
    
    m, n = img.shape[:2]
    b2 = cv2.resize(b, (n//4, m//4))
    # 开运算和闭运算
    m1 = cv2.morphologyEx(b2, cv2.MORPH_OPEN, np.ones((100, 100)))
    m2 = cv2.morphologyEx(m1, cv2.MORPH_CLOSE, np.ones((4, 4)))
    
    _, bw = cv2.threshold(m2, 150, 200, cv2.THRESH_BINARY_INV)
    
    bw = cv2.resize(bw, (n, m))

    r = img.copy()
    # img2, ctrs, hier = cv2.findContours(bw, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # 二值化,找轮廓。
    img2, ctrs, hier = cv2.findContours( bw, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    
    min_area = 999999
    c_min = 0
    for ctr in ctrs:
        area = cv2.contourArea(ctr)  
        if (area < min_area):
            min_area = area
            c_min = ctr
    x, y, w, h = cv2.boundingRect(c_min)
    # x, y, w, h = x-100, y-50, w+100, h+100
    x, y, w, h = x-110, y-60, w+110, h+110
    imgs = r[y:y+h, x:x+w]
    #cv2.rectangle(r, (x, y), (x+w, y+h), (0, 255, 0), 10)
    #cv2.imwrite("img.jpg", r)
    cv2.imwrite("temp.jpg", imgs)
    return imgs

def test(img_path):
    image = plot(img_path)

def test_batch():
    dir = 'train'
    img_path,img_label = load_database_path(dir)
    print (img_path)
    img_number = len(img_path)
    for i in range(img_number):
        img_dir = img_path[i]
        # print (img_dir)
        image = plot(img_dir)
        img_dir = img_dir.split('.')[0]
        #save_path = 'train_aug/' + img_dir + str(0) + '.jpg'
        save_path = 'train_aug/' + img_dir + str(1) + '.jpg'
        print (save_path)
        cv2.imwrite(save_path, image)

if __name__ == '__main__':
    # test('lp.jpg')
    test_batch()

以上代码还可以做:

框出来以后就可以搭建CNN模型啦,第一个问题搭建个几层的cnn就可以了,第二个问题要搭建十几层的cnn+几层的rnn来解决。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年10月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档