Java 和 OpenCV:计算 MAT(灰度图像)的中位数 / 平均值 / 标准差

6
我使用以下方法得到了一张灰度图像:
Mat m = Highgui.imread(path, Highgui.CV_LOAD_IMAGE_GRAYSCALE);

在Java中,我想计算中位数、平均值和标准差。我对此很陌生,不知道如何进行计算...已经尝试了两个小时的谷歌搜索,请给我一些关于如何进行研究的基本建议。我已经尝试了像“mean value java opencv”这样的关键词,并找到了这个链接:http://docs.opencv.org/java/2.4.2/org/opencv/core/Core.html#meanStdDev
现在我正在做以下事情:
MatOfDouble mu = new MatOfDouble();
MatOfDouble sigma = new MatOfDouble();
Core.meanStdDev(m, mu, sigma);

但是如何将均值/标准差作为double访问呢?尝试了以下方法:
double d = mu.get(0,0)

但是有些问题出现了。不幸的是,我自己阅读OpenCV Java文档时找不出问题,因为我不知道该看什么/在哪里查找。

我需要均值/标准差来计算Canny滤波器的阈值...非常感谢您的帮助。

2个回答

8

试一下这个:

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

mu.get(0,0)返回一个double[]数组,因此您只需获取第一个元素 - 它相当于C++版本的:

mu.val[0]

希望这能有所帮助。

那个双d是中位数吗?@Chewxy - TapanHP
1
mu通常是平均值的符号。 - Chewxy
注意:这只对灰度图像给出准确的答案。对于彩色图像,您需要取所有通道的平均值。例如:double totalMu = (mu.get(0,0)[0] + mu.get(1,0)[0] + mu.get(2,0)[0]) / 3. - Drew H

1

这是一个针对三通道彩色图像的相应代码。我使用了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];

运行良好,谢谢。但是你不需要前两行,因为labsrc从未被使用过。 - Anthony.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接