圖像二值化,閾值處理(十)


圖像二值化:基於圖像的直方圖來實現的,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()

 

效果展示

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM