Datawhale 計算機視覺基礎-圖像處理(上)-Task05 圖像分割/二值化

簡介

該部分的學習內容是對經典的閾值分割算法進行回顧,圖像閾值化分割是一種傳統的最常用的圖像分割方法,因其實現簡單、計算量小、性能較穩定而成爲圖像分割中最基本和應用最廣泛的分割技術。它特別適用於目標和背景佔據不同灰度級範圍的圖像。它不僅可以極大的壓縮數據量,而且也大大簡化了分析和處理步驟,因此在很多情況下,是進行圖像分析、特徵提取與模式識別之前的必要的圖像預處理過程。圖像閾值化的目的是要按照灰度級,對像素集合進行一個劃分,得到的每個子集形成一個與現實景物相對應的區域,各個區域內部具有一致的屬性,而相鄰區域不具有這種一致屬性。這樣的劃分可以通過從灰度級出發選取一個或多個閾值來實現。

學習目標

  • 瞭解閾值分割基本概念 、
  • 理解最大類間方差法(大津法)、自適應閾值分割的原理
  • 掌握OpenCV框架下上述閾值分割算法API的使用

內容

  1. 最大類間方差法、自適應閾值分割的原理
  2. OpenCV代碼實踐

算法理論介紹

最大類間方差法(大津閾值法)

大津法(OTSU)是一種確定圖像二值化分割閾值的算法,由日本學者大津於1979年提出。從大津法的原理上來講,該方法又稱作最大類間方差法,因爲按照大津法求得的閾值進行圖像二值化分割後,前景與背景圖像的類間方差最大。

它被認爲是圖像分割中閾值選取的最佳算法,計算簡單,不受圖像亮度和對比度的影響,因此在數字圖像處理上得到了廣泛的應用。它是按圖像的灰度特性,將圖像分成背景和前景兩部分。因方差是灰度分佈均勻性的一種度量,背景和前景之間的類間方差越大,說明構成圖像的兩部分的差別越大,當部分前景錯分爲背景或部分背景錯分爲前景都會導致兩部分差別變小。因此,使類間方差最大的分割意味着錯分概率最小。

應用: 是求圖像全局閾值的最佳方法,應用不言而喻,適用於大部分需要求圖像全局閾值的場合。

優點: 計算簡單快速,不受圖像亮度和對比度的影響。

缺點: 對圖像噪聲敏感;只能針對單一目標分割;當目標和背景大小比例懸殊、類間方差函數可能呈現雙峯或者多峯,這個時候效果不好。

原理非常簡單,涉及的知識點就是均值、方差等概念和一些公式推導。爲了便於理解,我們從目的入手,反推一下這著名的OTSU算法。

求類間方差:

OTSU算法的假設是存在閾值TH將圖像所有像素分爲兩類C1(小於TH)和C2(大於TH),則這兩類像素各自的均值就爲m1、m2,圖像全局均值爲mG。同時像素被分爲C1和C2類的概率分別爲p1、p2。因此就有:

根據原文,式(4)還可以進一步變形:

分割:
這個分割就是二值化,OpenCV給了以下幾種方式,可以參考:

自適應閾值

前面介紹了OTSU算法,但這算法屬於全局閾值法,所以對於某些光照不均的圖像,這種全局閾值分割的方法會顯得蒼白無力,如下圖:

在這裏插入圖片描述

顯然,這樣的閾值處理結果不是我們想要的,那麼就需要一種方法來應對這樣的情況。

這種辦法就是自適應閾值法(adaptiveThreshold),它的思想不是計算全局圖像的閾值,而是根據圖像不同區域亮度分佈,計算其局部閾值,所以對於圖像不同區域,能夠自適應計算不同的閾值,因此被稱爲自適應閾值法。(其實就是局部閾值法)

如何確定局部閾值呢?可以計算某個鄰域(局部)的均值、中值、高斯加權平均(高斯濾波)來確定閾值。值得說明的是:如果用局部的均值作爲局部的閾值,就是常說的移動平均法。

基於OpenCV的實現

原圖
在這裏插入圖片描述

1、大津閾值

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('./task5/sudu.png',0)
# Otsu閾值
ret2,th2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)

cv.imshow("otsu",th2)
cv.waitKey()

在這裏插入圖片描述

2、自適應閾值

# blockSize:確定附近區域的大小,可取3, 5, 7,……
# C是從鄰域像素的平均或加權總和中減去的一個常數
dst = cv.adaptiveThreshold(img, 200, adaptiveMethod=cv.ADAPTIVE_THRESH_MEAN_C, 
                                thresholdType=cv.THRESH_BINARY, blockSize=7, C=5) 
,
cv.imshow("otsu",dst)
cv.waitKey()

在這裏插入圖片描述

opencv文檔
博客:https://blog.csdn.net/weixin_40647819/article/details/90179953
https://blog.csdn.net/weixin_40647819/article/details/90213858

python版本:
opencv python教程
opencv 中文文檔
adaptiveThreshold

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章