欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenCV--threshold--function

程序员文章站 2024-03-22 09:49:10
...

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

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 OpenCV--threshold--function
THRESH_BINARY_INV OpenCV--threshold--function
THRESH_TRUNC OpenCV--threshold--function
THRESH_TOZERO OpenCV--threshold--function
THRESH_TOZERO_INV OpenCV--threshold--function
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--threshold--function

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--threshold--function

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()

OpenCV--threshold--function

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

相关标签: OpenCV学习之路