Python+opencv:(5)图像的阈值处理

(5)图像的阈值处理

import cv2                              # opencv读取的格式是BGR
# import matplotlib.pyplot as plt         # Matplotlib是RGB
import numpy as np
import time

#  .........................二值化处理............................
# if 像素值 <= 阈值: 像素值 = 0
# if 像素值 > 阈值: 像素值 = 最大值
# 阈值在125~150取值的效果最好,通常二值化处理是使用255作为最大值,因为灰度图像中255表示纯白色,能够很清晰地与纯黑色进行区分,
# img = cv2.imread('1.jpeg')
# gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray_img = cv2.imread('C:/Users/SW01/Desktop/test/t3.jpeg', 0)  # 直接读取黑白渐变图图像为灰度图像

# 1.不同阈值,结果黑白长短变化
t1, dst1 = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)  # 二值化阈值处理,t1为处理时采用的阈值。
t2, dst2 = cv2.threshold(gray_img, 210, 255, cv2.THRESH_BINARY)  # 二值化阈值处理
# cv2.imshow('dst1', dst1)
# cv2.imshow('dst2', dst2)

# 2.不同最大值,结果白色端变为灰色150
t3, dst3 = cv2.threshold(gray_img, 127, 150, cv2.THRESH_BINARY)
# cv2.imshow('dst1', dst1)
# cv2.imshow('dst3', dst3)


#  .........................反二值化处理............................
# if 像素值 <= 阈值: 像素值 = 最大值
# if 像素值 > 阈值: 像素值 = 0
t4, dst4 = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY_INV)  # 黑白端互换
# cv2.imshow('dst1', dst1)
# cv2.imshow('dst4', dst4)


#  .........................零处理............................
# 1.低于阈值零处理
# if 像素值 <= 阈值: 像素值 = 0
# if 像素值 > 阈值: 像素值 = 原值
# 图像经过低于阈值零处理后,颜色深的位置会彻底变黑,颜色浅的位置不受影响
t5, dst5 = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TOZERO)  # 黑端全黑,白端保持渐变
# cv2.imshow('dst1', dst1)
# cv2.imshow('dst5', dst5)

# 2.高于阈值零处理
# if 像素值 <= 阈值: 像素值 = 原值
# if 像素值 > 阈值: 像素值 = 0
# 图像经过超出阈值零处理后浅颜色区域彻底变黑,深颜色区域则不受影响。但彩色图像经过超出阈值零处理后,浅颜色区域的颜色分量取相反的极值,也呈现出一种“混乱”的效果
t6, dst6 = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TOZERO_INV)  # 白端全黑,黑端保持渐变
# cv2.imshow('dst1', dst1)
# cv2.imshow('dst6', dst6)


#  .........................截断处理............................
# if 像素 <= 阈值: 像素 = 原值
# if 像素 > 阈值: 像素 = 阈值
# 图像经过截断处理后,整体颜色都会变暗。彩色图像经过截断处理后,在降低亮度的同时还会让浅颜色区域的颜色变得更浅,
t7, dst7 = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TRUNC)  # 白端灰色,黑端保持渐变
# cv2.imshow('dst1', dst1)
# cv2.imshow('dst7', dst7)


#  .........................自适应处理............................
# 1.使用常用的5种阈值处理类型对色彩不均衡的图像进行处理。
img_gray = cv2.imread('1.jpeg', 0)  # 直接读取彩色图图像为灰度图像
t21, dst21 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
t22, dst22 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
t23, dst23 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
t24, dst24 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)
t25, dst25 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
# cv2.imshow('dst21', dst21)
# cv2.imshow('dst22', dst22)
# cv2.imshow('dst23', dst23)
# cv2.imshow('dst24', dst24)
# cv2.imshow('dst25', dst25)  # 使用截断处理的效果是5种阈值处理类型中效果比较好的,但是有些轮廓依然模糊不清

# 2.自适应处理
# 图像中的不同区域使用不同的阈值。把这种改进的阈值处理技术称作自适应阈值处理也称自适应处理
# 自适应处理能更好地处理明暗分布不均的图像,获得更简单的图像效果。

# 使用cv2.ADAPTIVE_THRESH_MEAN_C自适应阈值算法。5指的是5×5的区域。3为常量,阈值等于均值或者加权值减去这个常量
athdMEAM = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)
# 使用cv2.ADAPTIVE_THRESH_GAUSSIAN_C自适应阈值算法。5指的是5×5的区域。3为常量,阈值等于均值或者加权值减去这个常量
athdGAUS = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 3)
# cv2.imshow('athdMEAM', athdMEAM)
# cv2.imshow('athdGAUS', athdGAUS)

# 3.Otsu方法
# Otsu方法能够遍历所有可能的阈值,从中找到最合适的阈值。
# Otsu方法的语法与threshold()方法的语法基本一致,只不过在为type传递参数时,要多传递一个参数,即cv2.THRESH_OTSU

# t31为由Otsu方法计算得到并使用的最合适的阈值。阈值必须为0。选择一种阈值处理类型外,还要多传递一个参数。
t31, dst31 = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# print(t31)
cv2.putText(dst31, "best threshold:" + str(t31), (200, 300), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2)  # 绘出最优阈值
cv2.imshow('dst21', dst21)
cv2.imshow('dst31', dst31)




cv2.waitKey()
cv2.destroyAllWindows()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值