日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

otsu阈值分割算法原理_大津二值化算法OTSU的理解

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 otsu阈值分割算法原理_大津二值化算法OTSU的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

otsu 大津算法介紹:

OTSU算法是由日本學者OTSU于1979年提出的一種對圖像進行二值化的高效算法。

利用閾值將原圖像分成前景,背景兩個圖象。

前景:用n1,csum,m1來表示在當前閾值下的前景的點數,質量矩,平均灰度

背景:用n2, sum-csum,m2來表示在當前閾值下的背景的點數,質量矩,平均灰度

當取最佳閾值時,背景應該與前景差別最大,關鍵在于如何選擇衡量差別的標準,而在otsu算法中這個衡量差別的標準就是最大類間方差,在本程序中類間方差用sb表示,最大類間方差用fmax

這段引用自百度百科,不是很好懂。

otsu 大津算法原理

otsu 大津算法是一種圖像二值化算法,作用是確定將圖像分成黑白兩個部分的閾值。

將圖像背景和前景分成黑白兩類很好理解,但是如何確定背景和前景的二值化界限(閾值)呢?

對于不同的圖像,這個閾值可能不同,這就需要有一種算法來根據圖像的信息自適應地確定這個閾值。

首先,需要將圖像轉換成灰度圖像,255個灰度等級。

可以將圖像理解成255個圖層,每一層分布了不同的像素,這些像素垂直疊加合成了一張完整的灰度圖。

我們的目的就是找到一個合適的灰度值,大于這個值的我們將它稱之為背景(灰度值越大像素越黑),小于這個值的我們將它稱之為前景(灰度值越小像素越白)。

怎么確定這個值就是我們想要的值呢?

這里引入方差的概念,方差越大,相關性越低,黑白越分明。

我們將每一個灰度值之上下之間的像素的方差求出來不就行了嗎?找到方差最大的那個灰度值,那個就是我們想要的二值化分隔閾值。

先定義幾個符號代表的意義:

h:圖像的寬度

w:圖像的高度(h*w 得到圖像的像素數量)

t :灰度閾值(我們要求的值,大于這個值的像素我們將它的灰度設置為255,小于的設置為0)

n0:小于閾值的像素,前景

n1:大于等于閾值的像素,背景

n0 + n1 == h * w

w0:前景像素數量占總像素數量的比例

w0 = n0 / (h * w)

w1:背景像素數量占總像素數量的比例

w1 = n1 / (h * w)

w0 + w1 == 1

u0:前景平均灰度

u0 = n0灰度累加和 / n0

u1:背景平均灰度

u1 = n1灰度累加和 / n1

u:平均灰度

u = (n0灰度累加和 + n1灰度累加和) / (h * w) 根據上面的關系

u = w0 * u0 + w1 * u1

g:類間方差(那個灰度的g最大,哪個灰度就是需要的閾值t)

g = w0 * (u0 - u)^2 + w1 * (u1 - u)^2

根據上面的關系,可以推出:(這個一步一步推導就可以得到)

g = w0 * w1 * (u0 - u1) ^ 2

然后,遍歷每一個灰度值,找到這個灰度值對應的 g

找到最大的 g 對應的 t

代碼實現:

import cv2 import numpy as np# 這里直接將數據轉換成float32了,方便后續計算 img = cv2.imread(r'001.jpg').astype(np.float32)# 灰度化 def bgr2gray(img):b = img[:, :, 0].copy()g = img[:, :, 1].copy()r = img[:, :, 2].copy()gray_img = 0.2126 * r + 0.7152 * g + 0.0722 * bgray_img = gray_img.astype(np.uint8)return gray_img# 大津二值化算法 def otsu(gray_img):h = gray_img.shape[0]w = gray_img.shape[1]threshold_t = 0max_g = 0# 遍歷每一個灰度層for t in range(255):# 使用numpy直接對數組進行運算n0 = gray_img[np.where(gray_img < t)]n1 = gray_img[np.where(gray_img >= t)]w0 = len(n0) / (h * w)w1 = len(n1) / (h * w)u0 = np.mean(n0) if len(n0) > 0 else 0.u1 = np.mean(n1) if len(n0) > 0 else 0.g = w0 * w1 * (u0 - u1) ** 2if g > max_g:max_g = gthreshold_t = tprint('類間方差最大閾值:', threshold_t)gray_img[gray_img < threshold_t] = 0gray_img[gray_img >= threshold_t] = 255return gray_imggray_img = rgb2gray(img) otsu_img = otsu(gray_img) cv2.imshow('otsu_img ', otsu_img )cv2.waitKey(0) cv2.destroyAllWindows()

總結

以上是生活随笔為你收集整理的otsu阈值分割算法原理_大津二值化算法OTSU的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。