基于数字图像处理的橘子识别系统
1 系统分析
1.1 问题描述
以柑橘为例,开发一个水果识别系统。
要求:
1. 使用GUI界面,打开图像,对其中的柑橘进行标识,标识出的效果大致如下图所示,并统计其中的柑橘个数。
2. 主要根据柑橘和背景的颜色差异进行识别。
3. 应能够对不同环境下的柑橘进行识别。
要求能够保存每一步所处理的图像。
1.2 系统功能分析
(1)打开并展示图像。
(2)对图像中的柑橘进行标识并保留每一部所处理的图像。
(3)对柑橘个数进行统计。
1.3开发平台及工具介绍
开发平台:Netbeans
开发工具:opencv开源代码库、javaFX
1.4参考资料
《图像处理基本算法 车牌识别与定位》——
https://blog.****.net/renshengrumenglibing/article/details/8596333
《OpenCV For Java环境搭建与功能演示》——
https://blog.****.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系统各个类及类之间关系设计
本系统由三个类组成,分别是FindOrangeSystem、Controller、findOrange。
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最终结果