电脑基础 · 2023年4月19日

基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】

基于梵·高《向日葵》的图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】

文章目录

  • 🍹1. 什么是阈值处理?
  • 🍹2.二值化处理 与 反二值化处理
  • 🍹3. 零处理
  • 🍹4. 截断处理
  • 🍹5.五种处理方式汇总
  • 🍹6. 自适应处理
  • 平均法 cv2.ADAPTIVE_THRESH_MEAN_C
  • 高斯法 cv2.ADAPTIVE_THRESH_GAUSSIAN_C
  • 🍹7. Otsu方法

ʚʕ̯•͡˔•̯᷅ʔɞ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ

🍹欢迎各路大佬来到小啾主页指点
☀️本期文章将学习基于梵·高《向日葵》的图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法) - Open_CV系列博文第六篇,我是博主侯小啾。✨
我的博客主页:云雀编程小窝 🌹꧔ꦿ
🌹꧔ꦿ博文内容如对您有所帮助,还请给个点赞 + 关注 + 收藏

            基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】


如有疑问欢迎随时在评论区交流。🍹


🍹1. 什么是阈值处理?

在图像处理中,阈值处理是一种很重要的处理方式。阈值处理即给像素值设定一个阈值,然后所有的像素值都与目标阈值进行比较,根据像素值与阈值的关系,对像素值做出相应的调整,以达到影响图片的效果的预期。在计算机视觉技术中心,阈值处理十分重要,像素在经过阈值处理后,对肉眼观感可能不会太好,但是对程序而言图片上的人或物则通常更容易被搜寻到特征,以被识别出。从而实现识别的目的。

阈值处理常用的方法:threshold()方法。
✨其语法如下:

threshold(src, thresh, maxval, type, dst=None)

  • src: 原图
  • thresh: 阈值
  • maxval: 阈值处理采用的最大值,通常选择255作为最大值,即白色。
  • type: 阈值处理类型。

                       常用的阈值处理类型

类型 含义
cv2.THRESH_BINARY 二值化阈值处理
cv2.THRESH_BINARY_INY 反二值化阈值处理
cv2.THRESH_TOZERO 低于阈值零处理
cv2.THRESH_TOZERO_INV 超出阈值零处理
cv2.THRESH_TRUNC 截断阈值处理

🍹2.二值化处理 与 反二值化处理

二值化处理,也称二值化阈值处理,该处理使每个像素值与指定的阈值相比较,大于阈值的像素变为最大值,小于阈值的像素值变为零。最终可以使像素只保留两种像素值,得到“非黑即白”的图像(不同与灰度处理)。


反二值化处理的处理结果与二值化处理相反,得到的也是只有黑白两种颜色的图像,不同之处在于大于阈值的像素值变为0,小于阈值的变为阈值处理采用的最大值。

下面,对二值化处理的方式进行示例,

选择图片素材:
                 梵高 《向日葵》

           基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】

以127作为阈值,255为阈值处理最大值为例,读取图像时,需要先将图像转化为灰度图像。

import cv2
# 将图像读成灰度图像
img = cv2.imread("sunflowers.jpg", 0)
# 做二值化处理
t, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 其中返回的t即我们选择的阈值127。
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

处理效果:

           基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】

👇同理,再对《向日葵》做反二值化处理

import cv2
img = cv2.imread("sunflowers.jpg", 0)
# 反二值化阈值处理
t, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

           基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】


🍹3. 零处理

零处理包括 低于阈值零处理 超出阈值零处理(也称低阈值零处理和高阈值零处理)。低于阈值零处理将低于阈值的像素值变为0,超出阈值零处理则将高于阈值的像素值变为0。

import cv2
img = cv2.imread("sunflowers.jpg", 0)
# 低于阈值零处理
t, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

           基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】

import cv2
img = cv2.imread("sunflowers.jpg", 0)
# 超出阈值零处理
t, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

👇超阈值零处理效果呈现:
           基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】


🍹4. 截断处理

截断处理也称截断阈值处理,将大于阈值的像素值变成跟阈值一样,小于阈值的像素值则保持不变。

截断处理后图像的整体颜色会变暗,亮度降低,原本浅色区域的颜色会变更浅。

代码示例如下:

import cv2
# 将图像读成灰度图像
img = cv2.imread("sunflowers.jpg", 0)
# 截断处理
t, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

           基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】


🍹5.五种处理方式汇总

👇将以上五种阈值处理方式汇总对比其效果:

import cv2
image = cv2.imread(""sunflowers.jpg".jpg")
# 因为原图尺寸过大,不方便展示,所以先缩放一倍。
image = cv2.resize(image, None, fx=0.5, fy=0.5)
# 转化为灰度图像
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
print(image_Gray.shape)
# 二值化阈值处理
t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY)
# 反二值化阈值处理
t2, dst2 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY_INV)
# 低于阈值零处理
t3, dst3 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TOZERO)
# 超出阈值零处理
t4, dst4 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TOZERO_INV)
# 截断处理
t5, dst5 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TRUNC)
# 分别显示经过5种阈值类型处理后的图像
cv2.imshow("BINARY", dst1)
cv2.imshow("BINARY_INV", dst2)
cv2.imshow("TOZERO", dst3)
cv2.imshow("TOZERO_INV", dst4)
cv2.imshow("TRUNC", dst5)
cv2.waitKey()
cv2.destroyAllWindows()

基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】

这五种阈值处理的方法,的处理出的图像轮廓多少还是会有些模糊不清,不利于程序做进一步的处理。使用自适应处理可以有效改善该问题。


🍹6. 自适应处理

  自适应处理是一种改进过的阈值处理技术,其阈值是对图像区域中的某一正方形区域内的所有色素值使用指定的算法而得到的,从而而对像素进行相应的处理。自适应处理本身不属于阈值处理方法,算是对阈值处理的改进,其使用过程中可以选择使用二值化处理或反二值化处理的处理方式。

OpenCV中,做自适应处理使用的是cv2.adaptiveThreshold方法,
该方法语法如下

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

其中,
adaptiveMethod 是自适应阈值的计算方法,该方法有两种,

  • cv2.ADAPTIVE_THRESH_MEAN_C : 对一个正方形区域内的所有像素进行平均加权。
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C : 根据高斯函数按照像素与中心店的距离对一个正方形区域内的所有像素进行加权计算。

thresholdType 即阈值处理类型。可以是二值化处理(cv2.THRESH_BINARY)或反二值化处理(cv2.THRESH_BINARY_INY)。

blockSize 计算阈值算法中的正方形区域的边长大小。

C 常量 最终的阈值等于均值减去这个常量 或 加权值减去这个常量

dst 经过阈值处理后的图像。

下边分别使用两种阈值计算方法对图片进行自适应处理,两种方法得到的结果有一定的细微差异。


平均法 cv2.ADAPTIVE_THRESH_MEAN_C

import cv2
image = cv2.imread("sunflowers.jpg")
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
athdMEAM = cv2.adaptiveThreshold(image_Gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)
cv2.imshow("MEAN_C", athdMEAM)
cv2.waitKey()
cv2.destroyAllWindows()

              基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】

高斯法 cv2.ADAPTIVE_THRESH_GAUSSIAN_C

import cv2
image = cv2.imread("sunflowers.jpg")
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
athdGAUS = cv2.adaptiveThreshold(image_Gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 3)
cv2.imshow("GAUSSIAN_C", athdGAUS)
cv2.waitKey()
cv2.destroyAllWindows()

            基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】


🍹7. Otsu方法

除了自适应处理外,Opencv还提供了Otsu方法来遍历所有可能的阈值,从而得出最合适的阈值。

Ostu方法不是独立的函数方法,其实现基于上边实现五种阈值处理的threshold() 方法,只是需要在其阈值处理类型参数type后方 续写上 + cv2.THRESH_OTSU 字样(非字符串)。

👇示例如下,依然操作向日葵:

import cv2
image = cv2.imread("sunflowers.jpg")
# 灰度处理
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# t=127的二值化处理
t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY)
# OTSU的二值化处理
t2, dst2 = cv2.threshold(image_Gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 打印最佳阈值
print(t2)
cv2.imshow("BINARY", dst1)
cv2.imshow("OTSU", dst2)
cv2.waitKey()
cv2.destroyAllWindows()

程序执行结果如下:
         基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】

👇程序执行效果如下,左图为阈值为127时的二值化处理结果,右图为阈值最佳时的二值化处理结果,此时阈值为147.0。可以看出,右图中的向日葵的轮廓明显要比左图相对更为清晰。
基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】



本次分享就到这里,如果您有更棒的理解或者技术方案,或是疑问,欢迎随时在评论区分享或交流!我们下期blog见。
🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ


🌹꧔ꦿ本系列blog传送门:

✨OpenCV图像处理基本操作 【Python-Open_CV系列(一)】

✨OpenCV像素处理基本操作 【Python-Open_CV系列(二)】

✨OpenCV之 BGR、GRAY、HSV色彩空间&色彩通道专题 【Python-Open_CV系列(三)】

✨OpenCV绘制图像与文字(可作为脚手架代码)(python) 【Python-Open_CV系列(四)】

✨OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

✨基于梵·高《向日葵》的 图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】

✨OpenCV基本功 之 图像的掩模、运算 & 合并专题 -小啾带学【Python-Open_CV系列(七)】

✨《三英战吕布》 - 图像模板匹配 【Python-Open_CV系列(八)】

✨OpenCV滤波器 龙门石窟篇【Python-Open_CV系列(九)】(均值滤波器、中值滤波器、高斯滤波器、双边滤波器)

✨Open_CV形态学运算专题 (腐蚀&膨胀、开&闭运算、梯度运算、顶帽运算黑帽运算 )【Python-Open_CV系列(十)】

✨霍夫变换看不懂?小啾带你串一遍:OpenCV图形检测专题 这样学最简单【Python-Open_CV系列(十一)】

✨小啾带你开天眼 之 开启py-OpenCV摄像头及视频处理【Python-Open_CV系列(十二)】

✨小啾带你开天眼 之 人脸检测与识别(以及华强、皇叔、高祖配墨镜特效)【Python-Open_CV系列(十三)】