OpenCV阈值处理——摘抄官文档
写这篇文章的目的一方面是个人实践,另一方面也算是做个笔记,方便以后查询。
import cv2 //声明opencv的引用,一边能够调用OPENCV的相关函数,大部分是封装在CV2里的。
src = cv2.imread(">>>>>>>>>>.jpg") //选择读取的文件地址+名字。
winName = “不错” //为显示窗口取一个“不错”的名字。
cv2.imshow(winName, src) //在窗口上显示原始图像src。
一个完整的最基本的显示功能就此实现。
OPENCV对于阈值处理提供了三种方式:(1)简单阈值 (2) 自适应阈值 (3)Otsu's二值化处理
相关函数:cv2.threshold, cv2.adaptiveThreshod,
一、简单阈值
基本思想就是给定一个阈值,判断高于还是低于,然后做相应的处理。
实验:
ret, thresh = cv2.threshold(src, 127, 255, cv2.THRESH_TRUNC)
二、自适应阈值
简单阈值采用的是全局阈值,这样就会导致整个图像参考的是一个值,在处理过程中适应性不是很好,局部可能会造成数据全部没有,或者全部变亮。所解决这个问题可以采用局部阈值的方法:
th2 = cv2.adaptiveThreshold(drc, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(drc, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,2)
从图中可以看出很好的保留了图像的轮廓信息。
三、Otsu's二值化处理
此方法就是寻找直方图双峰图像的方差最下阈值
src = cv2.imread("************.jpg", 0) blur = cv2.GaussianBlur(src, (5, 5), 0) # 计算直方图 hist = cv2.calcHist([blur], [0], None, [256], [0, 256]) hist_norm = hist.ravel()/hist.max() Q = hist_norm.cumsum() bins = np.arange(256) fn_min = np.inf thresh = -1 for i in range(1, 256): # 拆分数组,以i为界限 p1, p2 = np.hsplit(hist_norm, [i]) # 求出概率和(略有不同) q1, q2 = Q[i], Q[255]-[i] b1, b2 = np.hsplit(bins, [i]) # 找到均值和方差 m1, m2 = np.sum((p1*b1)/q1), np.sum((p2*b2)/q2) v1, v2 = np.sum(((b1-m1)**2)*p1)/q1, np.sum(((b2-m2)**2)*p2)/q2 # 寻找最小值 fn = v1*q1 + v2*q2 if fn < fn_min: fn_min = fn thresh = i ret, otsu = cv2.threshold(blur, thresh, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) cv2.imshow("blur", otsu) cv2.waitKey(0)