Что такое евклидово расстояние в квадрате или сумма квадратов расстояний? - PullRequest
0 голосов
/ 25 ноября 2011

Итак, мне дали «меру сходства», но никакой информации. Мера подобия называется евклидовым расстоянием в квадрате или суммой квадратов расстояний, и у меня есть одна формула:

D2 =  Σ(I(x,y) – I’(x,y))^2 

Википедия говорит мне это:

d(p,q) = (p1 − q1)^2 + (p2 − q2)^2 + ... + (pi − qi)^2 + ... + (pn − qn)^2

У меня есть пара стереоизображений, то есть два изображения одного и того же объекта, одно с левого глаза, одно с правого глаза. Я могу извлечь информацию о пикселях из соответствующих координат на левой и правой картинках:

private double euclidDistSquared(BufferedImage leftRegion, BufferedImage rightRegion) {
    double temp = 0;
    double ssd = 0;
    Raster left = leftRegion.getData();
    Raster right = rightRegion.getData();

    for(int x = 0; x < leftRegion.getWidth();  x++) {
        for(int y = 0; y < leftRegion.getHeight(); y++) {
            temp = left.getSampleDouble(x,y,0) - right.getSampleDouble(x,y,0);
            temp *= temp;
            ssd += temp;
        }
    }
    ssd = 1/ssd;
    return ssd;
}

Что я делаю потом правильно? Эта первая временная строка - это извлечение и вычитание значений пикселей в соответствующих координатах, но кое-что из того, что я видел в Интернете, предполагает, что я хочу вычесть свои значения x и y отдельно (как бы я это сделал? !). Кроме того, значение, которое я получаю для ssd, в конце концов, очень мало, например 3.792346286724133E-6, имеет ли это смысл?

отредактировано для получения дополнительной информации.

1 Ответ

7 голосов
/ 25 ноября 2011

Этот код правильно вычисляет квадрат евклидова разделения.

Предположительно, это небольшое число, потому что значения выборки имеют небольшую величину. Нет абсолютно никакой причины не ожидать такой ценности. Только вы можете знать, что означает действительное значение и что с ним делать.


В качестве стиля я бы предпочел, чтобы переменная содержала одно и то же логическое значение в течение своего времени жизни. В этом коде вы пишете ssd = 1/ssd, что немного решетки. Вы используете ssd для обозначения s мкм из s в квадрате d истоков, но когда вы пишете 1/ssd, это больше не сумма квадратов расстояний, это мера сходства.

Я бы написал так:

private double similarityMeasure(BufferedImage leftRegion, BufferedImage rightRegion) {
    double ssd = 0;
    Raster left = leftRegion.getData();
    Raster right = rightRegion.getData();

    for(int x = 0; x < leftRegion.getWidth();  x++) {
        for(int y = 0; y < leftRegion.getHeight(); y++) {
            double diff = left.getSampleDouble(x,y,0) - right.getSampleDouble(x,y,0);
            ssd += diff*diff;
        }
    }
    return 1/ssd;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...