java - 如何找到图像中的局部最大值和最小值

标签 java opencv image-processing mask javacv

我正在学习如何获取图像中的局部和全局最大值,据我所知,在一张图像中只有一个全局最大值和一个全局最小值,并且我设法获取这些值及其相应的位置图片。所以我的问题是:

  1. 如何获取图像中的局部最大值
  2. 如何获取图像中的局部最小值
  3. 正如您在下面的代码中看到的,我正在使用掩码,但在运行时我收到了下面提到的错误消息。所以请告诉我为什么我们需要口罩以及如何正确使用它。

更新:

第 32 行是:MinMaxLocResult s = Core.minMaxLoc(gsMat, mask);

代码:

public static void main(String[] args) {
    MatFactory matFactory = new MatFactory();
    FilePathUtils.addInputPath(path_Obj);
    Mat bgrMat = matFactory.newMat(FilePathUtils.getInputFileFullPathList().get(0));

    Mat gsMat = SysUtils.rgbToGrayScaleMat(bgrMat);
    Log.D(TAG, "main", "gsMat.dump(): \n" + gsMat.dump());

    Mat mask = new Mat(new Size(3,3), CvType.CV_8U);//which type i should set for the mask

    MinMaxLocResult s = Core.minMaxLoc(gsMat, mask);
    Log.D(TAG, "main", "s.maxVal: " + s.maxVal);//to get the global maximum
    Log.D(TAG, "main", "s.minVal: " + s.minVal);//to get the global minimum
    Log.D(TAG, "main", "s.maxLoc: " + s.maxLoc);//to get the coordinates of the global maximum
    Log.D(TAG, "main", "s.minLoc: " + s.minLoc);//to get the coordinates of the global minimum
}

错误消息:

OpenCV Error: Assertion failed (A.size == arrays[i0]->size) in cv::NAryMatIterator::init, file ..\..\..\..\opencv\modules\core\src\matrix.cpp, line 3197
Exception in thread "main" CvException [org.opencv.core.CvException: ..\..\..\..\opencv\modules\core\src\matrix.cpp:3197: error: (-215) A.size == arrays[i0]->size in function cv::NAryMatIterator::init
]
at org.opencv.core.Core.n_minMaxLocManual(Native Method)
at org.opencv.core.Core.minMaxLoc(Core.java:7919)
at com.example.globallocalmaxima_00.MainClass.main(MainClass.java:32)

最佳答案

为了计算全局最小/最大值,您不需要完全使用mask

为了计算局部最小值/最大值,您可以使用一些技巧。您需要执行膨胀/腐 eclipse 操作,然后将像素值与原始图像的值进行比较。如果原始图像和膨胀/腐 eclipse 图像的值相等,则该像素是局部最小值/最大值。

代码如下:

Mat eroded = new Mat();
Mat dilated = new Mat();
Imgproc.erode(gsMat, eroded, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(5,5)));
Imgproc.dilate(gsMat, dilate, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(5,5)));

Mat localMin = new Mat(gsMat.size(), CvType.CV_8U, new Scalar(0));
Mat localMax = new Mat(gsMat.size(), CvType.CV_8U, new Scalar(0));

for (int i=0; i<gsMat.height; i++)
    for (int j=0; j<gsMat.width; j++)
    {
         if (gsMat.get(i,j) == eroded.get(i,j))
             localMin.put(i,j,255);
         if (gsMat.get(i,j) == dilated.get(i,j))
             localMax.put(i,j,255);
    }

请注意,我不是 Java 程序员。所以,代码只是算法的说明。

关于java - 如何找到图像中的局部最大值和最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30368959/

相关文章:

python - 如何使用openCV和其他库在python中找到两个视频文件的PSNR和SSIM?

android - 从深度图重建 3D 模型

python - 在 Raspberry PI 上构建时出现 OpenCV 错误

c++ - 圆圈检测: parameters for houghcricles

java - android:为什么我的 ListView 中没有出现任何元素?

java - 声明后编译器无法找到 RandomAccessFile

image - 每当未成功创建缩略图时,强制 ffmpeg 以错误代码退出

c++ - C++ 中的 DevIL 和 OpenGL

用于显示 SQL 表的列中的行数的 Java 应用程序脚本。 SQL 查询错误。输出应该在标签中

java - 单击按钮时不重复 Java 中的单词 - Android 应用程序