OTSU閾值分割
單閾值OTSU演算法
https://zhuanlan.zhihu.com/p/124944108
OTSU演算法(大津演算法)的詳細步驟:
- 假設初始有個閾值 T 0 T_0 T0,並將影像分為兩個部分(閾值分割),前景F和背景B。
- 假設畫素的總個數為N,前景畫素個數為 N f N_f Nf,背景畫素個數為 N b N_b Nb;
- 假設影像的總灰度級為
L
−
1
L-1
L−1,每個灰度級的畫素個數為
N
i
N_i
Ni,那麼滿足如下的公式:
P f = ∑ i = 0 i = T 0 N i N P_f = \sum ^{i=T_0} _{i=0} \frac {N_i}{N} Pf=i=0∑i=T0NNi
P b = ∑ i = T 0 i = L − 1 N i N P_b = \sum ^{i=L-1} _{i=T_0} \frac {N_i}{N} Pb=i=T0∑i=L−1NNi - 前景和背景的灰度平均值分別為:
M f = ∑ i = 0 i = T 0 i ∗ P i P f M_f = \sum ^{i=T_0} _{i=0} i * \frac {P_i}{P_f} Mf=i=0∑i=T0i∗PfPi
M b = ∑ i = T 0 i = L − 1 i ∗ P i P b M_b = \sum ^{i=L-1} _{i=T_0} i * \frac {P_i}{P_b} Mb=i=T0∑i=L−1i∗PbPi - 整個影像的灰度平均值為:
M = P f ∗ M f + P b ∗ M b M = P_f * M_f + P_b * M_b M=Pf∗Mf+Pb∗Mb - 那麼,前景和背景之間的類間方差為:
δ 2 = P f ∗ ( M f − M ) 2 + P b ∗ ( M b − M ) 2 \delta ^2 = P_f * (M_f - M)^2 + P_b * (M_b - M)^2 δ2=Pf∗(Mf−M)2+Pb∗(Mb−M)2 - 大津演算法的目的就是求得一個閾值,使得第六步的類間方差最大。
- 至於怎麼求解,可以用遍歷的方法,或者採用其他優化演算法,找出那個類間方差最大的閾值來分割即可。
https://zhuanlan.zhihu.com/p/95034826
g:類間方差(那個灰度的g最大,那個灰度就是需要的閾值t)
g
=
w
0
∗
(
u
0
−
u
)
2
+
w
1
∗
(
u
1
−
u
)
2
g = w_0 * (u_0 - u) ^2 + w_1 * (u_1 - u) ^2
g=w0∗(u0−u)2+w1∗(u1−u)2
根據上面的關係,可以推出:
g
=
w
0
∗
w
1
∗
(
u
0
−
u
1
)
2
g = w_0 * w_1 * (u_0 - u_1) ^2
g=w0∗w1∗(u0−u1)2
然後,遍歷每一個灰度值,找到這個灰度值對應的g,找到最大的g對應的t。
https://blog.csdn.net/u010128736/article/details/52801310
#coding:utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
image = cv2.imread("E:/python/cv/OTSU/test.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
plt.subplot(131), plt.imshow(image, "gray")
plt.title("source image"), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.hist(image.ravel(), 256)
plt.title("Histogram"), plt.xticks([]), plt.yticks([])
ret1, th1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) #方法選擇為THRESH_OTSU
plt.subplot(133), plt.imshow(th1, "gray")
plt.title("OTSU,threshold is " + str(ret1)), plt.xticks([]), plt.yticks([])
plt.show()
遺傳演算法解OTSU
遺傳演算法是一種基於自然選擇和群體遺傳機理地搜尋演算法。
它模擬了自然選擇和自然遺傳過程中發生的繁殖、交配和突變現象,將每一個可能的解看作是群體的一個個體,並將每個個體編碼,根據設定的目標函式對每個個體進行評價,給出一個適應度值。開始時隨機產生一些個體,利用遺傳運算元產生新一代的個體,新個體繼承上一代的優良性狀,逐步向更優解進化。由於遺傳演算法在每一代同時搜尋引數空間的不同區域,從而能夠使找到全域性最優解的可能性大大增加。遺傳演算法屬於啟發式演算法,無限趨近最優解並收斂。
那麼怎麼將影像分割問題抽象成遺傳問題,即怎麼將問題編碼成基因串,如何構造適應度函式來度量每條基因的適應度值。假設將影像分為m+1類,則m個閾值按順序排列起來構成一個基因串:
α
=
{
T
1
,
T
2
,
.
.
.
,
T
m
}
\alpha= \{ T_1, T_2, ..., T_m \}
α={T1,T2,...,Tm}
由於灰度為0~255,所以可以使用8位二進位制程式碼表示每個閾值,此時每個基因串由長度為8*m個位元位的串組成。
將類間方差作為適應度函式,類間方差越大,適應度函式值就越高。
相關文章
- 閾值分割及 threshold 實現
- 迭代閾值分割演算法演算法
- 閾值PSI程式碼
- 網格缺陷檢測(二值化閾值分析)
- 支援向量機(SVM)之硬閾值
- python OpenCV中的閾值是什麼PythonOpenCV
- 機器學習之分類:指定閾值機器學習
- MySQL 配置索引頁的合併閾值MySql索引
- openCV中的影像處理 3 影像閾值OpenCV
- opencv——自適應閾值Canny邊緣檢測OpenCV
- lc2334 元素值大於變化閾值的子陣列陣列
- Python 影像處理 OpenCV (6):影像的閾值處理PythonOpenCV
- 【ARCH】Oracle 判斷asm磁碟組大小,超過閾值清理指令碼OracleASM指令碼
- MySQL binlog超過binlog_expire_logs_seconds閾值沒有刪除案例MySql
- Android當記憶體監控到閾值時應該怎麼辦?Android記憶體
- [Python影象處理] 七.影象閾值化處理及演算法對比Python演算法
- 秒懂邊緣雲 | CDN基礎入門:訪問控制及頻寬閾值
- 超越容錯閾值 矽量子計算機保真度獲重大突破WH計算機
- LeetCode 410——分割陣列的最大值LeetCode陣列
- 深度殘差收縮網路:(四)注意力機制下的閾值設定
- linux實現shell指令碼監控磁碟記憶體達到閾值時清理catalina.out日誌Linux指令碼記憶體
- PostgreSQL 原始碼解讀(96)- 分割槽表#3(資料插入路由#3-獲取分割槽鍵值)SQL原始碼路由
- 世界氣象組織:未來五年全球氣溫暫時達到1.5攝氏度閾值的概率為50:50
- 使用ClassificationThresholdTuner進行二元和多類分類問題閾值調整,提高模型效能增強結果可解釋性模型
- 437【畢設課設】基於STM32微控制器水質渾濁度光照強度閾值報警器設計
- Linux分割槽方案、分割槽建議Linux
- 全景分割丨全景分割方法小結
- 木棍分割
- 創新奇智榮獲Cityscapes例項分割冠軍,演算法商用價值大演算法
- leetcode410分割陣列的最大值(二分+貪心,困難)LeetCode陣列
- oracle分割槽表和分割槽表exchangeOracle
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- Linux 分割槽擴容(根分割槽擴容,SWAP 分割槽擴容,掛載新分割槽為目錄)Linux
- Oracle分割槽表基礎運維-07增加分割槽(2 HASH分割槽)Oracle運維
- oracle分割槽表和非分割槽表exchangeOracle
- 非分割槽錶轉換成分割槽表
- 視訊分割成幾段,怎麼批量分割?
- 【影像分割】基於四叉樹影像分割matlabMatlab