📜  使用 OpenCV 模糊图像的Java程序

📅  最后修改于: 2022-05-13 01:55:03.765000             🧑  作者: Mango

使用 OpenCV 模糊图像的Java程序

模糊是一种简单且常用的图像处理操作。它也称为平滑。 OpenCV 库提供了许多函数来应用不同的线性过滤器来平滑图像或模糊图像。

图像的平滑从图像中去除噪声像素并对图像应用低通滤波器。低通滤波器意味着从图像中去除噪声,同时不损坏图像的大部分。最常见的滤波器类型是线性的。在线性滤波器中,输入像素值的加权和决定了输出像素值。

可用于模糊图像的OpenCV 函数如下:

  • 模糊()
  • 高斯模糊()
  • 中值模糊()
  • 双边过滤器()

方法一。 Blur() 此函数使用归一化块过滤器执行平滑。

句法:

Imgproc.blur(src, dst, new Size(i, i), new Point(-1, -1));

参数:此函数需要 4 个参数

  • src:源图像
  • dst:目标图像
  • Size( w, h ):宽w像素、高h像素的核的大小
  • Point(-1, -1):表示相对于邻域的锚点位置。如果存在负值,则内核的中心被认为是锚点。

方法 2. GaussianBlur() 此函数使用高斯滤波器执行平滑。

句法:

Imgproc.GaussianBlur(src, dst, new Size(i, i), 0, 0);

参数:此函数需要 4 个参数

  • src:源图像
  • dst:目标图像
  • Size(w, h):要使用的内核的大小。如果 w 和 h 不是奇数和正数,则将使用 σx 和 σy 参数计算大小。
  • σx, σy:x 和 y 的标准差。写入 0 意味着 σx 和 σy 是使用内核大小计算的。

方法3.medianBlur() 此函数使用中值滤波器执行平滑。

句法:

Imgproc.medianBlur(src, dst, i);

参数:此函数需要 3 个参数

  • src:源图像
  • dst:目标图像
  • i:内核的大小。一定很奇怪。

方法4.lateralFilter() 此函数使用 双边过滤。

句法:

Imgproc.bilateralFilter(src, dst, i, i * 2, i / 2);

参数:此函数需要 5 个参数

  • src:源图像
  • dst:目标图像
  • d:每个像素邻域的直径。
  • σColor:颜色空间中的标准偏差。
  • σSpace:坐标空间中的标准偏差(以像素为单位)

实现:输入图像如下,应该被模糊掉。

输入图像

Java
// Importing OpenCV libraries
// to use inbuilt methods
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
 
class GFG {
 
    int DELAY_BLUR = 100;
    int MAX_KERNEL_LENGTH = 31;
 
    // Source Image by creating Matlab object
    Mat src = new Mat();
 
    // Destination Image by creating Matlab object
    Mat dst = new Mat();
 
    // Main driver code
    public static void main(String[] args)
    {
        // Load the native library
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
 
        // Taking input image from directory
        String filename = "D:\\InputImage.jpg";
        src = Imgcodecs.imread(filename,
                               Imgcodecs.IMREAD_COLOR);
 
        // 4 different methods of Imgproc class
        // to blur out input image
 
        // Method 1. Standard blur method
        // using blur()
        for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) {
            Imgproc.blur(src, dst, new Size(i, i),
                         new Point(-1, -1));
 
            // Display blurred input image
            displayDst(DELAY_BLUR);
        }
 
        // Method 2. Gaussian blur method
        // using GaussianBlur()
        for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) {
            Imgproc.GaussianBlur(src, dst, new Size(i, i),
                                 0, 0);
            // Display blurred input image
            displayDst(DELAY_BLUR);
        }
 
        // Method 3. Median blur method
        // using medianBlur()
        for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) {
            Imgproc.medianBlur(src, dst, i);
 
            // Display blurred input image
            displayDst(DELAY_BLUR);
        }
 
        // Method 4. Bilateral filter Method
        // using bilateralFilter()
        for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) {
            Imgproc.bilateralFilter(src, dst, i, i * 2,
                                    i / 2);
 
            // Display blurred input image
            displayDst(DELAY_BLUR);
        }
    }
}


输出:输出图像是对应输入图像的模糊图像:

输出图像