2018-07-08 09:40:39 slj821 阅读数 4453

方法:提取每一个水果的特征,通过特征进行识别。
例如:每一个水果的面积,弧度、像素等
通过特征提取并识别也是一般的模式识别的通用方法。

2018-06-25 22:09:50 boat98 阅读数 3957

1 系统分析

1.1 问题描述

以柑橘为例,开发一个水果识别系统。

要求:

1. 使用GUI界面,打开图像,对其中的柑橘进行标识,标识出的效果大致如下图所示,并统计其中的柑橘个数。

2. 主要根据柑橘和背景的颜色差异进行识别。

3. 应能够对不同环境下的柑橘进行识别。

要求能够保存每一步所处理的图像。

 

1.2 系统功能分析

(1)打开并展示图像。

2)对图像中的柑橘进行标识并保留每一部所处理的图像。

3)对柑橘个数进行统计。

 

1.3开发平台及工具介绍

开发平台:Netbeans

开发工具:opencv开源代码库、javaFX

 

1.4参考资料

《图像处理基本算法 车牌识别与定位》——

https://blog.csdn.net/renshengrumenglibing/article/details/8596333

OpenCV For Java环境搭建与功能演示》——

https://blog.csdn.net/jia20003/article/details/68944486

OpenCV成长之路:直线、轮廓的提取与描述》——

http://mobile.51cto.com/aengine-435442.htm

《边缘检测完后,如何标出区域》——

http://wsq.discuz.com/?siteid=628107753&source=wap&c=index&a=viewthread&tid=82172&mobile=2

Imgproc.findContours 例子,参数说明》——

http://m.bubuko.com/infodetail-1501621.html

 

 

2 系统设计

2.1 系统总体结构设计

 

 

 

 

 

2.2系统各个类及类之间关系设计

本系统由三个类组成,分别是FindOrangeSystemControllerfindOrange

FindOrangeSystem类:本系统的主类,有一个fxml文件与之映射,实现图形界面的展示。

Controller类:操作控制类,识别用户对界面的操作并主导流程的进行。调用findOrange类进行数字图像处理。

findOrange类:系统的核心,进行数字图像处理的操作,包含一系列数字图像处理的方法。包含构造方法,包含类属变量,其中original为初始图像,number为识别到的橘子的个数。

 

2.3数据存储的设计

findOrange类的类属变量original储存用户打开的初始图像,number储存识别到的橘子的个数,每一步数字图像处理的结果直接保存到相对路径src/的文件夹中。

 

2.4界面设计

使javafx sencebuilder设计界面,界面分为菜单栏,图片显示区,结果显示区,功能区四个部分。菜单栏有文件按钮,用于打开需要识别的图片,关于按钮里显示小组成员与分工。

界面左半部分是图片显示区,打开的图片会显示在上面,右半部分的下半部分是功能区有两个按钮为“上一个”“下一个”,由于展示图片识别过程。上半部分用于结果显示即识别出来的柑橘个数。

 

 

3 系统实现

3.1主要模块的流程图及代码段片段

主要模块:

(1)打开并展示初始图像。

 

 代码片段:

@FXML

private void openAction(ActionEvent event) throws MalformedURLException {

imageview.setVisible(true);

FileChooser fileChooser = new FileChooser();

                

fileChooser.getExtensionFilters().addAll(

    new FileChooser.ExtensionFilter("JPG", "*.jpg"),

    new FileChooser.ExtensionFilter("GIF", "*.gif"),

    new FileChooser.ExtensionFilter("BMP", "*.bmp"),

    new FileChooser.ExtensionFilter("PNG", "*.png")

);

fileChooser.setTitle("选择图片");

Window stage = null;

file= fileChooser.showOpenDialog(stage);

                textview.setText("");

                num=0;

String adress = file.toString();

imageview.setImage(new Image("file:///"+adress));

                example=new findOrange(file.getAbsolutePath());

                example.start();

                number=example.number;

}

(2)数字图像处理。

 

代码片段:

public void start(){

        this.Orange();

        this.kaiYunSuan();

        this.gray();

        this.GaussianBlur();

        this.sharpen();

        this.doCanny();

        this.biYunSuan();

        this.Contours();

    }

(3)展示下一步操作的图像。

 

 代码片段:

@FXML

        private void nextpicture(ActionEvent event) throws IOException{

            imageview.setVisible(true);

            Window stage = null;

            if(num==0){

                file = new File("D:\\java\\findOrangeSystem\\src/orange.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==1){

                file = new File("D:\\java\\findOrangeSystem\\src/kai.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==2){

                file = new File("D:\\java\\findOrangeSystem\\src/gray.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==3){

                file = new File("D:\\java\\findOrangeSystem\\src/GaussianBlur.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==4){

                file = new File("D:\\java\\findOrangeSystem\\src/canny.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==5){

                file = new File("D:\\java\\findOrangeSystem\\src/bicanny.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==6){

                file = new File("D:\\java\\findOrangeSystem\\src/contours.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==7){

                file = new File("D:\\java\\findOrangeSystem\\src/result.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                textview.setText(""+number);

                num++;

            }

        }

4 系统测试

4.1 模块测试

1打开并展示初始图像模块

测试结果:可以通过图形界面打开计算机中任意一张图片并展示出来。

(2)数字图像处理模块

测试结果:对于一个或多个相隔较远的橘子有比较好的识别效果,对于相隔很近或重叠的橘子识别效果较差。

(3)展示下一步/上一步模块

测试结果:能够查看流程中任意一个步骤的图片。

4.2系统测试

基本实现题目要求功能

 

5 系统运行界面

5.1初始界面

 

5.2初始图像

 

 5.3颜色筛选

 

5.4开运算

 

 5.5灰度化

 

5.6模糊处理

  

5.7边缘检测

 

5.8闭运算

 

5.9轮廓跟踪

 

5.10最终结果


2016-04-27 13:44:03 u013576018 阅读数 7736

针对水果识别,需要有一个方法来自动获取ROI信息,这里采用分水岭算法可以很好地实现目标要求:

%Name: ROI extraction
%Function: Extract ROI in a RGB image
%Author:    Changle Zhang, zhangchanglehit@163.com
clc;
clear all;
close all;
%Initilization
rgbimg=imread('Fruit Samples For Project2/澳洲蜜桔/澳洲蜜桔_image069.jpg');
%rgbimg=imread('Fruit Samples For Project2/番石榴/番石榴_image119.jpg');

figure;
imshow(rgbimg);
r=rgbimg(:,:,1);
g=rgbimg(:,:,2);
b=rgbimg(:,:,3);
% imshow(r);
% figure;
% imshow(g);
% figure;
% imshow(b);
% grayimg=rgb2gray(rgbimg);
% imshow(grayimg);
hsvimg=rgb2hsv(rgbimg);
H=hsvimg(:,:,1);
S=hsvimg(:,:,2);
V=hsvimg(:,:,3);
% figure;
% imshow(H);
% title('H');
% figure;
% imshow(S);
% title('S');
% figure;
% imshow(V);
% title('V');



%rgb = imread('pears.png');%读取原图像
I = S;%转化为灰度图像
hy = fspecial('sobel');%sobel算子
hx = hy';
Iy = imfilter(double(I), hy, 'replicate');%滤波求y方向边缘
Ix = imfilter(double(I), hx, 'replicate');%滤波求x方向边缘
gradmag = sqrt(Ix.^2 + Iy.^2);%求摸
%3.分别对前景和背景进行标记:本例中使用形态学重建技术对前景对象进行标记,首先使用开操作,开操作之后可以去掉一些很小的目标。
se = strel('disk', 20);%圆形结构元素
Io = imopen(I, se);%形态学开操作
Ie = imerode(I, se);%对图像进行腐蚀
Iobr = imreconstruct(Ie, I);%形态学重建
Ioc = imclose(Io, se);%形态学关操作
Iobrd = imdilate(Iobr, se);%对图像进行膨胀
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));%形态学重建
Iobrcbr = imcomplement(Iobrcbr);%图像求反
bw = im2bw(Iobrcbr, graythresh(Iobrcbr));%转化为二值图像
figure;
imshow(bw), %显示二值图像
title('Thresholded opening-closing by reconstruction')
bww=im2uint8(bw)/255;
rgbimg(:,:,1)=bww.*rgbimg(:,:,1);
rgbimg(:,:,2)=bww.*rgbimg(:,:,2);
rgbimg(:,:,3)=bww.*rgbimg(:,:,3);
figure;
imshow(rgbimg);

输入图像:


提取ROI后的结果:


算法思路:通过rgb2hsv得到色调信息,利用对色调信息的分水岭变换得到我们需要的橙色区域,然后利用该区域作为ROI

2019-07-30 09:41:27 weixin_39444552 阅读数 161

先放几张效果图

正常
阴影下
有遮挡
暗光+重叠(由于阈值设置,过小的柑橘未识别)

过侵蚀的原理

要识别被障碍物遮挡的物体,往往只需要对物体的部分进行识别即可判断是否是要识别的物体,由此在识别过程中,为了分离物体与障碍物,可以对识别主体进行过度的侵蚀,只检测模板中最重要的特征并进行标注,而不影响识别物体的准确率。

要解决的问题及解决思路

  1. 根据柑橘和背景的颜色差异进行识别

    解决思路: 实验表明,在YCbCr颜色空间中,对Cr分量使用最大类间方差法(Otsu) 能较好地将成熟柑橘与背景图片分离开来。

  2. 分离互相重叠的柑橘
    解决思路: 通过低阈值的敏感Canny算子,对重叠柑橘的边界进行识别,然后对边界进行过侵蚀(即只侵蚀不膨胀),由此带来的后果是边界尽可能扩大,而识别区域变小,但在可以接受的范围之内。

  3. 识别被叶子遮挡柑橘

    解决思路:利用检测到的边缘,通过凸包算法识别凸包并进行填充,亦可弥补过侵蚀带来的空洞。

开发平台及用到的第三方库

开发平台: Eclipse
程序设计语言:JAVA
开发工具:opencv开源代码库

参考论文

[1]蔡健荣,周小军,李玉良,范军.基于机器视觉自然场景下成熟柑橘识别[J].农业工程学报,2008(01):175-178.

[2]吴定中,邹湘军,熊俊涛,陈丽娟,彭红星.面向复杂背景环境目标的快速识别研究[J].农机化研究,2014,36(01):178-183.

识别流程

在这里插入图片描述

步骤效果及注意事项

  1. 原始图像
    在这里插入图片描述

  2. 颜色筛选

    先用以下函数将原始图片由BGR空间转换YCrCb空间

    Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2YCrCb);
    

    再提取Cr分量,对分量调用Ostu阈值分割,注意这里得到的是目标区域的二值图,将其作为掩模与原图进行与运算即可提取出目标区域。

    Imgproc.threshold(img_cr, dst, 0, 255, Imgproc.THRESH_OTSU);
    

在这里插入图片描述
3. 中值模糊

这里需要进行一次滤波是为了减少过多噪音Canny边缘检测的影响。
在均值滤波、中值滤波、高斯滤波中采取不会丢失重叠边缘的中值滤波。
在这里插入图片描述
4. Canny边缘检测

跟阈值分割一样,以检测到的边缘图片做掩模加深原图边缘。
在这里插入图片描述在这里插入图片描述
5. 过侵蚀
在这里插入图片描述
6. 开运算
在这里插入图片描述
7. 灰度化、二值化

先灰度化将三通道转为单通道,再根据灰度值二值化。
在这里插入图片描述
8. 凸包填充

识别过程不需要进行闭运算进行空洞填充,因为在保留边缘的条件下可直接识别凸包进行填充,注意填充凸包后要重绘凸包边界,防止边缘连接,否则就会如下图:
错误示范
正确示范:
在这里插入图片描述
9. 椭圆拟合

主要调用以下两个函数:

Imgproc.findContours(dst, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE,
                new Point(0, 0));
Imgproc.fitEllipse(dst); 	//调用此函数前要判断轮廓点超过5个,否则会报错

这里面积较小的柑橘未识别出来,是因为我将面积小于最大连通区域1/5的连通区域当成噪音去除了。
在这里插入图片描述
10. 结果图像
在这里插入图片描述

优点

  1. 为解决柑橘识别问题提供一种新的思路。
  2. 算法简单,运行速度快。
  3. 能适应大多数环境下的识别。

缺点

  1. 在阳光直射条件下(颜色呈完全的白色)有可能会在颜色筛选时出现较大空洞,有时不能完全填充。
  2. 对被障碍物分割成两块或多块的区域无法正确识别。
  3. 对于一套函数的阈值只适用于一段距离的识别(如当前系统只适用于近景),鲁棒性较差。
  4. 过侵蚀带来的识别区域的丢失导致不能准确定位柑橘的质心。

作业阶段,暂不开源,望见谅。。

2019-03-09 12:32:28 weixin_43409302 阅读数 1633

一、项目简介

  • OpenCV是一个用于图像处理、分析、机器视觉方面的开源工具包。无论科学研究,还是商业应用,OpenCV都是进行图像识别的不二之选。熟练掌握OpenCV的图片识别能力,在图片识别领域里飞起来不是梦!
  • 本文利用kaggle数据库上的水果图片数据集(fruit-images-for-object-detection)展示如何训练机器学习模型识别水果图片的类别。
  • 数据地址(kaggle数据库地址需要插件支持才能正常访问,请自行百度):
    https://www.kaggle.com/mbkinaci/fruit-images-for-object-detection

二、图片数据分析

  • 数据库分为训练集(train)和测试集(test)两部分
  • 训练集包含四类apple,orange,banana,mixed(多种水果混合)四类237张图片;测试集包含每类图片各两张。图片集如下图所示。
  • 图片类别可由图片名称中提取。
    训练集图片预览
    训练集图片列表
    测试集预览
    测试集图片列表

三、模型构建和实现

  • 建模思路:将rgb图片转化为gray灰度图,进而提取关键点信息,训练hmm模型进行图片预测。
  • 核心工具包:cv2,hmmlearn

1、导入工具包

import os
import warnings
import numpy as np
import cv2 as cv
import hmmlearn.hmm as hl
warnings.filterwarnings(
    'ignore', category=DeprecationWarning)
np.seterr(all='ignore')

2、收集文件路径

  • 将图片文件(jpg,png等…)收集在字典中备用
def search_objects(directory):
    # 将文件路径格式化,以便适应于各种操作系统
    directory = os.path.normpath(directory)
    # 如果输入路径不是文件件则抛出异常
    if not os.path.isdir(directory):
        raise IOError(directory + '不是文件夹')
    objects = {}
    # 遍历文件夹收集jpg文件,放入字典
    for curdir, _, files in os.walk(directory):
        for jpeg in [file for file in files
                     if file.endswith('.jpg')]:
            path = os.path.join(curdir, jpeg)
            # 从文件名中提取图片所属类别
            label = jpeg.split('_')[0]
            # label = path.split(os.path.sep)[-2]
            if label not in objects:
                objects[label] = []
            objects[label].append(path)
    return objects

3、图片特征值提取

  • 定义flags主要是来区分训练集合测试集,测试集需要保存图片并呈现,训练集不需要。
# 收集图片数据集的标签和灰度值
def label_desc02(objects, flags=None):
    data_x, data_y, data_z = [], [], []
    # 遍历类别标签及对应的文件名
    for label, files in objects.items():
        descs = np.array([])
        for file in files:
            image = cv.imread(file)
            # 训练阶段可不收集图片,不用给定flags值
            if flags:
                # 保存(测试集)中的图片
                data_z.append([])
                data_z[-1].append(image)
            # 将图片转化为灰度图
            gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
            h, w = gray.shape[:2]
            f = 600 / min(h, w)
            gray = cv.resize(gray, None, fx=f, fy=f)
            # 提取灰度图的关键点特征值
            star = cv.xfeatures2d.StarDetector_create()
            keypoints = star.detect(gray)
            sift = cv.xfeatures2d.SIFT_create()
            _, desc = sift.compute(gray, keypoints)
            if len(descs) == 0:
                descs = desc
                # print(descs)
            else:
                descs = np.append(descs, desc, axis=0)
                # print(descs)
            if flags:
                # 测试集按图片进行特征值收集
                data_x.append(descs)
                data_y.append(label)
        if not flags:
            # 训练集按类别进行特征值收集
            data_x.append(descs)
            data_y.append(label)
    return data_x, data_y, data_z

4、模型的创建和预测

# 训练模型函数,hmm模型
def model_train(data_x, data_y):
    models = {}
    for descs, label in zip(data_x, data_y):
        model = hl.GaussianHMM(
            n_components=4, covariance_type='diag',
            n_iter=1000) # 提取4个主要特征,训练上限为1000轮
        models[label] = model.fit(descs)
    return models

# 定义利用图像识别进行模型预测的函数
def model_pred(test_x, models):
    pred_test_y = []
    for descs in test_x:
        # for desc in descs:
        # 定义最优得分和预测标签
        best_score, best_label = None, None
        for label, model in models.items():
            score = model.score(descs)
            # 选择则有得分的预测标签保存,作为预测值
            if not best_score or (
                    best_score < score):
                best_score, best_label = score, label
        pred_test_y.append(best_label)
    return pred_test_y

4、图片可视化

  • 将测试集和预测结果进行可视化,观察预测效果
# 可视化识别的图片
def show_pics(test_y, pred_test_y, test_z):
    i = 0
    for label, pred_label, images in zip(
            test_y, pred_test_y, test_z):
        for image in images:
            i += 1
            cv.imshow('{} - {} {} {}'.format(
                i, label,
                '==' if label == pred_label
                else '!=', pred_label), image)

5、模型执行

# 给定训练集、测试集路径地址
train_path = 'train'
test_path = 'test'
# 收集训练集、测试集的jpg文件
train_files = search_objects(train_path)
test_files = search_objects(test_path)
# 提取训练集、测试集图片文件关键点特征值
# 通过flags赋值区分测试集和训练集
train_x, train_y, _ = label_desc02(train_files)
test_x, test_y, test_z = label_desc02(test_files, flags=1)
# 观察测试集真实类别和预测类别列表
print(test_y)
print(pred_test_y)

测试集真实与预测类别列表
真实与预测值

models = model_train(train_x, train_y)
# 利用模型进行测试集预测
pred_test_y = model_pred(test_x, models)
# 将预测结果与真实结果进行图片可视化
show_pics(test_y, pred_test_y, test_z)
# 设置键盘阻塞,保留图片
cv.waitKey()

测试集预测结果如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

四、模型评估

  • 由预测结果可知,8张图片类型均预测正确。即使进行多次实验,模型仍具有较好的预测精度。
  • 该模型可以作为四类水果的简单预测模型。
  • 更加复杂准确的预测模型与上述模型具有相同的原理,可根据实际应用需求进行更新。

github地址
https://github.com/Willsgao/Personal-projects/tree/master/跟着OpenCV飞起来_kaggle水果图片识别

图像处理 椒盐噪声

阅读数 1161

椒盐噪声

博文 来自: vitaminc4

matlab水果识别

阅读数 3320

没有更多推荐了,返回首页