Java и OpenCV: рассчитать медианное/среднее/стандартное значение MAT (серое изображение)

У меня есть изображение в градациях серого, используя

Mat m = Highgui.imread(path, Highgui.CV_LOAD_IMAGE_GRAYSCALE);

в Java, и теперь я хочу рассчитать медианное значение, среднее значение и стандартное отклонение. Я новичок в этом, и я просто не знаю, как узнать расчеты и прочее ... Пробовал 2 часа гугления, пожалуйста, дайте мне несколько основных советов о том, как провести исследование по этому вопросу. Я пробовал такие ключевые слова, как «среднее значение java opencv» и нашел это:

http://docs.opencv.org/java/2.4.2/org/opencv/core/Core.html#meanStdDev%28org.opencv.core.Mat,%20org.opencv.core.MatOfDouble,%20org.opencv.core.MatOfDouble%29

Я сейчас делаю это:

MatOfDouble mu = new MatOfDouble();
MatOfDouble sigma = new MatOfDouble();
Core.meanStdDev(m, mu, sigma);

Но КАК, черт возьми, получить доступ к значению mean/stdev как к двойному? Пробовал такие вещи, как

double d = mu.get(0,0)

но что-то не так. К сожалению, я не могу узнать это, прочитав документы OpenCV Java, поскольку я не знаю, что искать/на.

Мне нужно, чтобы среднее значение/stdev вычисляло пороги для хитрого фильтра... Заранее спасибо


person tim    schedule 13.03.2014    source источник


Ответы (2)


попробуй это:

double d = mu.get(0,0)[0]

mu.get(0,0) возвращает double[], поэтому вы можете просто получить первый элемент - это эквивалентно версии C++:

mu.val[0]

Надеюсь, поможет.

person Chewxy    schedule 16.03.2014
comment
это двойное d медиана? @Чьюкси - person TapanHP; 24.10.2016
comment
мю обычно является символом среднего - person Chewxy; 18.01.2017
comment
Примечание. Это дает точный ответ только для изображений в градациях серого. Для цветных изображений вам нужно взять среднее значение всех каналов. Бывший. double totalMu = (mu.get(0,0)[0] + mu.get(1,0)[0] + mu.get(2,0)[0]) / 3. - person Drew H; 13.06.2020

Вот соответствующий код для 3-канального цветного изображения. Я использовал цветовое пространство Lab. Он также будет работать с BGR...

//compute color statistics for the source image
    List<Mat> labsrc = new ArrayList<Mat>(3);
    Core.split(src, labsrc);


    MatOfDouble meansrc= new MatOfDouble();
    MatOfDouble stdsrc= new MatOfDouble();

    Core.meanStdDev(src, meansrc, stdsrc);

    Log.d("meansrc",meansrc.dump() );

    Log.d("meanval1", String.valueOf(meansrc.get(0,0)[0]));
    Log.d("meanval2", String.valueOf(meansrc.get(1,0)[0]));
    Log.d("meanval3", String.valueOf(meansrc.get(2,0)[0]));

    double lMeanSrc = meansrc.get(0,0)[0];
    double aMeanSrc = meansrc.get(1,0)[0];
    double bMeanSrc = meansrc.get(2,0)[0];

    double lStdSrc = stdsrc.get(0,0)[0];
    double aStdSrc = stdsrc.get(1,0)[0];
    double bStdSrc = stdsrc.get(2,0)[0];
person anilsathyan7    schedule 27.04.2019
comment
Отлично работает, спасибо, но вам не нужны первые две строки, так как labsrc никогда не используется. - person Anthony.; 02.09.2019