📜  OpenCV-图像金字塔

📅  最后修改于: 2020-11-23 03:45:08             🧑  作者: Mango


金字塔是对图像进行的操作,

  • 首先使用特定的平滑滤波器(例如:高斯,拉普拉斯滤波器)对输入图像进行平滑处理,然后对平滑后的图像进行二次采样。

  • 重复此过程多次。

在金字塔操作期间,图像的平滑度增加,分辨率(大小)减小。

金字塔起来

在“金字塔向上”中,首先对图像进行上采样,然后再进行模糊处理。您可以使用imgproc类的pyrUP()方法对图像执行Pyramid Up操作。以下是此方法的语法-

pyrUp(src, dst, dstsize, borderType)

此方法接受以下参数-

  • srcMat类的一个对象,代表源(输入)图像。

  • matMat类的一个对象,代表目标(输出)图像。

  • sizeSize类的对象,代表要放大或缩小图像的尺寸。

  • borderType-整数类型的变量,表示要使用的边框类型。

以下程序演示了如何对图像执行Pyramid Up操作。

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidUp {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying pyrUp on the Image
      Imgproc.pyrUp(src, dst, new Size(src.cols()*2,  src.rows()*2), Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/pyrUp_output.jpg", dst);

      System.out.println("Image Processed");
   }
}

假设以下是上述程序中指定的输入图像pyramid_input.jpg

金字塔输入

输出

在执行程序时,您将获得以下输出-

Image Processed

如果打开指定的路径,则可以观察到输出图像,如下所示:

金字塔输出

金字塔倒

在Pyramid Down中,图像最初会模糊,然后进行下采样。您可以使用imgproc类的pyrDown()方法对图像执行Pyramid Down操作。以下是此方法的语法-

pyrDown(src, dst, dstsize, borderType)

此方法接受以下参数-

  • srcMat类的一个对象,代表源(输入)图像。

  • matMat类的一个对象,代表目标(输出)图像。

  • sizeSize类的对象,代表要放大或缩小图像的尺寸。

  • borderType-整数类型的变量,表示要使用的边框类型。

以下程序演示了如何对图像执行Pyramid Down操作。

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidDown {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying pyrDown on the Image
      Imgproc.pyrDown(src, dst, new Size(src.cols()/2,  src.rows()/2),
         Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/pyrDown_output.jpg", dst);

      System.out.println("Image Processed");
   } 
}

假设以下是上述程序中指定的输入图像pyramid_input.jpg

金字塔输入

输出

在执行程序时,您将获得以下输出-

Image Processed

如果打开指定的路径,则可以观察到输出图像,如下所示:

金字塔向下输出

均值漂移滤波

在均值平移金字塔运算中,执行图像均值平移分割的初始步骤。

您可以使用imgproc类的pyrDown()方法对图像执行金字塔均值平移滤波操作。以下是此方法的语法。

pyrMeanShiftFiltering(src, dst, sp, sr)

此方法接受以下参数-

  • srcMat类的一个对象,代表源(输入)图像。

  • matMat类的一个对象,代表目标(输出)图像。

  • sp-类型为double的变量,表示空间窗口半径。

  • sr-代表颜色窗口半径的double类型的变量。

以下程序演示了如何对给定图像执行均值平移滤波操作。

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidMeanShift {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying meanShifting on the Image
      Imgproc.pyrMeanShiftFiltering(src, dst, 200, 300);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/meanShift_output.jpg", dst);
      
      System.out.println("Image Processed");
   } 
}

假设以下是上述程序中指定的输入图像pyramid_input.jpg

金字塔输入

输出

在执行程序时,您将获得以下输出-

Image Processed

如果打开指定的路径,则可以观察到输出图像,如下所示:

均值漂移滤波输出