📜  OpenCV-自适应阈值(1)

📅  最后修改于: 2023-12-03 15:33:18.022000             🧑  作者: Mango

OpenCV-自适应阈值

简介

OpenCV是一个用于处理图像和视频数据的开源库。该库提供了一系列强大的函数,可用于处理各种图像操作,例如对比度调整、滤波、形态学运算、颜色空间转换等等。其中一个重要的功能就是图像二值化,它可以将一幅图像转换成黑白二值图像,应用于很多图像处理算法中。

图像二值化是将灰度图像转换成二值图像,即黑白图像。二值化的目的是为了用于图像分割、边缘检测、模板匹配、字符识别等任务。当图像中存在复杂的背景或噪声时,即使使用全局的阈值分割方法,也无法获得满意的效果。此时可以使用自适应阈值分割方法。

自适应阈值分割方法是基于局部邻域内灰度均值或中间值计算阈值,因此它能够适应复杂背景和噪声的影响,获得更好的效果。OpenCV提供了一系列自适应阈值分割函数,可以满足不同场景的需要。

使用方法

自适应阈值分割方法在OpenCV中有很多函数可以使用,下面列出了其中几个常用的函数:

cv2.adaptiveThreshold()

该函数用于将输入数组中的每个像素进行二值化处理,二值化的阈值根据局部邻域的灰度值计算。在局部邻域内,以均值或中间值为分界点,小于或等于该分界点的像素被置为0,大于分界点的像素被置为255。函数的语法如下:

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst

第一个参数src是输入矩阵,可为灰度图像或彩色图像。如果输入的是彩色图像,则需要先进行颜色空间转换(例如转换到灰度空间)。

第二个参数maxValue 是输出二值化图像的最大值。

第三个参数 adaptiveMethod指定自适应阈值的算法,可为以下两种算法之一:ADAPTIVE_THRESH_MEAN_C、ADAPTIVE_THRESH_GAUSSIAN_C。

第四个参数thresholdType指定二值化的类型,可为以下两种之一:THRESH_BINARY 或 THRESH_BINARY_INV。

第五个参数blockSize指定局部邻域的大小,必须为奇数。

第六个参数C是从局部均值或中值减去的常数。这是一个可选参数,可以为0。如果C为正值,则较暗的像素将被显着突出。

第七个参数dst是输出的二值化图像,可选参数。

cv2.threshold()

与cv2.adaptiveThreshold()不同,该函数将整个输入矩阵使用全局的固定阈值作为分界点进行二值化处理。该函数的语法如下:

cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dst

第一个参数src是输入数组,通常为灰度图像。

第二个参数thresh是用于对像素值进行分类的阈值。

第三个参数maxval表示输出值的最大值。如果二值图像为黑白,则maxval应该设置为255。

第四个参数type指定二值化的类型,常用的有 THRESH_BINARY(大于阈值则置为maxval,小于阈值则置为0)和 THRESH_BINARY_INV(大于阈值则置为0,小于阈值则置为maxval)等。

示例代码
Python
import cv2

def adaptive_threshold(img_path):
    # 读入图片
    img = cv2.imread(img_path)
    # 转换为灰度图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 自适应阈值分割(均值)
    threshold_mean = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
    # 自适应阈值分割(高斯权重)
    threshold_gaussian = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

    # 展示结果
    cv2.imshow("Original Image", img)
    cv2.imshow("Adaptive Threshold (Mean)", threshold_mean)
    cv2.imshow("Adaptive Threshold (Gaussian)", threshold_gaussian)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    img_path = "example.jpg"
    adaptive_threshold(img_path)
C++
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void adaptiveThreshold(const char* img_path)
{
    // 读入图片
    Mat img = imread(img_path);
    // 转换为灰度图像
    Mat gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);

    // 自适应阈值分割(均值)
    Mat threshold_mean;
    adaptiveThreshold(gray, threshold_mean, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 11, 2);
    // 自适应阈值分割(高斯权重)
    Mat threshold_gaussian;
    adaptiveThreshold(gray, threshold_gaussian, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 11, 2);

    // 展示结果
    imshow("Original Image", img);
    imshow("Adaptive Threshold (Mean)", threshold_mean);
    imshow("Adaptive Threshold (Gaussian)", threshold_gaussian);
    waitKey(0);
    destroyAllWindows();
}

int main(int argc, char** argv)
{
    const char* img_path = "example.jpg";
    adaptiveThreshold(img_path);
    return 0;
}

以上就是关于OpenCV自适应阈值的介绍及示例代码,希望对大家有所帮助。