资讯专栏INFORMATION COLUMN

opencv python 图像二值化/简单阈值化/大津阈值法

luoyibu / 3048人阅读

摘要:对于非双峰图像,二值化不准确。如果未使用阈值法,则与之前使用的阈值相同在第一种情况下,将全局阈值应用为值在第二种情况下,直接应用了的阈值在第三种情况下,使用高斯内核过滤图像以消除噪声,然后应用阈值处理代码

Image Thresholding

1简单的阈值化

cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表示如果像素值大于(有时小于)阈值则要给出的值. OpenCV提供不同类型的阈值,它由函数的第四个参数决定. 不同的类型是:

cv2.THRESH_BINARY 如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,dst(x,y)=0
cv.THRESH_BINARY_INV 如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value
cv.THRESH_TRUNC 如果 src(x,y)>threshold,dst(x,y) = max_value; 否则dst(x,y) = src(x,y)
cv.THRESH_TOZERO 如果src(x,y)>threshold,dst(x,y) = src(x,y) ; 否则 dst(x,y) = 0
cv.THRESH_TOZERO_INV 如果 src(x,y)>threshold,dst(x,y) = 0 ; 否则dst(x,y) = src(x,y)

代码

import cv2
import numpy as np
import matplotlib.pylab  as plt

img = cv2.imread("img.jpg",0)
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(img,127,255,cv2.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()

2自适应阈值化

图像在不同区域具有不同照明条件时,应进行自适应阈值处理.因此,我们为同一图像的不同区域获得不同的阈值,并且它为具有不同照明的图像提供了更好的结果.
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])
adaptiveMethod:决定如何计算阈值

cv2.ADAPTIVE_THRESH_MEAN_C:阈值是邻域的平均值

cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域值的加权和,其中权重是高斯窗口

blockSize:决定了邻域的大小
C:从计算的平均值或加权平均值中减去的常数

代码

import cv2
import numpy as np
import matplotlib.pylab  as plt

img = cv2.imread("img.jpg",0)
img = cv2.medianBlur(img,5)

ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,
            cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
            cv2.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()

[lz是密集恐惧症,有点不忍直视……]

3 大津阈值法

根据双峰图像的图像直方图自动计算阈值。 (对于非双峰图像,二值化不准确。)

使用cv.threshold()但是传递了一个额外的标志v.THRESH_OTSU.对于阈值,只需传递零.然后算法找到最佳阈值并返回为第二个输出retVal。如果未使用Otsu阈值法,则retVal与之前使用的阈值相同.

在第一种情况下,将全局阈值应用为值127.在第二种情况下,直接应用了Otsu的阈值.在第三种情况下,使用5x5高斯内核过滤图像以消除噪声,然后应用Otsu阈值处理.
代码

import cv2
import numpy as np
import matplotlib.pylab  as plt

img = cv2.imread("img.jpg",0)
# global thresholding
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)

# Otsu"s thresholding
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# Otsu"s thresholding after Gaussian filtering
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# plot all the images and their histograms
images = [img, 0, th1,
          img, 0, th2,
          blur, 0, th3]
titles = ["Original Noisy Image","Histogram","Global Thresholding (v=127)",
          "Original Noisy Image","Histogram","Otsu"s Thresholding",
          "Gaussian filtered Image","Histogram","Otsu"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()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41990.html

相关文章

  • 2021-09-23 opencv学习笔记(图像变换,,滤波器介绍及python实现)

    摘要:但是考虑一个双峰图像简单来说,双峰图像是一个直方图有两个峰值的图像。对于非双峰图像,二值化将不准确。在第三种情况下,我使用高斯核过滤图像以去除噪声,然后应用阈值。 ...

    CloudDeveloper 评论0 收藏0
  • OpenCV-自适应阈值函数cv::adaptiveThreshold

    摘要:类型的,输出图像。类型的,自适应阈值算法类型。为均值法获取阈值,为高斯窗加权和获取阈值。类型的,窗口的大小,只能为奇数。类型的,自适应阈值算法得到平均值或加权平均值后,再减的常数值。 作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 函数...

    fuchenxuan 评论0 收藏0
  • 用JavaScript来计算两个图像的相似度

    摘要:最近看了阮一峰老师的相似图片搜索的原理二,其中介绍了通过内容特征法来对比两个图片的相似性。不知道是不是哪步出错了,感觉用这个方法计算出来的结果并不理想 最近看了阮一峰老师的相似图片搜索的原理(二),其中介绍了通过内容特征法来对比两个图片的相似性。 大致步骤: 把图片都缩放到50x50大小 转成灰度图片 利用大津法(Otsus method)确定阈值 通过阈值再对图片进行二值化 对比两...

    Leck1e 评论0 收藏0
  • 使用PythonOpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制

    摘要:使用,进行基本的图像处理提取红色圆圈轮廓并绘制效果图源码写这篇博客源于博友的提问,想提取图片中的红色圆圈坐标,并绘制封闭的轮廓。还是使用一系列图像处理,得到了比较理想的结果。 ...

    Gu_Yan 评论0 收藏0
  • 五、自适应阈值与轮廓检测应用实例——细胞计数统计

    摘要:在之前二值化处理代码基础上增加轮廓检测代码注意函数会原地修改输入的图像。我们主要用到第一个返回值该参数是一个中每个元素都是图像中的一个轮廓用中的表示。通过前面三图像的预处理二值化与自适应阈值的章节学习我们想到了采用自适应阈值来处理。 ...

    番茄西红柿 评论0 收藏2637

发表评论

0条评论

最新活动
阅读需要支付1元查看
<