python-openCV入门(三)--二值化操作

目录

全局阀值
局部阀值

前言

在灰度图像的处理中,经常会用到二值化处理,二值化处理中最常用是就是全局阀值和局部阀值。
我们将对下面这一幅照片进行处理。


TIM图片20190216230535.png

全局阀值

# -*- coding=GBK -*-
import cv2 as cv

image = cv.imread("2.jpg")

#全局阈值

gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)  #把输入图像灰度化
    #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割。
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
print("threshold value %s"%ret)
cv.namedWindow("binary0", cv.WINDOW_NORMAL)
cv.imshow("normal", gray)
cv.imshow("binary0", binary)

cv.waitKey(0)
cv.destroyAllWindows()

全局阀值二值化图像


TIM图片20190216230528.png

函数说明

函数说明:

第一个参数表示输入图像,必须为单通道灰度图。

第二个参数表示输出的边缘图像,为单通道黑白图。

第三个参数表示阈值

第四个参数表示最大值。

第五个参数表示运算方法。

在OpenCV的imgproc\types_c.h中可以找到运算方法的定义。

/* Threshold types */

CV_THRESH_BINARY      =0,  /* value = value > threshold ? max_value : 0       */

CV_THRESH_BINARY_INV  =1,  /* value = value > threshold ? 0 : max_value       */

CV_THRESH_TRUNC       =2,  /* value = value > threshold ? threshold : value   */

CV_THRESH_TOZERO      =3,  /* value = value > threshold ? value : 0           */

CV_THRESH_TOZERO_INV  =4,  /* value = value > threshold ? 0 : value           */

CV_THRESH_MASK        =7,

CV_THRESH_OTSU        =8  /* use Otsu algorithm to choose the optimal threshold value; combine the flag with one of the above CV_THRESH_* values */

注释已经写的很清楚了,因此不再用中文来表达了。

局部阀值

import cv2 as cv

image = cv.imread("2.jpg")
#全局阈值

gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)  #把输入图像灰度化
    #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割。
binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY, 25, 10)

cv.namedWindow("binary0", cv.WINDOW_NORMAL)
cv.imshow("normal", gray)
cv.imshow("binary0", binary)

cv.waitKey(0)
cv.destroyAllWindows()

局部阀值二值化图像


wed.png

自适应阈值化能够根据图像不同区域亮度分布的,改变阈值,具体调用方法如下:


void cv::adaptiveThreshold(
    cv::InputArray src, // 输入图像
    cv::OutputArray dst, // 输出图像
    double maxValue, // 向上最大值
    int adaptiveMethod, // 自适应方法,平均或高斯
    int thresholdType // 阈值化类型
    int blockSize, // 块大小
    double C // 常量
);

cv::adaptiveThreshold()支持两种自适应方法,即cv::ADAPTIVE_THRESH_MEAN_C(平均)和cv::ADAPTIVE_THRESH_GAUSSIAN_C(高斯)。
在两种情况下,自适应阈值T(x, y)。通过计算每个像素周围bxb大小像素块的加权均值并减去常量C得到。其中,b由blockSize给出,大小必须为奇数;如果使用平均的方法,则所有像素周围的权值相同;如果使用高斯的方法,则(x,y)周围的像素的权值则根据其到中心点的距离通过高斯方程得到。

你可能感兴趣的:(python-openCV入门(三)--二值化操作)