Java opencv robinson mask,Image完全是黑色的

时间:2015-05-23 21:47:42

标签: java opencv image-processing

我正在玩open cv,我决定测试一下罗宾逊面具的教程example。我复制了代码并使用了灰度级的jpg - 不幸的是,输出的图像是完全黑的。
我尝试评论出两个额外的方向滤波器。图像仍然是黑色的。
-I' m使用java 1.8和opencv 3

try{
     int kernelSize = 9;
     System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
     Mat source = Imgcodecs.imread("grayScale2.jpg",  Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
     Mat destination = new Mat(source.rows(),source.cols(),source.type());  
     Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F){
        {
           put(0,0,-1);
           put(0,1,0);
           put(0,2,1);

           put(1,0-2);
           put(1,1,0);
           put(1,2,2);

           put(2,0,-1);
           put(2,1,0);
           put(2,2,1);
        }
     };       

     Imgproc.filter2D(source, destination, -1, kernel);
     Imgcodecs.imwrite("robinsonMaskExample.jpg", destination);

  } catch (Exception e) {
     System.out.println("Error: " + e.getMessage());
  }

1 个答案:

答案 0 :(得分:1)

您链接我们的代码有点缺陷。它将内核大小定义为9 x 9大小,但内核本身显然是3 x 3.因此,它将内核系数放在内核的左上角,其余的内核本身是这可能是你没有看到正确结果的原因。 put方法将数字放在矩阵的行和列中。正如您在定义内核的代码中所看到的那样,它将内容放在行0,1,2和第0,1,2行中 - 这是隐式的3 x 3内核,但内核的大小是实际上是9 x 9。

因此,请取消注释您注释掉的那些行,因为正确定义整个边缘检测蒙版非常重要。此外,该帖子在使用的边缘检测掩码方面是错误的。那实际上是在使用Sobel operator。我从来没有听说过一个名为" Robinson"之前,但我听说过Roberts-Cross掩码,这是一个 2 x 2 内核,如下所示:

来源:Wikipedia

因此,最简单的解决方法是更改​​内核大小,使其成为3 ....所以只需更改此内容:

$results = array('Thing 1', 'Thing 2')

对此:

int kernelSize = 9;

更广泛的图片:

int kernelSize = 3;

这个故事的道德。在线查找教程,这将成为您的一课。不要相信所有这些信息,因为它们有时会向您提供错误的信息,例如您刚才使用错误的内核大小并且调用边缘检测器时出错的信息。我当然会将它们作为一个很好的起点,但是当谈到细节时,请始终调试已发布的代码,以确保他们打算写的内容实际上是生成的内容。