2012-08-15 47 views
2

我有一些數據組,其中每個對象具有一個ValuePrice。我想使用他們的Value將高斯模糊應用到他們的Price。由於我的數據只有1個組件用於模糊,因此我試圖應用1D高斯模糊。應用1D高斯模糊的數據的集合

我的代碼做到這一點:

totalPrice = 0; 
totalValue = 0; 
for each object.OtherObjectsWithinPriceRange() 
    totalPrice += price; 
    totalValue += Math.Exp(-value*value); 

price = totalPrice/totalValue; 

我看到了良好的效果,但一維高斯模糊算法,我在網上看到的似乎使用偏差,西格瑪,PI,等我需要他們,或者他們嚴格二維高斯模糊?它們將這些1D模糊通道組合爲垂直和水平,因此它們仍然佔據2D。

此外,我將結果顯示爲顏色,但白色區域是稍微超過1(白色)。我如何正常化這個?我應該把這些值限制爲1嗎?這就是爲什麼我想知道我是否正在使用正確的公式。

+0

你在做什麼?你使用什麼語言?你想展示一些東西嗎?你究竟在展示什麼?你看到了什麼「好結果」?什麼是exp(-value,value)'應該是什麼意思?我可能可以幫助你,但我無法弄清楚你究竟想要做什麼。請更加明確。 – 2012-08-15 04:18:52

+0

只是一個實驗。將這些對象想象爲「商品」,我試圖模糊它們的「價格」值,就像圖像的RGB值一樣,除了這是一個浮點數。語言是C#,但任何語言都可以。 – 2012-08-15 04:24:22

+0

什麼是'exp(-value,value)'?不應該exp只採取一個arg?我的例子中看不到模糊。模糊是卷積,每個輸出像素應該是周圍像素的某種組合。 – 2012-08-15 04:29:59

回答

1

你的代碼應用某種模糊,但絕對不是高斯。高斯模糊看起來像

kindaSigma = 1; 
priceBlurred = object.price; 
for each object.OtherObjectsWithinPriceRange() 
    priceBlurred += price*Math.Exp(-value*value/kindaSigma/kindaSigma); 

,只有假設value是成正比的價格範圍內的object和其他對象,無論這個「距離」在你的應用手段之間的「距離」。

給你的問題。

  1. 二維高斯模糊完全等價於垂直和水平一維高斯模糊組合完成一個另一個。這就是2D高斯模糊通常在實踐中實現的方式。

  2. 您不需要任何PI或sigmas作爲高斯的乘法因子 - 這些效果僅僅是縮放圖像,並且可以安全地忽略。

  3. 指數下的六西格瑪(標準差)對結果產生重大影響,但它是不可能的,我告訴你,如果你需要與否。這取決於你的應用程序。 想要更多模糊效果:請在上面的代碼片段中使用較大的kindaSigma。 減少模糊:使用較小的kindaSigma。當kindaSigma太小時,你根本不會注意到任何模糊。當kindaSigma太大時,高斯模糊會有效地轉化爲移動平均濾波器。 玩它,並選擇你所需要的。

  4. 我不知道我理解你的問題正常化。在圖像處理中,通常將每個顏色分量(R,G,B)存儲爲unsigned char。所以黑色表示(0,0,0),白色表示(255,255,255)。當然,您可以自由決定選擇不同的表示形式,並將白色作爲1.但請記住,對於使用標準8位演示文稿的可視化軟件包,值1表示幾乎爲黑色。所以你可能需要在顯示之前操作和重新標準化圖像。

+0

謝謝。我實際上在這裏使用了這樣的東西:(1.0 /(Math.Sqrt(2.0 * Math.PI)* StandardDeviation)* Math.Exp(-Math.Pow(CDbl(Distance),2.0)/(2.0 * Math.Pow (StandardDeviation,2.0))))http://theinstructionlimit.com/gaussian-blur-experiments,但是這並沒有給我足夠的模糊,圖像比原來更明顯,比如一半的亮度。我也不知道西格瑪有什麼價值。我認爲我可以將它作爲一個參數,但在Photoshop中,例如他們只有半徑,沒有西格馬,所以認爲這個值應該是自動的。 – 2012-08-15 09:56:34

+0

瓊,你可以隨時調整圖像,如果它太暗 - 開始的好處是擺脫Math.Exp()前面的乘法因子。增加StandardDeviation以獲得更多模糊。如果不熟悉您的應用程序,我可以說通常不需要高斯模糊。你可以簡單地使用加權平均,比如'blur [n] =(original [n] + k *(original [n-1] + original [n + 1]))/ 2',這會產生模糊效果,可能已經足夠滿足您的需求,當然更具有計算效率,特別是當'k'是2的反冪時。 – 2012-08-15 10:10:46

+0

謝謝Arik,這裏的重量是多少? – 2012-08-15 10:13:47