From f7d1037ed3d63993ed51900668a0f2ad2fdccc01 Mon Sep 17 00:00:00 2001
From: lidapeng <794757862@qq.com>
Date: Fri, 31 Jul 2020 13:36:41 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=97=95=E8=BF=B9=E8=BF=87?=
=?UTF-8?q?=E6=BB=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
src/main/java/org/wlld/config/Kernel.java | 2 +-
.../segmentation/Watershed.java | 130 +++++++++++++++++-
src/main/java/org/wlld/param/Cutting.java | 9 ++
src/main/java/org/wlld/param/Food.java | 21 +++
src/test/java/coverTest/FoodTest.java | 17 ++-
6 files changed, 168 insertions(+), 13 deletions(-)
diff --git a/pom.xml b/pom.xml
index 34cef63..231f960 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.wlld
easyAi
- 1.0.0
+ 1.0.2
easyAi
diff --git a/src/main/java/org/wlld/config/Kernel.java b/src/main/java/org/wlld/config/Kernel.java
index db4fdce..0cdde31 100644
--- a/src/main/java/org/wlld/config/Kernel.java
+++ b/src/main/java/org/wlld/config/Kernel.java
@@ -10,7 +10,7 @@ public class Kernel {
private static final String All_Number2 = "[-1,0,-1]#[0,4,0]#[-1,0,-1]#";
public static final int Region_Nub = 60;//一张图有多少份
public static final double th = 0.88;//分水岭灰度阈值
- public static final double rgbN = 441.6729559300637;//RGB范数归一化最大值
+ public static final double rgbN = 442.0;//RGB范数归一化最大值
public static Matrix Vertical;
public static Matrix Horizontal;
public static Matrix All;
diff --git a/src/main/java/org/wlld/imageRecognition/segmentation/Watershed.java b/src/main/java/org/wlld/imageRecognition/segmentation/Watershed.java
index a90cc10..32ee563 100644
--- a/src/main/java/org/wlld/imageRecognition/segmentation/Watershed.java
+++ b/src/main/java/org/wlld/imageRecognition/segmentation/Watershed.java
@@ -4,6 +4,7 @@ import org.wlld.MatrixTools.Matrix;
import org.wlld.config.Kernel;
import org.wlld.imageRecognition.TempleConfig;
import org.wlld.param.Cutting;
+import org.wlld.tools.ArithUtil;
import java.util.*;
@@ -28,6 +29,9 @@ public class Watershed {
private double width;
private double height;
private double edgeSize = 0;//边缘提取多少份
+ private double maxIou;//最大iou
+ private double rowMark;//行过滤
+ private double columnMark;//列过滤
private List specifications;
public Watershed(Matrix matrix, List specifications, TempleConfig templeConfig) throws Exception {
@@ -41,10 +45,14 @@ public class Watershed {
if (templeConfig.getEdge() > 0) {
edgeSize = templeConfig.getEdge();
}
+ rowMark = templeConfig.getFood().getRowMark();
+ columnMark = templeConfig.getFood().getColumnMark();
width = matrix.getY();
height = matrix.getX();
xSize = matrix.getX() / regionNub;
ySize = matrix.getY() / regionNub;
+ maxIou = templeConfig.getCutting().getMaxIou();
+ System.out.println("设置最大iou阈值:" + maxIou);
// System.out.println("xSize===" + xSize + ",ysize===" + ySize);
rainfallMap = new Matrix(matrix.getX(), matrix.getY());
regionMap = new Matrix(regionNub, regionNub);
@@ -212,7 +220,89 @@ public class Watershed {
regionBodies.add(regionBody);
}
}
- return regionBodies;
+// for (RegionBody regionBody : regionBodies) {
+// int minX = regionBody.getMinX();
+// int maxX = regionBody.getMaxX();
+// int minY = regionBody.getMinY();
+// int maxY = regionBody.getMaxY();
+// System.out.println("minX==" + minX + ",minY==" + minY + ",maxX==" + maxX + ",maxY==" + maxY);
+// }
+ return iou(regionBodies);
+
+ // return regionBodies;
+ }
+
+ private List iou(List regionBodies) {
+ List list = new ArrayList<>();
+ double maxMinX, minMaxX, maxMinY, minMaxY;
+ for (int i = 0; i < regionBodies.size(); i++) {
+ if (!list.contains(i)) {
+ RegionBody regionBody = regionBodies.get(i);
+ int minX1 = regionBody.getMinX();
+ int minY1 = regionBody.getMinY();
+ int maxX1 = regionBody.getMaxX();
+ int maxY1 = regionBody.getMaxY();
+ double s1 = (maxX1 - minX1) * (maxY1 - minY1);
+ for (int j = 0; j < regionBodies.size(); j++) {
+ if (j != i && !list.contains(j)) {
+ RegionBody body = regionBodies.get(j);
+ int minX2 = body.getMinX();
+ int minY2 = body.getMinY();
+ int maxX2 = body.getMaxX();
+ int maxY2 = body.getMaxY();
+ double s2 = (maxX2 - minX2) * (maxY2 - minY2);
+ double s = s1 + s2;
+ if (maxX2 > maxX1) {
+ maxMinX = maxX1;
+ } else {
+ maxMinX = maxX2;
+ }
+ if (minX2 > minX1) {
+ minMaxX = minX2;
+ } else {
+ minMaxX = minX1;
+ }
+ if (maxY2 > maxY1) {
+ maxMinY = maxY1;
+ } else {
+ maxMinY = maxY2;
+ }
+ if (minY2 > minY1) {
+ minMaxY = minY2;
+ } else {
+ minMaxY = minY1;
+ }
+ double intersectX = ArithUtil.sub(maxMinX, minMaxX);//相交X
+ double intersectY = ArithUtil.sub(maxMinY, minMaxY);//相交Y
+ if (intersectX < 0) {
+ intersectX = 0;
+ }
+ if (intersectY < 0) {
+ intersectY = 0;
+ }
+ double intersectS = ArithUtil.mul(intersectX, intersectY);//相交面积
+ double mergeS = ArithUtil.sub(s, intersectS);//相并面积
+ double iou = ArithUtil.div(intersectS, mergeS);
+ System.out.println("当前iou==" + iou);
+ if (iou > maxIou) {
+ if (s1 < s2) {//s1 是i ,大的
+ list.add(j);
+ } else {
+ list.add(i);
+ }
+ }
+ }
+ }
+ }
+ }
+ System.out.println("要删除的下标:" + list);
+ List regionBodies2 = new ArrayList<>();
+ for (int i = 0; i < regionBodies.size(); i++) {
+ if (!list.contains(i)) {
+ regionBodies2.add(regionBodies.get(i));
+ }
+ }
+ return regionBodies2;
}
private boolean check(int minX, int minY, int maxX, int maxY) {
@@ -293,6 +383,41 @@ public class Watershed {
}
}
+ private void pixFilter() throws Exception {//进行像素过滤
+ int x = regionMap.getX();
+ int y = regionMap.getY();
+ for (int j = 0; j < y; j++) {
+ double sigma = 0.0;
+ for (int i = 0; i < x; i++) {
+ if (regionMap.getNumber(i, j) > 0.1) {
+ sigma++;
+ }
+ }
+ double cover = sigma / x;
+ if (cover < columnMark) {
+ for (int k = 0; k < x; k++) {
+ regionMap.setNub(k, j, 0.0);
+ }
+ }
+ }
+ for (int i = 0; i < x; i++) {//从行读
+ double sigma = 0.0;
+ for (int j = 0; j < y; j++) {
+ if (regionMap.getNumber(i, j) > 0.1) {
+ sigma++;
+ }
+ }
+ double cover = sigma / y;
+ // System.out.println(cover);
+ if (cover < rowMark) {
+ for (int k = 0; k < y; k++) {
+ regionMap.setNub(i, k, 0.0);
+ }
+ }
+ //System.out.println("ma==" + ma);
+ }
+ }
+
private void sigmaPixel() throws Exception {//生成降雨密度图
int x = matrix.getX();
int y = matrix.getY();
@@ -314,9 +439,10 @@ public class Watershed {
}
}
}
+ pixFilter();
createMerge();
merge();
- // System.out.println(regionMap.getString());
+ //System.out.println(regionMap.getString());
}
private int getMinIndex(double[] array, double mySelf) {//获取最小值
diff --git a/src/main/java/org/wlld/param/Cutting.java b/src/main/java/org/wlld/param/Cutting.java
index 3c279be..22d6558 100644
--- a/src/main/java/org/wlld/param/Cutting.java
+++ b/src/main/java/org/wlld/param/Cutting.java
@@ -10,6 +10,15 @@ public class Cutting {
private int regionNub = 200;//一张图行或列分多少个区块
private double th = 0.88;//灰度阈值
private double maxRain = 340;//不降雨RGB阈值
+ private double maxIou = 1;//最大交并比
+
+ public double getMaxIou() {
+ return maxIou;
+ }
+
+ public void setMaxIou(double maxIou) {
+ this.maxIou = maxIou;
+ }
public int getRegionNub() {
return regionNub;
diff --git a/src/main/java/org/wlld/param/Food.java b/src/main/java/org/wlld/param/Food.java
index 8cea9cc..4916975 100644
--- a/src/main/java/org/wlld/param/Food.java
+++ b/src/main/java/org/wlld/param/Food.java
@@ -1,5 +1,8 @@
package org.wlld.param;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* @param
* @DATA
@@ -9,6 +12,24 @@ package org.wlld.param;
public class Food {
private int shrink = 60;//收缩参数
private int times = 10;//聚类增强次数
+ private double rowMark = 0.12;//行痕迹
+ private double columnMark = 0.25;//列过滤
+
+ public double getRowMark() {
+ return rowMark;
+ }
+
+ public void setRowMark(double rowMark) {
+ this.rowMark = rowMark;
+ }
+
+ public double getColumnMark() {
+ return columnMark;
+ }
+
+ public void setColumnMark(double columnMark) {
+ this.columnMark = columnMark;
+ }
public int getShrink() {
return shrink;
diff --git a/src/test/java/coverTest/FoodTest.java b/src/test/java/coverTest/FoodTest.java
index 0c633e0..c99c8d6 100644
--- a/src/test/java/coverTest/FoodTest.java
+++ b/src/test/java/coverTest/FoodTest.java
@@ -77,10 +77,11 @@ public class FoodTest {
//templeConfig.isShowLog(true);//是否打印日志
Cutting cutting = templeConfig.getCutting();
Food food = templeConfig.getFood();
- //切割
- cutting.setMaxRain(310);//切割阈值
+ //
+ cutting.setMaxRain(340);//切割阈值
cutting.setTh(0.8);
cutting.setRegionNub(200);
+ cutting.setMaxIou(1.0);
//knn参数
templeConfig.setKnnNub(1);
//池化比例
@@ -90,6 +91,7 @@ public class FoodTest {
//菜品识别实体类
food.setShrink(5);//缩紧像素
food.setTimes(2);//聚类数据增强
+ // food.setTrayTh(50);
templeConfig.setClassifier(Classifier.KNN);
templeConfig.init(StudyPattern.Cover_Pattern, true, 400, 400, 3);
if (modelParameter != null) {
@@ -106,18 +108,15 @@ public class FoodTest {
Specifications specifications = new Specifications();
specifications.setMinWidth(400);
specifications.setMinHeight(400);
- specifications.setMaxWidth(950);
- specifications.setMaxHeight(950);
+ specifications.setMaxWidth(900);
+ specifications.setMaxHeight(900);
specificationsList.add(specifications);
for (int i = 1; i <= 1; i++) {
- ThreeChannelMatrix threeChannelMatrix1 = picture.getThreeMatrix("/Users/lidapeng/Documents/paramterTest/a" + i + ".jpg");
- ThreeChannelMatrix threeChannelMatrix2 = picture.getThreeMatrix("/Users/lidapeng/Documents/paramterTest/b" + i + ".jpg");
+ ThreeChannelMatrix threeChannelMatrix1 = picture.getThreeMatrix("/Users/lidapeng/Desktop/myDocument/c.jpg");
operation.colorStudy(threeChannelMatrix1, 1, specificationsList);
System.out.println("=======================================");
- operation.colorStudy(threeChannelMatrix2, 2, specificationsList);
- System.out.println("=======================================" + i);
}
- test2(templeConfig);
+ //test2(templeConfig);
}
public static void study() throws Exception {