From 26f4aec53c72585cdf504c0646a2195b83699bea Mon Sep 17 00:00:00 2001 From: lidapeng <794757862@qq.com> Date: Thu, 20 Aug 2020 11:13:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0iou=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../segmentation/Watershed.java | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/wlld/imageRecognition/segmentation/Watershed.java b/src/main/java/org/wlld/imageRecognition/segmentation/Watershed.java index 92e1794..56958cb 100644 --- a/src/main/java/org/wlld/imageRecognition/segmentation/Watershed.java +++ b/src/main/java/org/wlld/imageRecognition/segmentation/Watershed.java @@ -284,7 +284,68 @@ public class Watershed { // int maxY = regionBody.getMaxY(); // System.out.println("minX==" + minX + ",minY==" + minY + ",maxX==" + maxX + ",maxY==" + maxY); // } - return regionBodies; + return iou(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(); + int width1 = maxY1 - minY1; + int height1 = maxX1 - minX1; + double s1 = width1 * height1; + 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(); + int width2 = maxY2 - minY2; + int height2 = maxX2 - minX2; + double s2 = width2 * height2; + double[] row = new double[]{minX1, maxX1, minX2, maxX2}; + double[] col = new double[]{minY1, maxY1, minY2, maxY2}; + Arrays.sort(row); + Arrays.sort(col); + double rowSub = row[3] - row[0]; + double colSub = col[3] - col[0]; + double width = width1 + width2; + double height = height1 + height2; + double widthSub = width - colSub; + double heightSub = height - rowSub; + if (widthSub < 0) { + widthSub = 0; + } + if (heightSub < 0) { + heightSub = 0; + } + double intersectS = widthSub * heightSub;//相交面积 + double s1Point = intersectS / s1; + double s2Point = intersectS / s2; + if (s1Point > maxIou) { + list.add(i); + } + if (s2Point > maxIou) { + list.add(j); + } + } + } + } + } + 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) {