分水岭修改

pull/25/head
thenk008 5 years ago
parent e5a72ce3bb
commit a738814f23

@ -8,7 +8,7 @@ public class Kernel {
private static final String Horizontal_Number = "[-1,-2,-1]#[0,0,0]#[1,2,1]#";//横卷积核
private static final String All_Number = "[1,-2,1]#[-2,4,-2]#[1,-2,1]#";//角卷积
private static final String All_Number2 = "[-1,0,-1]#[0,4,0]#[-1,0,-1]#";
public static final int rainNub = 10;//分水岭初始降雨点的数量
public static final int Region_Nub = 30;//一张图分为多少份
public static final double th = 0.7;//分水岭灰度阈值
public static final double rgbN = 441.6729559300637;//RGB范数归一化最大值
public static Matrix Vertical;

@ -1,5 +1,8 @@
package org.wlld.imageRecognition.segmentation;
import org.wlld.MatrixTools.Matrix;
import java.util.ArrayList;
import java.util.List;
/**
@ -11,7 +14,27 @@ public class RegionBody {
private int minY = -1;
private int maxX;
private int maxY;
public void setPoint(int x, int y) {
private List<Integer> pointList = new ArrayList<>();
private Matrix regionMap;//分区图
public List<Integer> getPointList() {
return pointList;
}
public RegionBody(Matrix regionMap) {
this.regionMap = regionMap;
}
public void merge(int type, RegionBody regionBody) throws Exception {//区域合并
List<Integer> points = regionBody.getPointList();
for (int pixel : points) {
int x = pixel >> 12;
int y = pixel & 0xfff;
setPoint(x, y, type);
}
}
public void setPoint(int x, int y, int type) throws Exception {
if (x < minX || minX == -1) {
minX = x;
}
@ -24,6 +47,9 @@ public class RegionBody {
if (y > maxY) {
maxY = y;
}
int pixel = x << 12 | y;
pointList.add(pixel);
regionMap.setNub(x, y, type);
}
public int getMinX() {

@ -18,17 +18,24 @@ public class Watershed {
private int xSize;//单元高度
private int ySize;//单元宽度
private double th = Kernel.th;//灰度阈值
private List<RegionBody> regionList = new ArrayList<>();
private Map<Integer, RegionBody> regionBodyMap = new HashMap<>();
private int regionNub = Kernel.Region_Nub;//一张图分多少份
private int xMax;
private int yMax;
private int rxMax;
private int ryMax;
private int id = 0;
public Watershed(Matrix matrix) throws Exception {
if (matrix != null) {
this.matrix = matrix;
rainfallMap = new Matrix(matrix.getX(), matrix.getY());
rainDensityMap = new Matrix(matrix.getX() / 30, matrix.getY() / 30);
rainDensityMap = new Matrix(matrix.getX() / regionNub, matrix.getY() / regionNub);
regionMap = new Matrix(matrix.getX() / regionNub, matrix.getY() / regionNub);
xMax = rainfallMap.getX() - 1;
yMax = rainfallMap.getY() - 1;
rxMax = regionMap.getX() - 1;
ryMax = regionMap.getY() - 1;
} else {
throw new Exception("matrix is null");
}
@ -183,12 +190,55 @@ public class Watershed {
}
}
//进行区域提取
xSize = x / 30;
ySize = y / 30;
xSize = x / regionNub;
ySize = y / regionNub;
System.out.println("xSize==" + xSize + ",ySize==" + ySize);
sigmaPixel();
}
private void setRegion(int x, int y, int type) throws Exception {
int i = 0;
int j = 0;
for (int t = 0; t < 8; t++) {
switch (t) {
case 0:
i = x - 1;
j = y;
break;
case 1:
i = x - 1;
j = y - 1;
break;
case 2:
i = x - 1;
j = y + 1;
break;
case 3:
i = x;
j = y - 1;
break;
case 4:
i = x;
j = y + 1;
break;
case 5:
i = x + 1;
j = y - 1;
break;
case 6:
i = x + 1;
j = y;
break;
case 7:
i = x + 1;
j = y + 1;
break;
}
if (i > -1 && j > -1 && i <= rxMax && j <= ryMax && regionMap.getNumber(i, j) == 1) {
regionBodyMap.get(type).setPoint(i, j, type);
}
}
}
private void getPosition() throws Exception {
int x = rainDensityMap.getX();
@ -196,6 +246,13 @@ public class Watershed {
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
double nub = rainDensityMap.getNumber(i, j);
if (nub == 1) {
id++;
RegionBody regionBody = new RegionBody(regionMap);
regionBody.setPoint(x, y, id);
regionBodyMap.put(id, regionBody);
setRegion(i, j, id);
}
}
}
}
@ -217,10 +274,11 @@ public class Watershed {
}
double cover = (double) sigma / (double) size;//降雨率产生剧烈波动时则出现坐标
if (cover > th) {//降雨密度图
rainDensityMap.setNub(i / 30, j / 30, 1);
rainDensityMap.setNub(i / regionNub, j / regionNub, 1);
}
}
}
getPosition();
}
private int getMinIndex(double[] array, double mySelf) {//获取最小值

Loading…
Cancel
Save