Opencv3学习笔记(C++&Python双语)---阈值化操作

理论描述参考教程《学习opencv3》

图像处理过程中经常会遇见这种情况:我们已经完成了多层处理步骤并需要做出一个最终决定,或者将高于或低于某一值的像素置零同时其他的像素保持不变。OpenCV 中的函数cv: :threshold() 实现了这些功能 ,其原理是对于数组中每个值,根据其高于或低于这个阙值做出相应的处理,给定一个数组和阙值。根据个人喜好,也可以把阀值化操作理解成一个用1 x 1 的核进行卷积,对每个像素进行一次非线性操作。随着我们继续学习本章,在接触了其他史复杂的卷积操作之后,这个观点的效果将非常清楚。计算机视觉领域中的很多方法都可以解释为一系列卷积运算,最后一次操作通常是阈值化处理。

cv.threshold() 这个函数的第一个参数就是原图像,原图像应该是灰度图。第二个参数就是用来对像素值进行分类的阀值,第三个参数就是当像素值高于(或者小于)阀值时,应该被赋予新的像素值。OpenCV提供了多种不同的阀值方法,这是有第四个参数来决定的。函数有两个返回值,使用Otsu’s算法时,第一个返回值是阈值,第二个返回值就是阈值操作后的图像。

Opencv3学习笔记(C++&Python双语)---阈值化操作_第1张图片

 Opencv3学习笔记(C++&Python双语)---阈值化操作_第2张图片

 

Opencv3学习笔记(C++&Python双语)---阈值化操作_第3张图片

在实际情况下改如何确定预知呢,Otsu’s算法可以自动确定最优阈值。

Opencv3学习笔记(C++&Python双语)---阈值化操作_第4张图片

 与cv.threshold()函数不同,cv.adaptiveThreshold()在整个过程中,阈值可以自动变化。相对于一般的阙值化操作,当图像中出现较大的明暗差异时,自适应阙值是非常有效的。这个函数仅处理单通道8位或浮点型图像,并且要求源图像和目标图像不同。

python代码

cv.threshold()函数

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
%matplotlib qt5

src = cv.imread("F:\\L-opencv3\\picture\\lena.jpg")
img = cv.cvtColor(src,cv.COLOR_BGR2GRAY)

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):
    plt.subplot(2,3,i+1)
    plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([])
    plt.yticks([])
plt.show()

 输出阈值化处理过的图像效果:

Opencv3学习笔记(C++&Python双语)---阈值化操作_第5张图片

cv.adaptiveThreshold()函数

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
%matplotlib qt5

src = cv.imread("F:\\L-opencv3\\picture\\lena.jpg")
img = cv.cvtColor(src,cv.COLOR_BGR2GRAY)

ret,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,2)
th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,11,2)
titles = ['original image' , 'global thresholding (v=127)','Adaptive mean thresholding',
          'adaptive gaussian thresholding']
images = [img,th1,th2,th3]

for i in range(4):
    plt.subplot(2,2,i+1)
    plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([])
    plt.yticks([])
    
plt.show()

 自适应阈值处理后的图像效果:

Opencv3学习笔记(C++&Python双语)---阈值化操作_第6张图片

 cv.threshold()函数使用Otsu算法自动决定最优阈值

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
%matplotlib qt5

src = cv.imread("F:\\L-opencv3\\picture\\lena.jpg")
img = cv.cvtColor(src,cv.COLOR_BGR2GRAY)

ret1,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
ret2,th2 = cv.threshold(img,127,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
#(5,5)为高斯核的大小,0为标准差
blur = cv.GaussianBlur(img,(5,5),0)
#阀值一定要设为0
ret3,th3 = cv.threshold(blur,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)

images=[img,0,th1,
         img,0,th2,
         img,0,th3]
titles =['original noisy image','histogram','global thresholding(v=127)',
          'original noisy image','histogram',"otsu's thresholding",
          'gaussian giltered image','histogram',"otus's thresholding"]

for i in range(3):
    plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
    plt.title(titles[i*3]),plt.xticks([]),plt.yticks([])
    plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
    plt.title(titles[i*3+1]),plt.xticks([]),plt.yticks([])
    plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
    plt.title(titles[i*3+2]),plt.xticks([]),plt.yticks([])
    
plt.show()

Otsu算法最优阈值处理过的图像效果:

Opencv3学习笔记(C++&Python双语)---阈值化操作_第7张图片

你可能感兴趣的:(opencv,python,计算机视觉,深度学习)