OpenCV Python 图像阈值

OpenCV Python 图像阈值

在数字图像处理中,阈值处理是基于像素强度的阈值值创建二值图像的过程。阈值处理过程将前景像素与背景像素分开。

OpenCV提供了执行简单、自适应和Otsu阈值处理的函数。

在简单阈值处理中,所有值小于阈值的像素被设置为零,其余的像素被设置为最大像素值。这是阈值处理的最简单形式。

cv2.threshold()函数的定义如下。

cv2.threshold((src, thresh, maxval, type, dst)

参数

图像二值化的参数如下:

  • Src:输入数组。
  • Dst:相同大小的输出数组。
  • Thresh:阈值。
  • Maxval:最大值。
  • Type:二值化的类型。

二值化的类型

其他类型的二值化如下所示:

序号 类型 & 功能
1 cv.THRESH_BINARY dst(x,y) = maxval 如果 src(x,y)>thresh 否则为0
2 cv.THRESH_BINARY_INV dst(x,y)=0 如果 src(x,y)>thresh 否则为maxval
3 cv.THRESH_TRUNC dst(x,y)=threshold 如果 src(x,y)>thresh 否则为src(x,y)
4 cv.THRESH_TOZERO dst(x,y)=src(x,y) 如果 src(x,y)>thresh 否则为0
5 cv.THRESH_TOZERO_INV dst(x,y)=0 如果 src(x,y)>thresh 否则为src(x,y)

这些阈值类型根据以下图表对输入图像进行操作:

OpenCV Python 图像阈值

threshold()函数返回使用的阈值和阈值图像。

以下程序通过将阈值设置为127,从原始图像生成一个灰度值从255到0的渐变二进制图像。

示例

使用Matplotlib库将原始图像和结果阈值二进制图像并排绘制在一起。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('gradient.png',0)
ret,img1 = cv.threshold(img,127,255,cv.THRESH_BINARY)

plt.subplot(2,3,1),plt.imshow(img,'gray',vmin=0,vmax=255)
plt.title('Original')
plt.subplot(2,3,2),plt.imshow(img1,'gray',vmin=0,vmax=255)
plt.title('Binary')
plt.show()

输出

OpenCV Python 图像阈值

自适应阈值确定基于其周围的小区域的像素的阈值。所以,获得了同一图像不同区域的不同阈值。这对于光照变化的图像得到更好的结果。

cv2.adaptiveThreshold()方法接受以下输入参数:

cv.adaptiveThreshold( src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst] )

自适应方法具有以下枚举值:-

  • cv.ADAPTIVE_THRESH_MEAN_C − 阈值是邻域区域的均值减去常数C。

  • cv.ADAPTIVE_THRESH_GAUSSIAN_C − 阈值是邻域值的高斯加权和减去常数C。

示例

在下面的示例中,原始图像(messi.jpg)使用均值和高斯自适应阈值进行应用。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('messi.jpg',0)
img = cv.medianBlur(img,5)
th1 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,\
   cv.THRESH_BINARY,11,2)
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,\
   cv.THRESH_BINARY,11,2)
titles = ['Original', 'Mean Thresholding', 'Gaussian Thresholding']
images = [img, th1, th2]
for i in range(3):
   plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
   plt.title(titles[i])
   plt.xticks([]),plt.yticks([])
plt.show()

输出

使用matplotlib绘制原始和自适应阈值二值图像如下所示−

OpenCV Python 图像阈值

示例

OTSU算法会根据图像的直方图自动确定阈值。除了THRESH-BINARY标志,我们还需要传递cv.THRES_OTSU标志。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('messi.jpg',0)
# global thresholding
ret1,img1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
# Otsu's thresholding
ret2,img2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
plt.subplot(2,2,1),plt.imshow(img,'gray',vmin=0,vmax=255)
plt.title('Original')
plt.subplot(2,2,2),plt.imshow(img1,'gray')

plt.title('Binary')
plt.subplot(2,2,3),plt.imshow(img2,'gray')
plt.title('OTSU')
plt.show()

输出

matplotlib的绘图结果如下所示:

OpenCV Python 图像阈值

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程