OpenCV--threshold

像素值(高于/低于)阈值时,像素赋予(新值/保持不变),由具体阈值模式决定

opencv–简单阈值–cv2.threshold

cv2.threshold(InputArray src, double thresh, double maxval, int type, OutputArray dst=None)

参数说明
src: 原图灰度图
thresh:阈值
maxval:上限可能赋予的值,一般设置为255
int type:阈值类型, 决定二值化操作的具体方式,以下详细说明

type 处理方式
THRESH_BINARY 在这里插入图片描述
THRESH_BINARY_INV 在这里插入图片描述
THRESH_TRUNC 在这里插入图片描述
THRESH_TOZERO 在这里插入图片描述
THRESH_TOZERO_INV 在这里插入图片描述
import cv2
import numpy as np

src = cv2.imread('E:\\opencv\\lena.jpg')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#cv2.threshold()返回2个参数,src_thresh为二值化图像
#ret为指定的阈值
ret, src_thresh = cv2.threshold(src_gray, 127, 255, cv2.THRESH_BINARY)
result = np.hstack((src_gray, src_thresh))
cv2.imshow('result', result)
cv2.imwrite('E:\\opencv\\lena1.jpg', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

opencv–自适应阈值–cv2.adaptiveThreshold

当同一幅图像上的不同部分的具有不同亮度时,全局阈值二值化的效果不尽人意。这种情况下可以采用自适应阈值,此时的阈值是根据图像上每一个小区域计算与其对应的阈值。

cv2.adaptiveThreshold(src, maxValue, adaptiveThreshold, thresholdType, blockSize, C, dst=None)

参数说明
src: 原图灰度图
maxValue: 上限可能赋予的值,一般设置为255
adaptiveThreshold:自适应阈值的方法
1>. cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平
均值
2>. cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域
的加权和,权重为一个高斯窗口。

thresholdTyp: 指定各个局部区域二值化的模式,同简单阈值法
blockSize: 局部区域的大小
C : 常数,阈值计算出平均值或者加权平均值之后减去这个常
数。

import cv2
import numpy as np

src = cv2.imread('E:\\opencv\\lena.jpg')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#cv2.threshold()返回2个参数,src_thresh为二值化图像
src_thresh = cv2.threshold(src_gray, 127, 255, cv2.THRESH_BINARY)[1]

src_thresh_adapt = cv2.adaptiveThreshold(src_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, \
                                         cv2.THRESH_BINARY, 9, 2)
result = np.hstack((src_gray, src_thresh, src_thresh_adapt))
cv2.imshow('result', result)
cv2.imwrite('E:\\opencv\\lena1.jpg', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

opencv–Otsu’s–cv2.THRESH_OTSU

Otsu二值化主要针对图像直方图具有两个或多个峰的图像进行的操作,此时把阈值设为0,然后可以自动计算出最佳阈值以参数ret返回。使用的还是函数出cv2.threshold(), 此时需要多传入参数cv2.THRESH_OTSU

cv2.threshold(InputArray src, double thresh, double maxval, int type+cv2.THRESH_OTSU, OutputArray dst=None)
import cv2
import numpy as np

src = cv2.imread('E:\\opencv\\lena.jpg')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#cv2.threshold()返回2个参数,src_thresh为二值化图像
src_thresh = cv2.threshold(src_gray, 127, 255, cv2.THRESH_BINARY)[1]
src_thresh_adapt = cv2.adaptiveThreshold(src_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, \
                                         cv2.THRESH_BINARY, 9, 2)
#ret为采用自适应阈值则ret是返回的最佳阈值
ret, src_thresh_otsu = cv2.threshold(src_gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

result = np.hstack((src_gray, src_thresh, src_thresh_adapt, src_thresh_otsu ))
cv2.imshow('result', result)
cv2.imwrite('E:\\opencv\\lena1.jpg', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

Otsu‘s 算法就是要找到一个阈值 t, 使得同一类加权方差最小,需要满足下列关系式:
在这里插入图片描述
其中
在这里插入图片描述
其实就是在两个峰之间找到一个阈值t,将这两个峰分开,并且使每一个峰内的方差最小。

猜你喜欢

转载自blog.csdn.net/m0_46278903/article/details/106418423