造輪子 python手動實現OTUS

2021-10-08 19:45:38 字數 1567 閱讀 4896

最近研究閾值化演算法,otus算是目前應用比較廣泛的,自己想實現otus看和opencv對比,哪個用時短

最後經numba加速後還是失敗,opencv的otus演算法速度是自己手寫的轉換速度的5~10倍。果然現成的輪子是比較好用的

otus法又稱最大類間方差法或者大津法,基本思想就是計算前景類與背景類之間的類間方差,當某個灰度級對應得到的類間方差最大時,即認為此時的閾值為最佳閾值。相關原理可以參考:

def

otus_threshold

(image)

:""" image should be in gray"""

n, m = image.shape

total_pixel = n * m

hist = cal_hist(image)

# 自己寫的灰度直方計算函式 可用下面的代替

# opencv 中的灰度直方計算函式

# hist = cv.calchist([gray], [0], none, [256], [0, 256])

# 總平均灰度

u =0.0for i in

range

(len

(hist)):

u = u + i * hist[i]

u = u / total_pixel

# 背景灰度級平均灰度

u_0 =

u_0_mid =

0.0 w_0 =

for j in

range

(len

(hist)):

back_pixel = np.

sum(hist[

:j+1])

u_0_mid = u_0_mid + j * hist[j]

if back_pixel ==0:

0.0)

else

:# print(u_0)

# 類間方差

g =a =

0.0for k in

range

(len

(hist)):

if w_0[k]==1

:else

: u_1 =

(u - u_0[k]

* w_0[k])/

(1- w_0[k]

) g_mid = w_0[k]*(

1.0- w_0[k])*

(u_0[k]

- u_1)

*(u_0[k]

- u_1)

# print(len(g), g)

g_index = g.index(

max(g)

)return g_index

函式的輸入必須為灰度影象,返回值為最佳閾值,函式未將影象轉化為二值圖,可自己寫可歷遍對比轉化一下

otus, src_threshold = cv.threshold(image_gray,0,

255, cv.thresh_binary + cv.thresh_otsu)

返回值為最佳閾值 與轉換後的二值化影象

造輪子 Shell實現守護程序

雖然在程式猿的世界裡流行乙個諺語 不要重複造輪子 但是如果你開的就是一輛16寸輪轂的a級車,給你一副21寸的賓利輪轂你也是裝不上的。就算是運氣好找到了一副18寸的奧迪輪轂,可以正常的安裝並行駛,但是大輪轂所帶來的車速表不准,舒適度下降的問題又是不可避免的。所以適當的造造輪子也不失是一種節約後期維護成...

造輪子 補碼實現與若干分析

這周計算機原理課收到樓sir的乙個作業 要自己實現一套整數編碼的數碼轉換與若干運算,並分析。我拿到的是補碼,其他的隊友分別要實現一套原碼 移碼或者自行設計一套 帥碼 666 程式語言 c 聽說規定要用c語言造這個輪子,真是遺憾,要是c 還可以各種運算子過載可以很優雅。那好吧,在編碼之前,先做個約束。...

造輪子 toast元件的實現 下

1.解決 toast 中傳入 html 的問題,通過假的 slot 來實現 plugins.js toast.slots.default message toast.vue 使用 created 2.在 toast 中加 html 是比較危險的乙個動作,所以要加乙個選項預設不開啟。toast.vue...