图像二值化,阈值处理(十)

图像二值化:基于图像的直方图来实现的,0白色 1黑色

 

一 二值化

  定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。

   一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。

 

二 阈值处理函数

  Python-OpenCV中提供了阈值(threshold)函数

threshold(src, thresh, maxval, type, dst=None)

函数:第一个参数       src            指原图像,原图像应该是灰度图。

          第二个参数         x              指用来对像素值进行分类的阈值。

          第三个参数         y              指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值

          第四个参数     Methods     

 

method阈值类型一般分为五种: 

  • cv2.THRESH_BINARY——大于阈值的部分像素值变为最大值,其他变为0 
  • cv2.THRESH_BINARY_INV——大于阈值的部分变为0,其他部分变为最大值 
  • cv2.THRESH_TRUNC——大于阈值的部分变为阈值,其余部分不变 
  • cv2.THRESH_TOZERO——大于阈值的部分不变,其余部分变为0 
  • cv2.THRESH_TOZERO_INV——大于阈值的部分变为0,其余部分不变

 

三 全局阈值实例

 

import cv2 as cv
import numpy as np

# 全局阈值
def threshold_image(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    cv.imshow("原来", gray)

    # 大律法,全局自适应阈值 参数0可改为任意数字但不起作用
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    print("yuzhi:%s" % ret)
    cv.imshow("OTSU", binary)

    # TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰
    ret, binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
    print("yuzhi:%s" % ret)
    cv.imshow("TRIANGLE", binary)

    # 自定义阈值为150,大于150的是白色 小于的是黑色
    ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY)
    print("yuzhi:%s" % ret)
    cv.imshow("define_yuzhi", binary)

    # 自定义阈值为150,大于150的是黑色 小于的是白色
    ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY_INV)
    print("yuzhi:%s" % ret)
    cv.imshow("define_rev", binary)

    # 截断 大于150的是改为150  小于150的保留
    ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TRUNC)
    print("yuzhi:%s" % ret)
    cv.imshow("jieduan1", binary)

    # 截断 小于150的是改为150  大于150的保留
    ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TOZERO)
    print("yuzhi:%s" % ret)
    cv.imshow("jieduan2", binary)


src = cv.imread("yiner.jpg")
threshold_image(src)
cv.waitKey(0)
cv.destroyAllWindows()

 

函数threshold()的参数说明:

#大律法,全局自适应阈值 参数0可改为任意数字但不起作用   
 cv.THRESH_BINARY | cv.THRESH_OTSU 

 #TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰
 cv.THRESH_BINARY | cv.THRESH_TRIANGLE

 # 自定义阈值为150,大于150的是白色 小于的是黑色
  cv.THRESH_BINARY

# 自定义阈值为150,大于150的是黑色 小于的是白色
  cv.THRESH_BINARY_INV 

# 截断 大于150的是改为150  小于150的保留
   cv.THRESH_TRUNC 

# 截断 小于150的是改为150  大于150的保留
   cv.THRESH_TOZERO 

 

 

对应的阈值

 

 

 

四 局部阈值处理

1 函数

adaptiveThreshold(  src, 
maxValue,
adaptiveMethod,
thresholdType,
blockSize,
C,
dst=None)

 

2 参数解说.

  • 第一个src:原始图像
  • 第二个maxValue:像素值上限
  • 第三个自适应方法adaptiveMethod:

    — cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值

    —cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权 重为一个高斯窗口

  • 第四个值的赋值方法:

    只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV

  • 第五个blockSize
      规定领域大小(一个正方形的领域)
  • 第六个常数C,

    阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)

  这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图像都用一个阈值。

 

3 演示代码

import cv2 as cv
import numpy as np

#局部阈值
def local_yuzhi(image):
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    cv.imshow('gray',gray)

    # ADAPTIVE_THRESH_MEAN_C 领域内均值
    binary1=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,25,10)
    cv.imshow('local1',binary1)

    # ADAPTIVE_THRESH_GAUSSIAN_C 领域内像素点加权和,权重为一个高斯窗口
    binary2=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10)
    cv.imshow('local2',binary2)

src = cv.imread("ying.jpg")
local_yuzhi(src)
cv.waitKey(0)
cv.destroyAllWindows()

 

效果展示

 


posted @ 2019-07-15 10:34  柳帅  阅读(14555)  评论(1编辑  收藏  举报
//替换成自己路径的js文件