From 580271cda1fc61674da091bcb98a81e9e5660447 Mon Sep 17 00:00:00 2001 From: thenk008 <794757862@qq.com> Date: Wed, 3 Jun 2020 16:57:08 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B9=B3=E5=9D=87?= =?UTF-8?q?=E5=85=89=E7=85=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/wlld/MatrixTools/MatrixOperation.java | 10 ++- .../wlld/imageRecognition/Convolution.java | 78 ++++--------------- .../org/wlld/imageRecognition/Operation.java | 2 +- 3 files changed, 24 insertions(+), 66 deletions(-) diff --git a/src/main/java/org/wlld/MatrixTools/MatrixOperation.java b/src/main/java/org/wlld/MatrixTools/MatrixOperation.java index 2c51f1b..425bc07 100644 --- a/src/main/java/org/wlld/MatrixTools/MatrixOperation.java +++ b/src/main/java/org/wlld/MatrixTools/MatrixOperation.java @@ -28,7 +28,7 @@ public class MatrixOperation { } //矩阵相减 - public static Matrix sub(Matrix matrix1, Matrix matrix2) throws Exception {//矩阵相加 + public static Matrix sub(Matrix matrix1, Matrix matrix2) throws Exception {// if (matrix1.getX() == matrix2.getX() && matrix1.getY() == matrix2.getY()) { Matrix matrix = new Matrix(matrix1.getX(), matrix1.getY()); int x = matrix1.getX(); @@ -422,6 +422,14 @@ public class MatrixOperation { } } + public static void mathSub(Matrix matrix, double nub) throws Exception {//矩阵数减 + for (int i = 0; i < matrix.getX(); i++) { + for (int j = 0; j < matrix.getY(); j++) { + matrix.setNub(i, j, matrix.getNumber(i, j) - nub); + } + } + } + public static void mathDiv(Matrix matrix, double nub) throws Exception {//矩阵数除 for (int i = 0; i < matrix.getX(); i++) { for (int j = 0; j < matrix.getY(); j++) { diff --git a/src/main/java/org/wlld/imageRecognition/Convolution.java b/src/main/java/org/wlld/imageRecognition/Convolution.java index 7f57be8..58a2e2a 100644 --- a/src/main/java/org/wlld/imageRecognition/Convolution.java +++ b/src/main/java/org/wlld/imageRecognition/Convolution.java @@ -112,74 +112,24 @@ public class Convolution extends Frequency { Matrix matrixB = threeChannelMatrix.getMatrixB(); int x = matrixR.getX(); int y = matrixR.getY(); - Matrix matrixRFilter = new Matrix(x, y);//滤波后的R通道 - Matrix matrixGFilter = new Matrix(x, y);//滤波后的G通道 - Matrix matrixBFilter = new Matrix(x, y);//滤波后的B通道 - int row = 0; - int column = 0; + double nub = x * y; + double sigmaR = 0; + double sigmaG = 0; + double sigmaB = 0; for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { - double sigmaR = 0; - double sigmaG = 0; - double sigmaB = 0; - double nub = 0; - for (int t = 0; t < 8; t++) { - row = 0; - column = 0; - switch (t) { - case 0://上 - row = i - 1; - break; - case 1://左 - column = j - 1; - break; - case 2://下 - row = i + 1; - break; - case 3://右 - column = j + 1; - break; - case 4://左上 - column = j - 1; - row = i - 1; - break; - case 5://左下 - column = j - 1; - row = i + 1; - break; - case 6://右下 - column = j + 1; - row = i + 1; - break; - case 7://右上 - column = j + 1; - row = i - 1; - break; - } - if (row >= 0 && column >= 0 && row < x && column < y) { - double r = matrixR.getNumber(row, column); - double g = matrixG.getNumber(row, column); - double b = matrixB.getNumber(row, column); - sigmaR = sigmaR + r; - sigmaG = sigmaG + g; - sigmaB = sigmaB + b; - nub++; - } - } - double pixelR = sigmaR / nub; - double pixelG = sigmaG / nub; - double pixelB = sigmaB / nub; - matrixRFilter.setNub(i, j, pixelR); - matrixGFilter.setNub(i, j, pixelG); - matrixBFilter.setNub(i, j, pixelB); + sigmaR = matrixR.getNumber(i, j) + sigmaR; + sigmaG = matrixG.getNumber(i, j) + sigmaG; + sigmaB = matrixB.getNumber(i, j) + sigmaB; } } - Matrix rPic = MatrixOperation.matrixPointDiv(matrixR, matrixRFilter); - Matrix gPic = MatrixOperation.matrixPointDiv(matrixG, matrixGFilter); - Matrix bPic = MatrixOperation.matrixPointDiv(matrixB, matrixBFilter); - threeChannelMatrix.setMatrixR(rPic); - threeChannelMatrix.setMatrixG(gPic); - threeChannelMatrix.setMatrixB(bPic); + double r = sigmaR / nub; + double g = sigmaG / nub; + double b = sigmaB / nub; + MatrixOperation.mathDiv(matrixR, r); + MatrixOperation.mathDiv(matrixG, g); + MatrixOperation.mathDiv(matrixB, b); + } public List getCenterColor(ThreeChannelMatrix threeChannelMatrix, int poolSize, int sqNub) throws Exception { diff --git a/src/main/java/org/wlld/imageRecognition/Operation.java b/src/main/java/org/wlld/imageRecognition/Operation.java index c693ab6..a1b5b8e 100644 --- a/src/main/java/org/wlld/imageRecognition/Operation.java +++ b/src/main/java/org/wlld/imageRecognition/Operation.java @@ -69,7 +69,7 @@ public class Operation {//进行计算 int xSize = maxX - minX; int ySize = maxY - minY; ThreeChannelMatrix threeChannelMatrix1 = convolution.getRegionMatrix(threeChannelMatrix, minX, minY, xSize, ySize); - // convolution.filtering(threeChannelMatrix1);//光照过滤 + //convolution.filtering(threeChannelMatrix1);//光照过滤 int times = templeConfig.getFood().getTimes(); for (int i = 0; i < times; i++) { List feature = convolution.getCenterColor(threeChannelMatrix1, templeConfig.getPoolSize(), From 32119aa497cb2c0677a16878437d8dd674e46091 Mon Sep 17 00:00:00 2001 From: thenk008 <794757862@qq.com> Date: Fri, 5 Jun 2020 09:29:04 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=87=E5=89=B2?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=BC=82=E5=B8=B8=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/wlld/imageRecognition/Operation.java | 84 ++++++++++--------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/src/main/java/org/wlld/imageRecognition/Operation.java b/src/main/java/org/wlld/imageRecognition/Operation.java index a1b5b8e..fc87c5d 100644 --- a/src/main/java/org/wlld/imageRecognition/Operation.java +++ b/src/main/java/org/wlld/imageRecognition/Operation.java @@ -61,47 +61,51 @@ public class Operation {//进行计算 public void colorStudy(ThreeChannelMatrix threeChannelMatrix, int tag, List specificationsList) throws Exception { Watershed watershed = new Watershed(threeChannelMatrix.getMatrixRGB(), specificationsList, templeConfig); List regionBodies = watershed.rainfall(); - RegionBody regionBody = regionBodies.get(0); - int minX = regionBody.getMinX() + dif; - int minY = regionBody.getMinY() + dif; - int maxX = regionBody.getMaxX() - dif; - int maxY = regionBody.getMaxY() - dif; - int xSize = maxX - minX; - int ySize = maxY - minY; - ThreeChannelMatrix threeChannelMatrix1 = convolution.getRegionMatrix(threeChannelMatrix, minX, minY, xSize, ySize); - //convolution.filtering(threeChannelMatrix1);//光照过滤 - int times = templeConfig.getFood().getTimes(); - for (int i = 0; i < times; i++) { - List feature = convolution.getCenterColor(threeChannelMatrix1, templeConfig.getPoolSize(), - templeConfig.getFeatureNub()); - if (templeConfig.isShowLog()) { - System.out.println(tag + ":" + feature); - } - //System.out.println("====================================="); - int classifier = templeConfig.getClassifier(); - switch (classifier) { - case Classifier.DNN: - Map map = new HashMap<>(); - map.put(tag, 1.0); - if (templeConfig.getSensoryNerves().size() == templeConfig.getFeatureNub() * 3) { - intoDnnNetwork(1, feature, templeConfig.getSensoryNerves(), true, map, null); - } else { - throw new Exception("nerves number is not equal featureNub"); - } - break; - case Classifier.LVQ: - Matrix vector = MatrixOperation.listToRowVector(feature); - lvqStudy(tag, vector); - break; - case Classifier.VAvg: - Matrix vec = MatrixOperation.listToRowVector(feature); - avgStudy(tag, vec); - break; - case Classifier.KNN: - Matrix veck = MatrixOperation.listToRowVector(feature); - knnStudy(tag, veck); - break; + if (regionBodies.size() == 1) { + RegionBody regionBody = regionBodies.get(0); + int minX = regionBody.getMinX() + dif; + int minY = regionBody.getMinY() + dif; + int maxX = regionBody.getMaxX() - dif; + int maxY = regionBody.getMaxY() - dif; + int xSize = maxX - minX; + int ySize = maxY - minY; + ThreeChannelMatrix threeChannelMatrix1 = convolution.getRegionMatrix(threeChannelMatrix, minX, minY, xSize, ySize); + //convolution.filtering(threeChannelMatrix1);//光照过滤 + int times = templeConfig.getFood().getTimes(); + for (int i = 0; i < times; i++) { + List feature = convolution.getCenterColor(threeChannelMatrix1, templeConfig.getPoolSize(), + templeConfig.getFeatureNub()); + if (templeConfig.isShowLog()) { + System.out.println(tag + ":" + feature); + } + //System.out.println("====================================="); + int classifier = templeConfig.getClassifier(); + switch (classifier) { + case Classifier.DNN: + Map map = new HashMap<>(); + map.put(tag, 1.0); + if (templeConfig.getSensoryNerves().size() == templeConfig.getFeatureNub() * 3) { + intoDnnNetwork(1, feature, templeConfig.getSensoryNerves(), true, map, null); + } else { + throw new Exception("nerves number is not equal featureNub"); + } + break; + case Classifier.LVQ: + Matrix vector = MatrixOperation.listToRowVector(feature); + lvqStudy(tag, vector); + break; + case Classifier.VAvg: + Matrix vec = MatrixOperation.listToRowVector(feature); + avgStudy(tag, vec); + break; + case Classifier.KNN: + Matrix veck = MatrixOperation.listToRowVector(feature); + knnStudy(tag, veck); + break; + } } + } else { + throw new Exception("Parameter exception"); } }