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