机器学习水果识别——python+opencv实现物体特征提取

刚接触机器学习时候写的了,当时只知道机器学习不知道深度学习还以为只能人为的提取特征根据特征训练,后来才发现有深度学习这样更好的选择可以自动提取特征值。除了特征,深度学习在复杂背景下的效果也会明显优于普通机器学习,所以还是建议使用深度学习的方法。2019.4.25

2024.05.26:
广告:本人计算机专业本硕,现从事客户端开发工作,有丰富的项目经验。承接各类项目,Windows、Linux客户端开发、小程序开发、大学生毕业设计等。vx15869003586

一、用python+opencv实现物体特征值提取

以水果为例。要用机器学习来实现水果识别,无论是训练还是识别阶段都需要提取图片中水果的特征值。本篇将讲述如何提取水果的周长面积颜色长度宽度7个特征值。

1、读取图像、转为灰度图像并降噪

from math import *
import cv2 as cv
import numpy as np

img = cv.imread(path)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
blurred = cv.GaussianBlur(gray, (3, 3), 0)

2、获取水果轮廓

这里使用图像梯度的方法

xgrad = cv.Sobel(blurred, cv.CV_16SC1, 1, 0)
ygrad = cv.Sobel(blurred, cv.CV_16SC1, 0, 1)
edge_output = cv.Canny(xgrad, ygrad, 50, 150)

cloneImg, contours, heriachy = cv.findContours(edge_output, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

cv.findContours将图片中识别到的轮廓返回给contours变量,contours是一个list类型数据,里面存放了识别到的所有轮廓。有时候并不能很好的将目标轮廓完整的识别出来或者有没有去除掉的噪点的干扰所以不能简单粗暴的将获取到的轮廓全部运用。我尝试了一下两种方法:

将最大轮廓画入最开始的img图像并显示

max = 0
maxA = 0
for i, contour in enumerate(contours):
    x, y, w, h = cv.boundingRect(contour)
    if w*h>maxA:
    	max=i
    	maxA=w*h
cv.drawContours(img, contours, max, (0, 0, 255), 2)
#画框
x, y, w, h = cv.boundingRect(contours[max])
img = cv.rectangle(img, (x, y), (x + w, y + h), (0, 255,  0), 2)
cv.imshow('img', img)

结果如图:
理想状态下轮廓被识别为多部分

这个方法有一个问题:如果目标物体的轮廓被分为了多个区域,则不能完全显示出来轮廓。
所以想到了另一个方法:

将小于某一规模的轮廓删除

num=[]
for i, contour in enumerate(contours):
	x, y, w, h = cv.boundingRect(contour)
	if w < 50 or h < 50:
        continue
    num.append(i)
for i in num:
	if i == 0:
		continue
	contours[0] = np.concatenate((contours[i], contours[0]))
cv.drawContours(img, contours, max, (0, 0, 
评论 519
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值