OpenCV学习10-图像的阈值

'''
简单阈值,这种方法非常简单。但像素值高于阈值时,我们给这个像素赋予一个新值(可能是白色),否则我们给它赋予
另外一种颜色(也许是黑色)。这个函数就是 cv2.threshhold()。这个函数的第一个参数就是原图像,原图像应该是灰度
图。第二个参数就是用来对像素值进行分类的阈值。第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新
的像素值。OpenCV提供了多种不同的阈值方法,这是有第四个参数来决定的。这些方法包括:
'''
import cv2 as cv
import numpy as np 
from matplotlib import pyplot as plt

img = cv.imread('timg.jpg',0)
#第一个参数,第一个参数就是原图像,原图像应该是灰度图
#第二个参数,第二个参数就是用来对像素值进行分类的阈值。
#第三个参数,第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值。
#第四个参数,int类型的type,阈值类型 ,有以下几种类型
#0: THRESH_BINARY  当前点值大于阈值时,取Maxval,也就是第四个参数,下面再不说明,否则设置为0
#1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
#2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
#3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
#4: THRESH_TOZERO_INV  当前点值大于阈值时,设置为0,否则不改变
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
ret,thresh2 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV)
ret,thresh3 = cv.threshold(img,127,255,cv.THRESH_TRUNC)
ret,thresh4 = cv.threshold(img,127,255,cv.THRESH_TOZERO)
ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img,thresh1,thresh2,thresh3,thresh4,thresh5]

for i in range(6):
	#(2,3,i+1),2,3表示2*3个图像,因为不能从0开始,所以要i+1
	plt.subplot(2,3,i+1)
	#输出图像标题
	plt.title(titles[i])
	#输出图像
	plt.imshow(images[i],'gray')
	#x,y坐标不显示
	plt.xticks([]),plt.yticks([])
plt.show()

在这里插入图片描述

'''
自适应阈值,在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其
是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小
区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。
'''
import cv2 as cv
import numpy as np 
from matplotlib import pyplot as plt

img = cv.imread('timg.jpg',0)
img1 = cv.medianBlur(img,5)

ret,th1 = cv.threshold(img1,150,255,cv.THRESH_BINARY)

#这种方法需要我们指定三个参数,返回值只有一个。
#• Adaptive Method- 指定计算阈值的方法。
#– cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值
#– cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。
#• Block Size - 邻域大小(用来计算阈值的区域大小)。
#• C - 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。
#11,23,8 为 Block size, 3,8 为 C 值
th2 = cv.adaptiveThreshold(img1,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,3)
th3 = cv.adaptiveThreshold(img1,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,23,8)
th4 = cv.adaptiveThreshold(img1,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,45,8)
titles = ['Original Image', 'img1','Global Thresholding (v=150)','Mean Thresholding', 'Gaussian Thresholding','Mean Thresholding']
images = [img,img1,th1,th2,th3,th4]

for i in range(6):
	#(2,3,i+1),2,3表示2*3个图像,因为不能从0开始,所以要i+1
	plt.subplot(2,3,i+1)
	#输出图像标题
	plt.title(titles[i])
	#输出图像
	plt.imshow(images[i],'gray')
	#x,y坐标不显示
	plt.xticks([]),plt.yticks([])
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值