『壹』 如何用python實現圖像的一維高斯濾波器
如何用python實現圖像的一維高斯濾波器
現在把卷積模板中的值換一下,不是全1了,換成一組符合高斯分布的數值放在模板裡面,比如這時中間的數值最大,往兩邊走越來越小,構造一個小的高斯包。實現的函數為cv2.GaussianBlur()。對於高斯模板,我們需要制定的是高斯核的高和寬(奇數),沿x與y方向的標准差(如果只給x,y=x,如果都給0,那麼函數會自己計算)。高斯核可以有效的出去圖像的高斯雜訊。當然也可以自己構造高斯核,相關函數:cv2.GaussianKernel().
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(『flower.jpg『,0) #直接讀為灰度圖像
for i in range(2000): #添加點雜訊
temp_x = np.random.randint(0,img.shape[0])
temp_y = np.random.randint(0,img.shape[1])
img[temp_x][temp_y] = 255
blur = cv2.GaussianBlur(img,(5,5),0)
plt.subplot(1,2,1),plt.imshow(img,『gray『)#默認彩色,另一種彩色bgr
plt.subplot(1,2,2),plt.imshow(blur,『gray『)
『貳』 如何生成二維高斯與 Python
在圖像處理以及圖像特效中,經常會用到一種成高斯分布的蒙版,蒙版可以用來做圖像融合,將不同內容的兩張圖像結合蒙版,可以營造不同的藝術效果。
I=M∗F+(1−M)∗B
這里I表示合成後的圖像,F表示前景圖,B表示背景圖,M表示蒙版,或者直接用 蒙版與圖像相乘, 形成一種漸變映射的效果。如下所示。
I=M∗F
這里介紹一下高斯分布蒙版的特性,並且用Python實現。
高斯分布的蒙版,簡單來說,就是一個從中心擴散的亮度分布圖,如下所示:
亮度的范圍從 1 到 0, 從中心到邊緣逐漸減弱,中心的亮度值最高為1,邊緣的亮度值最低為 0. 圖像上任何一點的亮度值為:
G(i,j)=exp−d2R
其中i,j表示圖像上任何一點的坐標,以左上角為坐標原點,d表示 圖像上任何一點 到圖像中心點的距離,R表示圖像的半徑。假設圖像的高為H寬為W
R=(H/2)2+(W/2)2−−−−−−−−−−−−−−√=12H2+W2−−−−−−−−√
d=(i−H/2)2+(j−W/2)2−−−−−−−−−−−−−−−−−−−√
IMAGE_WIDTH = 512IMAGE_HEIGHT = 392center_x = IMAGE_WIDTH/2center_y = IMAGE_HEIGHT/2R = np.sqrt(center_x**2 + center_y**2)Gauss_map = np.zeros((IMAGE_HEIGHT, IMAGE_WIDTH))# 利用 for 循環 實現for i in range(IMAGE_HEIGHT):
for j in range(IMAGE_WIDTH):
dis = np.sqrt((i-center_y)**2+(j-center_x)**2)
Gauss_map[i, j] = np.exp(-0.5*dis/R)# 直接利用矩陣運算實現mask_x = np.matlib.repmat(center_x, IMAGE_HEIGHT, IMAGE_WIDTH)mask_y = np.matlib.repmat(center_y, IMAGE_HEIGHT, IMAGE_WIDTH)x1 = np.arange(IMAGE_WIDTH)x_map = np.matlib.repmat(x1, IMAGE_HEIGHT, 1)y1 = np.arange(IMAGE_HEIGHT)y_map = np.matlib.repmat(y1, IMAGE_WIDTH, 1)y_map = np.transpose(y_map)Gauss_map = np.sqrt((x_map-mask_x)**2+(y_map-mask_y)**2)Gauss_map = np.exp(-0.5*Gauss_map/R)# 顯示和保存生成的圖像plt.figure()
plt.imshow(Gauss_map, plt.cm.gray)
plt.imsave('out_2.jpg', Gauss_map, cmap=plt.cm.gray)
plt.show()
『叄』 [譯] 高斯混合模型 --- python教程
本文翻譯自 https://jakevdp.github.io/PythonDataScienceHandbook/05.12-gaussian-mixtures.html
上一節中探討的k-means聚類模型簡單易懂,但其簡單性導致其應用中存在實際挑戰。具體而言,k-means的非概率特性及簡單地計算點與類蔟中心的歐式距離來判定歸屬,會導致其在許多真實的場景中性能較差。本節,我們將探討高斯混合模型(GMMs),其可以看成k-means的延伸,更可以看成一個強有力的估計工具,而不僅僅是聚類。
我們將以一個標準的import開始
我們看下k-means的缺陷,思考下如何提高聚類模型。正如上一節所示,給定簡單,易於分類的數據,k-means能找到合適的聚類結果。
舉例而言,假設我們有些簡單的數據點,k-means演算法能以某種方式很快地將它們聚類,跟我們肉眼分辨的結果很接近:
從直觀的角度來看,我可能期望聚類分配時,某些點比其他的更確定:舉例而言,中間兩個聚類之間似乎存在非常輕微的重疊,這樣我們可能對這些數據點的分配沒有完全的信心。不幸的是,k-means模型沒有聚類分配的概率或不確定性的內在度量(盡管可能使用bootstrap 的方式來估計這種不確定性)。為此,我們必須考慮泛化這種模型。
k-means模型的一種理解思路是,它在每個類蔟的中心放置了一個圈(或者,更高維度超球面),其半徑由聚類中最遠的點確定。該半徑充當訓練集中聚類分配的一個硬截斷:任何圈外的數據點不被視為該類的成員。我們可以使用以下函數可視化這個聚類模型:
觀察k-means的一個重要發現,這些聚類模式必須是圓形的。k-means沒有內置的方法來計算橢圓形或橢圓形的簇。因此,舉例而言,假設我們將相同的數據點作變換,這種聚類分配方式最終變得混亂:
高斯混合模型(GMM)試圖找到一個多維高斯概率分布的混合,以模擬任何輸入數據集。在最簡單的情況下,GMM可用於以與k-means相同的方式聚類。
但因為GMM包含概率模型,因此可以找到聚類分配的概率方式 - 在Scikit-Learn中,通過調用predict_proba方法實現。它將返回一個大小為[n_samples, n_clusters]的矩陣,用於衡量每個點屬於給定類別的概率:
我們可以可視化這種不確定性,比如每個點的大小與預測的確定性成比例;如下圖,我們可以看到正是群集之間邊界處的點反映了群集分配的不確定性:
本質上說,高斯混合模型與k-means非常相似:它使用期望-最大化的方式,定性地執行以下操作:
有了這個,我們可以看看四成分的GMM為我們的初始數據提供了什麼:
同樣,我們可以使用GMM方法來擬合我們的拉伸數據集;允許full的協方差,該模型甚至可以適應非常橢圓形,伸展的聚類模式:
這清楚地表明GMM解決了以前遇到的k-means的兩個主要實際問題。
如果看了之前擬合的細節,你將看到covariance_type選項在每個中都設置不同。該超參數控制每個類簇的形狀的自由度;對於任意給定的問題,必須仔細設置。默認值為covariance_type =「diag」,這意味著可以獨立設置沿每個維度的類蔟大小,並將得到的橢圓約束為與軸對齊。一個稍微簡單和快速的模型是covariance_type =「spherical」,它約束了類簇的形狀,使得所有維度都相等。盡管它並不完全等效,其產生的聚類將具有與k均值相似的特徵。更復雜且計算量更大的模型(特別是隨著維數的增長)是使用covariance_type =「full」,這允許將每個簇建模為具有任意方向的橢圓。
對於一個類蔟,下圖我們可以看到這三個選項的可視化表示:
盡管GMM通常被歸類為聚類演算法,但從根本上說它是一種密度估算演算法。也就是說,GMM適合某些數據的結果在技術上不是聚類模型,而是描述數據分布的生成概率模型。
例如,考慮一下Scikit-Learn的make_moons函數生成的一些數據:
如果我們嘗試用視為聚類模型的雙成分的GMM模擬數據,則結果不是特別有用:
但是如果我們使用更多成分的GMM模型,並忽視聚類的類別,我們會發現更接近輸入數據的擬合:
這里,16個高斯分布的混合不是為了找到分離的數據簇,而是為了對輸入數據的整體分布進行建模。這是分布的一個生成模型,這意味著GMM為我們提供了生成與我們的輸入類似分布的新隨機數據的方法。例如,以下是從這個16分量GMM擬合到我們原始數據的400個新點:
GMM非常方便,可以靈活地建模任意多維數據分布。
GMM是一種生成模型這一事實為我們提供了一種確定給定數據集的最佳組件數的自然方法。生成模型本質上是數據集的概率分布,因此我們可以簡單地評估模型下數據的可能性,使用交叉驗證來避免過度擬合。校正過度擬合的另一種方法是使用一些分析標准來調整模型可能性,例如 Akaike information criterion (AIC) 或 Bayesian information criterion (BIC) 。Scikit-Learn的GMM估計器實際上包含計算這兩者的內置方法,因此在這種方法上操作非常容易。
讓我們看看在moon數據集中,使用AIC和BIC函數確定GMM組件數量:
最佳的聚類數目是使得AIC或BIC最小化的值,具體取決於我們希望使用的近似值。 AIC告訴我們,我們上面選擇的16個組件可能太多了:大約8-12個組件可能是更好的選擇。與此類問題一樣,BIC建議使用更簡單的模型。
注意重點:這個組件數量的選擇衡量GMM作為密度估算器的效果,而不是它作為聚類演算法的效果。我鼓勵您將GMM主要視為密度估算器,並且只有在簡單數據集中保證時才將其用於聚類。
我們剛剛看到了一個使用GMM作為數據生成模型的簡單示例,以便根據輸入數據定義的分布創建新樣本。在這里,我們將運行這個想法,並從我們以前使用過的標准數字語料庫中生成新的手寫數字。
首先,讓我們使用Scikit-Learn的數據工具載入數字數據:
接下來讓我們繪制前100個,以准確回憶我們正在看的內容:
我們有64個維度的近1,800位數字,我們可以在這些位置上構建GMM以產生更多。 GMM可能難以在如此高維空間中收斂,因此我們將從數據上的可逆維數減少演算法開始。在這里,我們將使用一個簡單的PCA,要求它保留99%的預測數據方差:
結果是41個維度,減少了近1/3,幾乎沒有信息丟失。根據這些預測數據,讓我們使用AIC來計算我們應該使用的GMM組件的數量:
似乎大約110個components最小化了AIC;我們將使用這個模型。我們迅速將其與數據擬合並確保它已收斂合:
現在我們可以使用GMM作為生成模型在這個41維投影空間內繪制100個新點的樣本:
最後,我們可以使用PCA對象的逆變換來構造新的數字:
大部分結果看起來像數據集中合理的數字!
考慮一下我們在這里做了什麼:給定一個手寫數字的樣本,我們已經模擬了數據的分布,這樣我們就可以從數據中生成全新的數字樣本:這些是「手寫數字」,不是單獨的出現在原始數據集中,而是捕獲混合模型建模的輸入數據的一般特徵。這種數字生成模型可以證明作為貝葉斯生成分類器的一個組成部分非常有用,我們將在下一節中看到。
『肆』 怎麼在高斯分布中采樣得到向量python
極限定義:設{Xn}為一無窮數列,如果存在常數a對於任意給定的正數ε(不論它多麼小),總存在正整數N,使得當n>N時的一切Xn,均有不等式|Xn - a|<ε成立,那麼就稱常數a是數列{Xn}的極限,或稱數列{Xn}收斂於a。記為
lim Xn = a 或Xn→a(n→∞)
如果數列沒有極限,就說數列發散
解答:現取ε=2/(x+1),當x→+∞時,總存在|(x-1)/(x+1)-1|<=ε
所以證得lim(x→+∞)(x-1)/(x+1)=1
『伍』 在python怎麼給函數加上高斯雜訊
mu=0
sigma=0.12
X[i]+=random.gauss(mu,sigma)
『陸』 python將高斯坐標轉換經緯度 經緯度坐標與高斯坐標的轉換代碼
#網上搜來的
# 高斯坐標轉經緯度演算法 # B=大地坐標X # C=大地坐標Y # IsSix=6度帶或3度帶
import math
def GetLatLon2(B, C,IsSix):
#帶號
D = math.trunc( C/ 1000000)
#中央經線(單位:弧度)
K = 0
if IsSix:
K = D * 6 - 3 #6度帶計算
else:
K = D * 3 #3度帶計算
L = B/(6378245*(1-0.006693421623)*1.0050517739)
M = L +(0.00506237764 * math.sin(2*L)/2-0.00001062451*math.sin(4*L)/4+0.0000002081*math.sin(6*L)/6)/1.0050517739
N = L +(0.00506237764 * math.sin(2*M)/2-0.00001062451*math.sin(4*M)/4+0.0000002081*math.sin(6*M)/6)/1.0050517739
O = L +(0.00506237764 * math.sin(2*N)/2-0.00001062451*math.sin(4*N)/4+0.0000002081*math.sin(6*N)/6)/1.0050517739
P = L +(0.00506237764 * math.sin(2*O)/2-0.00001062451*math.sin(4*O)/4+0.0000002081*math.sin(6*O)/6)/1.0050517739
Q = L +(0.00506237764 * math.sin(2*P)/2-0.00001062451*math.sin(4*P)/4+0.0000002081*math.sin(6*P)/6)/1.0050517739
R = L +(0.00506237764 * math.sin(2*Q)/2-0.00001062451*math.sin(4*Q)/4+0.0000002081*math.sin(6*Q)/6)/1.0050517739
S = math.tan(R)
T = 0.006738525415*(math.cos(R))**2
U = 6378245/math.sqrt(1-0.006693421623*(math.sin(R))**2)
V = 6378245*(1-0.006693421623)/(math.sqrt((1-0.006693421623*(math.sin(R))**2)))**3
W = 5+3*S**2+T-9*T*S**2
X = 61+90*S**2+45*S**4
Y = 1+2*S**2+T**2
Z = 5+28*S**2+24*S**4+6*T+8*T*S**2
Lat= (180/math.pi)*(R-(C-D*1000000-500000)**2*S/(2*V*U)+(C-D*1000000-500000)**4*W/(24*U**3*V)-(C-D*1000000-500000)**6*X/(7200*U**5*V))
Lon= (180/math.pi)*(C-D*1000000-500000)*(1-(C-D*1000000-500000)**2*Y/(6*U**2)+(C-D*1000000-500000)**4*Z/(120*U**4))/(U*math.cos(P))
Lat = Lat
Lon = K + Lon
return (Lon, Lat)
『柒』 如何用python實現圖像的一維高斯濾波
如何用python實現圖像的一維高斯濾波
建議你不要使用高斯濾波。
推薦你使用一維中值濾波
matlab的函數為
y = medfilt1(x,n);
x為數組,是你要處理原始波形,n是中值濾波器的參數(大於零的整數)。y是濾波以後的結果(是數組)
後面再
plot(y);
就能看到濾波以後的結果
經過medfilt1過濾以後,y里儲存的是低頻的波形,如果你需要高頻波形,x-y就是高頻波形
順便再說一點,n是偶數的話,濾波效果比較好。
N越小,y里包含的高頻成分就越多,y越大,y里包含的高頻成分就越少。
記住,無論如何y里保存的都是整體的低頻波。(如果你看不懂的話,濾一下,看y波形,你馬上就懂了)
『捌』 怎麼用python表示出二維高斯分布函數,mu表示均值,sigma表示協方差矩陣,x表示數據點
clear
closeall
%%%%%%%%%%%%%%%%%%%%%%%%%生成實驗數據集
rand('state',0)
sigma_matrix1=eye(2);
sigma_matrix2=50*eye(2);
u1=[0,0];
u2=[30,30];
m1=100;
m2=300;%樣本數
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm1數據集
Y1=multivrandn(u1,m1,sigma_matrix1);
Y2=multivrandn(u2,m2,sigma_matrix2);
scatter(Y1(:,1),Y1(:,2),'bo')
holdon
scatter(Y2(:,1),Y2(:,2),'r*')
title('SM1數據集')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm2數據集
u11=[0,0];
u22=[5,5];
u33=[10,10];
u44=[15,15];
m=600;
sigma_matrix3=2*eye(2);
Y11=multivrandn(u11,m,sigma_matrix3);
Y22=multivrandn(u22,m,sigma_matrix3);
Y33=multivrandn(u33,m,sigma_matrix3);
Y44=multivrandn(u44,m,sigma_matrix3);
figure(2)
scatter(Y11(:,1),Y11(:,2),'bo')
holdon
scatter(Y22(:,1),Y22(:,2),'r*')
scatter(Y33(:,1),Y33(:,2),'go')
scatter(Y44(:,1),Y44(:,2),'c*')
title('SM2數據集')
end
functionY=multivrandn(u,m,sigma_matrix)
%%生成指定均值和協方差矩陣的高斯數據
n=length(u);
c=chol(sigma_matrix);
X=randn(m,n);
Y=X*c+ones(m,1)*u;
end