当前位置 : 主页 > 编程语言 > python >

python opencv 图像处理(六)

来源:互联网 收集:自由互联 发布时间:2022-06-24
图像的阈值处理 图像的阈值 图像的阈值处理用大白话讲就是将图像转化为二值图像(黑白图),目的是用来提取图像中的目标物体,将背景和噪声区分开(可以近似的认为除了目标全

图像的阈值处理

图像的阈值

图像的阈值处理用大白话讲就是将图像转化为二值图像(黑白图),目的是用来提取图像中的目标物体,将背景和噪声区分开(可以近似的认为除了目标全是噪声)。

通常会设定一个阈值 T ,通过 T 将图像的像素划分为两类:大于 T 的像素群和小于 T 的像素群。

首先可以先将图像转化为灰度图像,因为在灰度图像中,每个像素都只有一个灰度值用来表示当前像素的亮度。
接下来二值化处理可以将图像中的像素划分为两类颜色,一种是大于阈值 T 的,另一种是小于阈值 T 的。
比如最常见的二值图像:
当灰度值小于阈值 T 的时候,可以将其像素设置为 0 ,表示为黑色。
当灰度值大于阈值 T 的时候,可以将其像素设置为 255 ,表示为白色。
在 OpenCV 中,为我们提供了阈值函数 threshold() 来帮助我们实现二值图像的处理。
函数如下:

retval, dst = threshold(src, thresh, maxval, type, dst=None)
  • retval: 阈值
  • dst: 处理后的图像
  • src: 原图像
  • thresh: 阈值
  • maxval: 最大值
  • type: 处理类型

常用的 5 中处理类型如下:

  • cv.THRESH_BINARY: 二值处理
  • cv.THRESH_BINARY_INV: 反二值处理
  • cv.THRESH_TRUNC:截断阈值化
  • cv.THRESH_TOZERO: 阈值化为 0
  • cv.THRESH_TOZERO_INV: 反阈值化为 0

处理类型详细代码实现如下:

二值化处理

这种二值处理方式最开始需要选定一个阈值 T ,从 0 ~ 255 之间,我这里选择出于中间的那个数 127 。

接下来的处理规则就是这样的:

大于等于 127 的像素点的灰度值设定为最大值,也就是 255 白色
小于 127 的像素点的灰度值设定为 0 ,也就是黑色

import cv2 as cv

src = cv.imread("data.jpg")

# BGR 图像转灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

# 二值图像处理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY)

# 显示图像
cv.imshow("src", src)
cv.imshow("result", b)

# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()

python opencv 图像处理(六)_灰度值

反二值化处理

这种方式和上面的二值处理非常相似,只是把处理规则给反了一下:

大于等于 127 的像素点的灰度值设定为 0 ,也就是白色
小于 127 的像素点的灰度值设定为最大值,也就是 255 白色
完整代码如下:

import cv2 as cv

src = cv.imread("data.jpg")

# BGR 图像转灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

# 二值图像处理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY_INV)

# 显示图像
cv.imshow("src", src)
cv.imshow("result", b)

# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()

python opencv 图像处理(六)_计算机视觉_02

截断阈值化

这种方法还是需要先选定一个阈值 T ,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。

完整代码如下:

import cv2 as cv

src = cv.imread("data.jpg")

# BGR 图像转灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

# 二值图像处理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_TRUNC)

# 显示图像
cv.imshow("src", src)
cv.imshow("result", b)

# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()

python opencv 图像处理(六)_像素点_03

阈值化为0

这种方式还是需要先选定一个阈值 T ,将小于 T 的像素点设置为 0 黑色,其他的保持不变。

完整代码如下:

import cv2 as cv

src = cv.imread("data.jpg")

# BGR 图像转灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

# 二值图像处理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO)

# 显示图像
cv.imshow("src", src)
cv.imshow("result", b)

# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()

python opencv 图像处理(六)_二值图像_04

反阈值化为0

这个和前面的反二值图像很像,同样是反阈值化为 0 ,将大于等于 T 的像素点变为 0 ,其余保持不变。

完整代码如下:

import cv2 as cv

src = cv.imread("data.jpg")

# BGR 图像转灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

# 二值图像处理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO_INV)

# 显示图像
cv.imshow("src", src)
cv.imshow("result", b)

# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()

python opencv 图像处理(六)_二值图像_05


上一篇:python opencv图像处理(五)
下一篇:没有了
网友评论