📅  最后修改于: 2020-11-23 03:45:55             🧑  作者: Mango
在简单阈值化中,阈值是全局的,即对于图像中的所有像素都相同。自适应阈值化是针对较小区域计算阈值的方法,因此对于不同区域将有不同的阈值。
在OpenCV中,您可以使用Imgproc类的adaptiveThreshold()方法对图像执行自适应阈值操作。以下是此方法的语法。
adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)
此方法接受以下参数-
src – Mat类的一个对象,代表源(输入)图像。
dst – Mat类的一个对象,代表目标(输出)图像。
maxValue-双重类型的变量,表示像素值大于阈值时要给出的值。
adaptiveMethod-一个整数变量,其类型表示要使用的自适应方法。这将是以下两个值之一
ADAPTIVE_THRESH_MEAN_C-阈值是邻域的平均值。
ADAPTIVE_THRESH_GAUSSIAN_C-阈值是邻域值的加权和,其中权重是高斯窗口。
thresholdType-整数类型的变量,表示要使用的阈值类型。
blockSize-整数类型的变量,表示用于计算阈值的像素邻域的大小。
C-双重类型的变量,表示两种方法中使用的常数(减去平均值或加权平均值)。
以下程序演示了如何在OpenCV中对图像执行自适应阈值操作。在这里,我们选择二进制类型的自适应阈值和ADAPTIVE_THRESH_MEAN_C作为阈值方法。
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class AdaptiveThresh {
public static void main(String args[]) throws Exception {
// 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/chap14/thresh_input.jpg";
// Reading the image
Mat src = Imgcodecs.imread(file,0);
// Creating an empty matrix to store the result
Mat dst = new Mat();
Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C,
Imgproc.THRESH_BINARY, 11, 12);
// Writing the image
Imgcodecs.imwrite("E:/OpenCV/chap14/Adaptivemean_thresh_binary.jpg", dst);
System.out.println("Image Processed");
}
}
假设以下是上述程序中指定的输入图像thresh_input.jpg 。
在执行程序时,您将获得以下输出-
Image Processed
如果打开指定的路径,则可以观察到输出图像,如下所示:
除了如上例所示的自适应方法ADAPTIVE_THRESH_MEAN_C和阈值类型THRESH_BINARY外,我们还可以选择这两个值的更多组合。
Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C,
Imgproc.THRESH_BINARY, 11, 12);
以下是代表参数AdaptableMethod和thresholdType及其各自输出的值的各种组合的值。
adaptiveMethod / thresholdType | ADAPTIVE_THRESH_MEAN_C | ADAPTIVE_THRESH_GAUSSIAN_C: |
---|---|---|
THRESH_BINARY | ||
THRESH_BINARY_INV |