簡體   English   中英

求和面積表中的負和值(積分圖像)

[英]Negative sum values in Summed Area Table (Integral Images)

我正在嘗試在我的項目中實施積分圖像概念(基於此說明https://computersciencesource.wordpress.com/2010/09/03/computer-vision-the-integral-image/ ),但我是有一些問題。

我有平方(N * N)的矩陣,具有兩倍的值,可以計算相應的SAT表。 下一步,我想知道從主對角線上的R索引開始的正方形塊(L * L)中的值之和。 我不知道我能否對它進行足夠好的解釋以使您理解,但是我希望我的代碼可以和您交流,比我更好;)

public class Testing {

    public Testing() {
        double[][] values = {
                            {0.00,0.00,0.00,0.00,0.00,0.00,3.95,4.35,1.92,12.07,14.16,134.88},
                            {0.00,0.00,0.00,0.00,0.00,0.00,0.00,4.74,1.13,12.23,5.70,89.01},
                            {0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,2.10,13.72,1.49,71.94},
                            {0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,7.58,7.79,55.21},
                            {0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,7.79,33.01},
                            {0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,3.92},
                            {5.39,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,22.09},
                            {9.34,0.39,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,37.28},
                            {5.79,4.35,3.23,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,47.29},
                            {5.67,3.82,0.97,6.30,0.00,0.00,0.00,0.00,0.00,0.00,0.00,47.29},
                            {24.11,6.31,6.45,13.88,0.00,0.00,0.00,0.00,0.00,0.00,0.00,47.29},
                            {46.09,69.39,55.13,46.03,41.76,7.00,31.91,43.70,58.39,98.75,132.71,0.00}
                            };

        double[][] sat = calculateSAT(values);
        int size = sat.length;

        for (int r = 0; r < size; r++) {
            System.out.println("R: " + r);
            for (int l = 2; l <= size - r; l++) {
                int blockSize = l - 1;
                double s_A, s_B, s_C, s_D = sat[r + blockSize][r + blockSize];

                if (r == 0) {
                    s_A = 0;
                    s_B = 0;
                    s_C = 0;
                }
                else {
                    s_A = sat[r - 1][r - 1];
                    s_B = sat[r + blockSize][r - 1];
                    s_C = sat[r - 1][r + blockSize];
                }

                System.out.println("L: " + l);
                System.out.println("Sum: " + (s_A + s_D - s_B - s_C));
            }
            System.out.println("-------------");
        }
    }

    public double[][] calculateSAT(double[][] matrix) {
        int size = matrix.length;
        double[][] sat = new double[size][size];

        for (int x = 0; x < size; x++) {
            for (int y = 0; y < size; y++) {
                double ixy = matrix[x][y], sat_left = 0.0, sat_top = 0.0, sat_lefttop = 0.0;
                if (x == 0) {
                    sat_left = 0;
                    sat_lefttop = 0;
                }
                else {
                    sat_left = sat[x-1][y];
                }
                if (y == 0) {
                    sat_top = 0;
                    sat_lefttop = 0;
                }
                else {
                    sat_top = sat[x][y-1];
                }
                if (x != 0 && y != 0) {
                    sat_lefttop = sat[x-1][y-1];
                }

                sat[x][y] = ixy + sat_left + sat_top - sat_lefttop;
            }
        }
        printSAT(sat);
        return sat;
    }

    public void printSAT(double[][] sat) {
        for (int x = 0; x < sat.length; x++) {
            for (int y = 0; y < sat.length; y++) {
                System.out.print(sat[x][y] + "\t");
            }
            System.out.println();
        }
        System.out.println("-------------");
    }

    public static void main(String[] args) {
        new Testing();
        System.out.println("All done! :D");
    }
}

輸出是這樣的:

0.0 0.0 0.0 0.0 0.0 0.0 3.95    8.3 10.22   22.29   36.45   171.32999999999998  
0.0 0.0 0.0 0.0 0.0 0.0 3.95    13.040000000000003  16.090000000000003  40.39   60.25000000000001   284.14  
0.0 0.0 0.0 0.0 0.0 0.0 3.95    13.040000000000003  18.190000000000005  56.21000000000001   77.56000000000002   373.39  
0.0 0.0 0.0 0.0 0.0 0.0 3.95    13.040000000000003  18.190000000000005  63.79000000000001   92.93000000000004   443.96999999999997  
0.0 0.0 0.0 0.0 0.0 0.0 3.95    13.040000000000003  18.190000000000005  63.79000000000001   100.72000000000003  484.77  
0.0 0.0 0.0 0.0 0.0 0.0 3.95    13.040000000000003  18.190000000000005  63.79000000000001   100.72000000000003  488.69000000000005  
5.39    5.39    5.39    5.39    5.39    5.39    9.34    18.430000000000003  23.580000000000002  69.18   106.11000000000001  516.1700000000001   
14.73   15.119999999999997  15.119999999999997  15.119999999999997  15.119999999999997  15.119999999999997  19.069999999999997  28.16   33.31   78.91000000000001   115.84000000000003  563.1800000000001   
20.52   25.259999999999994  28.489999999999995  28.489999999999995  28.489999999999995  28.489999999999995  32.43999999999999   41.53   46.68000000000001   92.28000000000002   129.21000000000004  623.84  
26.189999999999998  34.75   38.95   45.25   45.25   45.25   49.2    58.29000000000001   63.440000000000026  109.04000000000002  145.97000000000003  687.89  
50.3    65.17   75.82000000000001   96.00000000000001   96.0    96.0    99.94999999999999   109.04  114.19  159.79  196.71999999999997  785.9299999999998   
96.39   180.64999999999998  246.43  312.64000000000004  354.40000000000003  361.40000000000003  397.26  450.05  513.59  657.94  827.58  1416.7899999999997  
-------------
R: 0
L: 2
Sum: 0.0
L: 3
Sum: 0.0
L: 4
Sum: 0.0
L: 5
Sum: 0.0
L: 6
Sum: 0.0
L: 7
Sum: 9.34
L: 8
Sum: 28.16
L: 9
Sum: 46.68000000000001
L: 10
Sum: 109.04000000000002
L: 11
Sum: 196.71999999999997
L: 12
Sum: 1416.7899999999997
-------------
R: 1
L: 2
Sum: 0.0
L: 3
Sum: 0.0
L: 4
Sum: 0.0
L: 5
Sum: 0.0
L: 6
Sum: 0.0
L: 7
Sum: 5.129999999999999
L: 8
Sum: 15.940000000000007
L: 9
Sum: 60.560000000000024
L: 10
Sum: 109.96999999999996
L: 11
Sum: 1149.0699999999997
-------------
R: 2
L: 2
Sum: 0.0
L: 3
Sum: 0.0
L: 4
Sum: 0.0
L: 5
Sum: 0.0
L: 6
Sum: 0.0
L: 7
Sum: 5.330000000000009
L: 8
Sum: 33.90000000000002
L: 9
Sum: 71.29999999999995
L: 10
Sum: 951.9999999999999
-------------
R: 3
L: 2
Sum: 0.0
L: 3
Sum: 0.0
L: 4
Sum: 0.0
L: 5
Sum: 0.0
L: 6
Sum: 7.105427357601002E-15
L: 7
Sum: 13.88000000000001
L: 8
Sum: 43.33999999999995
L: 9
Sum: 796.9699999999997
-------------
R: 4
L: 2
Sum: 0.0
L: 3
Sum: 0.0
L: 4
Sum: 0.0
L: 5
Sum: 7.105427357601002E-15
L: 6
Sum: 7.105427357601002E-15
L: 7
Sum: 7.789999999999921
L: 8
Sum: 660.1799999999996
-------------
R: 5
L: 2
Sum: 0.0
L: 3
Sum: 0.0
L: 4
Sum: 7.105427357601002E-15
L: 5
Sum: 7.105427357601002E-15
L: 6
Sum: -5.6843418860808015E-14
L: 7
Sum: 577.6199999999997
-------------
R: 6
L: 2
Sum: 0.0
L: 3
Sum: 7.105427357601002E-15
L: 4
Sum: 7.105427357601002E-15
L: 5
Sum: -5.6843418860808015E-14
L: 6
Sum: 566.6999999999996
-------------
R: 7
L: 2
Sum: 1.7763568394002505E-14
L: 3
Sum: 1.4210854715202004E-14
L: 4
Sum: -2.8421709430404007E-14
L: 5
Sum: 512.6999999999996
-------------
R: 8
L: 2
Sum: -1.4210854715202004E-14
L: 3
Sum: -7.105427357601002E-14
L: 4
Sum: 431.7199999999998
-------------
R: 9
L: 2
Sum: -5.6843418860808015E-14
L: 3
Sum: 326.03999999999974
-------------
R: 10
L: 2
Sum: 179.99999999999966
-------------
R: 11
-------------
All done! :D

我在這段代碼中遇到的問題是其中一些總和為負數。 那可能嗎? 如果我正確理解了SAT表,那是不可能的。

由於這些值確實很小,這是否是雙精度問題?

非常感謝你的幫助 :)

PS:對不起,我的英語水平沒有比這更好的了。

是的,負值是由於精度問題引起的。 如果數字足夠小,則將其視為零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM