资讯专栏INFORMATION COLUMN

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

luoyibu / 3255人阅读

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

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

相关文章

  • 用JavaScript来计算两个图像的相似度

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

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

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

    Gu_Yan 评论0 收藏0

发表评论

0条评论

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