天天看點

OpenCV java 線性濾波(16)

前面說過高斯濾波,這裡介紹線性濾波

線性濾波

輸出圖像fo(x,y)= T[ fi(x,y) ],T是線性算子,即:輸出圖像上每個像素點的值都是由輸入圖像各像素點值權重求和的結果。

非線性濾波的算子中包含了取絕對值、置零等非線性運算。

函數

Imgproc.filter2D(src, dst, -1, kernel, new Point(-1,-1));

OpenCV java 線性濾波(16)

 代碼實作:

public static void main(String[] args) {
    try {
      ResourceBundle bundle = ResourceBundle.getBundle("opencv");
      String opencvDllName = bundle.getString("opencv.dllpath");
      System.load(opencvDllName);
    } catch (Exception e) {
      e.printStackTrace();
    }
    String filename = "D:\\360MoveData\\Users\\lxn\\Desktop\\opencvtest\\cph.png";
    Mat src = Imgcodecs.imread(filename);// 加載原圖
    Mat dst=new Mat();
    Mat kernel=new Mat(new Size(3,3),CvType.CV_8SC1);//建立濾波核心

        kernel.put(0,0,1,0,1);
        kernel.put(1,0,0,1,0);
        kernel.put(2,0,1,0,1);
    System.out.println(kernel.dump());
    //Imgproc.filter2D(src, dst,-1, kernel);
    
    //Imgproc.filter2D(src, dst, -1, kernel, new Point(-1,-1));

    
    Imgproc.filter2D(src, dst, -1, kernel, new Point(-1,-1));

    Point p1=new Point(500, 100);
    
    Point p2=new Point(520,120);

    System.out.println(src.submat(new Rect(p1,p2)).dump());
    
    System.out.println(dst.submat(new Rect(p1,p2)).dump());

    HighGui.imshow("原圖", src);
    HighGui.imshow("線性濾波之後", dst);
    HighGui.waitKey();
  }      

圖像的處理效果和卷積核有着很大的關系

當卷積核:

[  1,   0,   1;

   0,   1,   0;

   1,   0,   1]

濾波前後的圖像對比:

OpenCV java 線性濾波(16)

 改變卷積核:

[ -1,   0,  -1;

   0,   4,   0;

  -1,   0,  -1]

OpenCV java 線性濾波(16)

上面是對filter2D 這個線性濾波函數的基本的操作