一、概率密度估計(jì)
概率密度估計(jì),簡單說就是從離散的數(shù)據(jù)中估計(jì)出連續(xù)的概率密度函數(shù)。這里的離散數(shù)據(jù)即收集到的樣本,它們來自的類別可能擁有某種統(tǒng)計(jì)學(xué)上的特征。最常見的密度估計(jì)方法是直方圖,直方圖是一種很直觀的對數(shù)據(jù)樣本分布進(jìn)行可視化的方法。
概率密度估計(jì)可以分為參數(shù)估計(jì)和非參數(shù)估計(jì):
- 參數(shù)估計(jì):假設(shè)數(shù)據(jù)服從某一個(gè)分布(比如高斯分布),并從數(shù)據(jù)樣本估計(jì)概率密度函數(shù)的參數(shù),比如HMM, MLE等。
- 非參數(shù)估計(jì):模型能估計(jì)出任意分布的數(shù)據(jù),比如核密度估計(jì)。
二、Meanshift算法
圖像的特征空間是一個(gè)基于輸入的映射,輸入圖像上的一個(gè)小的自己映射到多維空間上的一個(gè)點(diǎn),當(dāng)整個(gè)輸入都被映射到特征空間里,特征空間里的密度分布就能反映出輸入的特征。結(jié)構(gòu)位置的特征空間只能用非參數(shù)估計(jì)的方法分析,有兩類非參數(shù)聚類方法:分層聚類核密度估計(jì)。密度估計(jì)的基本原理是把特征空間看作是一個(gè)所表示參數(shù)的概率密度函數(shù),密集的區(qū)域就對應(yīng)著概率密度函數(shù)的區(qū)域最大值,也就是這個(gè)未知分布的模式,然后就能得到相應(yīng)的聚類。
1. 核密度估計(jì)
核密度估計(jì)是最常用的密度估計(jì)方法,給定個(gè)數(shù)據(jù)點(diǎn)
,分布在
維空間
, 有多變量核密度估計(jì)的核
,對稱正定帶寬矩陣
, 在點(diǎn)
得到的
,其中
常用的帶寬矩陣, 只用一個(gè)參數(shù)
,簡化了運(yùn)算,帶入上面的核密度估計(jì)公式可以得到
維空間里邊長為
的多為立方體的體積
核密度估計(jì)的用密度和它的估計(jì)值之間的均方差來判斷。Epanechnikov核有最小的漸進(jìn)逼近均方差,
Epanechnikov核在邊界不可分,所以也常用
帶入核密度公式之后概率密度估計(jì)公式可以寫為
分析的特征空間的第一步,就是找到它的模式(mode),mode它一般都在梯度為0的位置,而 mean shift 是一個(gè)不需要估計(jì)密度就能找到0的方法。
2. 密度梯度估計(jì)
上面的公式求梯度
定義,可以得到
第二項(xiàng)總是正數(shù),所以只要第三項(xiàng)為0,梯度變?yōu)?,得到mean shift
也就是一個(gè)范圍內(nèi)的數(shù)據(jù)點(diǎn)的權(quán)重均值與中心點(diǎn)的差。
mean shift的步驟就是重復(fù):
- 計(jì)算mean shift向量
- 根據(jù)向量移動核
的窗口到下一個(gè)中心點(diǎn)
直到收斂到梯度為0的點(diǎn)。
核的中心點(diǎn)為
j=1,2,...
3. Mean shift 的應(yīng)用
Mean shift濾波,做圖像平滑去噪等,以及圖像分割。
圖像通常由一個(gè)三維的矩陣表示,其中兩維表示位置,剩下的一個(gè)維度表示通道數(shù),在彩色圖片中通道數(shù)為3,在灰色圖片中通道數(shù)為1.當(dāng)位置向量和范圍向量串聯(lián)在一起作為輸入時(shí),需要分別對它們進(jìn)行歸一化,
其中表示空間部分,
表示范圍的部分,
是核的帶寬,
是一個(gè)常數(shù)。
圖像平滑
圖像平滑是將部分區(qū)域內(nèi)的像素值替換為區(qū)域內(nèi)像素的加權(quán)平均值,從而達(dá)到去除噪聲的目的,但是這樣也會導(dǎo)致圖像信息被消除。而可以保留不連續(xù)性的平滑方法能夠減少局部突變附近,也就是邊緣附近的平滑量,以保留更多信息。
Mean shift用于濾波的主要思想為將圖片的每個(gè)像素對應(yīng)值用特征向量表示,如果用來表示輸入與輸出,對于每個(gè)像素點(diǎn):
- 初始化
- 根據(jù)公式
計(jì)算更新核中心點(diǎn)直到收斂
- 將中心點(diǎn)的值分配給初始點(diǎn)
圖像分割
圖像分割是將圖像劃分為顏色相同的圖像塊。Mean shift用于圖像分割是圖像平滑的一個(gè)擴(kuò)展應(yīng)用。
用表述輸入和處理過的圖像像素,
是分割圖像的第
個(gè)像素的標(biāo)簽:
- 在圖像上運(yùn)行mean shift 濾波的流程,并且保存下所有收斂點(diǎn)的信息
- 將空間域上距離小于
以及范圍域上距離小于
的收斂點(diǎn)組合在一起
- 對于每一個(gè)像素點(diǎn),為它分配對應(yīng)的聚類中心的類別
- (可選)消除包含少于
個(gè)校內(nèi)告訴的空間區(qū)域
Python實(shí)現(xiàn)圖像分割
使用sklearn庫實(shí)現(xiàn)的mean shift的圖像分割。
sklearn.cluster.estimate_bandwidth(X):估計(jì)帶寬
- X:輸入
- quantile:float, default=0.3。應(yīng)在[0,1]。0.5表示使用所有成對距離的中位數(shù)。
- n_samples:int, default=None。樣本數(shù),如果未指定會使用全部的樣本數(shù),對于大的數(shù)據(jù)集建議使用一個(gè)較小的數(shù)
- random_state:int, RandomState instance, default=None。用于從輸入點(diǎn)隨機(jī)選擇樣本以進(jìn)行帶寬估計(jì)。
- n_jobs:int, default=None。并行數(shù)。
sklearn.cluster.MeanShift:mean shift類:
- fit(X):進(jìn)行聚類
- fit_predict(X):聚類并返回聚類標(biāo)簽
- predict(X):預(yù)測X中每個(gè)樣本所屬的最近的聚類。
import cv2
from sklearn.cluster import MeanShift, estimate_bandwidth
import matplotlib.pyplot as plt
# 讀入圖片
orig_img = cv2.imread("C:/Users/18215/Pictures/trump.jpg")
orig_img = cv2.cvtColor(orig_img, cv2.COLOR_BGR2RGB)
img = copy.deepcopy(orig_img)
# 圖像尺寸
shape = img.shape
# 將圖像轉(zhuǎn)換為 [-1, 3]
shaped_img = np.reshape(img, [-1,3])
# 計(jì)算帶寬
bw = estimate_bandwidth(shaped_img, quantile=0.1, n_samples=100)
ms = MeanShift(bandwidth=bw, bin_seeding=True)
ms.fit(shaped_img)
# meanshift后不同聚類 對應(yīng)的(r,g,b)
labels= ms.labels_
# meanshift后的顏色
cluster_center = ms.cluster_centers_
labels_unique = np.unique(labels)
n_cluster = len(labels_unique)
segImg = np.reshape(labels, shape[:2])
plt.figure()
plt.subplot(121), plt.imshow(orig_img), plt.axis('off'), plt.title('original image', size=20)
plt.subplot(122), plt.imshow(segImg), plt.axis('off'), plt.title('segmented image with Meanshift', size=20)
plt.show()

參考文獻(xiàn):
[1] Comaniciu D, Meer P. Mean shift: A robust approach toward feature space analysis[J]. IEEE Transactions on pattern analysis and machine intelligence, 2002, 24(5): 603-619.