怎麼樣保持相同的動態範圍?
- 計算原始
min0,max0
y
- 值
- 光滑y值
- 計算新
min1,max1
y
- 值
線性插值的所有值以匹配原始最小值最大值y
y=min1+(y-min1)*(max0-min0)/(max1-min1)
就是它
不知道的領域,但這應該保持形狀更接近原來的。我得到了這個想法,現在在閱讀你的問題,我現在面對類似的問題,所以我儘量代碼,並馬上想試試+1
的讓我這個想法:)
可以適應這一點,並與區域相結合
因此,在此之前,計算該區域並應用#1 ..#4並在那之後計算新的區域。然後將所有值乘以old_area/new_area
比率。如果你也有負面的價值,而不是計算絕對面積,那麼你必須分別處理正面和負面的區域,並找到最適合攤位的原始面積的倍增率。
[EDIT1]一些結果恆定動態範圍
正如你可以看到形狀稍微移動到左邊。每張圖片在應用了幾百次平滑操作之後。我想到的是細分到地方最小值最大值間隔,以提高這一點...
[EDIT2]已經完成了過濾器用於我自己的目的
void advanced_smooth(double *p,int n)
{
int i,j,i0,i1;
double a0,a1,b0,b1,dp,w0,w1;
double *p0,*p1,*w; int *q;
if (n<3) return;
p0=new double[n<<2]; if (p0==NULL) return;
p1=p0+n;
w =p1+n;
q =(int*)((double*)(w+n));
// compute original min,max
for (a0=p[0],i=0;i<n;i++) if (a0>p[i]) a0=p[i];
for (a1=p[0],i=0;i<n;i++) if (a1<p[i]) a1=p[i];
for (i=0;i<n;i++) p0[i]=p[i]; // store original values for range restoration
// compute local min max positions to p1[]
dp=0.01*(a1-a0); // min delta treshold
// compute first derivation
p1[0]=0.0; for (i=1;i<n;i++) p1[i]=p[i]-p[i-1];
for (i=1;i<n-1;i++) // eliminate glitches
if (p1[i]*p1[i-1]<0.0)
if (p1[i]*p1[i+1]<0.0)
if (fabs(p1[i])<=dp)
p1[i]=0.5*(p1[i-1]+p1[i+1]);
for (i0=1;i0;) // remove zeros from derivation
for (i0=0,i=0;i<n;i++)
if (fabs(p1[i])<dp)
{
if ((i> 0)&&(fabs(p1[i-1])>=dp)) { i0=1; p1[i]=p1[i-1]; }
else if ((i<n-1)&&(fabs(p1[i+1])>=dp)) { i0=1; p1[i]=p1[i+1]; }
}
// find local min,max to q[]
q[n-2]=0; q[n-1]=0; for (i=1;i<n-1;i++) if (p1[i]*p1[i-1]<0.0) q[i-1]=1; else q[i-1]=0;
for (i=0;i<n;i++) // set sign as +max,-min
if ((q[i])&&(p1[i]<-dp)) q[i]=-q[i]; // this shifts smooth curve to the left !!!
// compute weights
for (i0=0,i1=1;i1<n;i0=i1,i1++) // loop through all local min,max intervals
{
for (;(!q[i1])&&(i1<n-1);i1++); // <i0,i1>
b0=0.5*(p[i0]+p[i1]);
b1=fabs(p[i1]-p[i0]);
if (b1>=1e-6)
for (b1=0.35/b1,i=i0;i<=i1;i++) // compute weights bigger near local min max
w[i]=0.8+(fabs(p[i]-b0)*b1);
}
// smooth few times
for (j=0;j<5;j++)
{
for (i=0;i<n ;i++) p1[i]=p[i]; // store data to avoid shifting by using half filtered data
for (i=1;i<n-1;i++) // FIR smooth filter
{
w0=w[i];
w1=(1.0-w0)*0.5;
p[i]=(w1*p1[i-1])+(w0*p1[i])+(w1*p1[i+1]);
}
for (i=1;i<n-1;i++) // avoid local min,max shifting too much
{
if (q[i]>0) // local max
{
if (p[i]<p[i-1]) p[i]=p[i-1]; // can not be lower then neigbours
if (p[i]<p[i+1]) p[i]=p[i+1];
}
if (q[i]<0) // local min
{
if (p[i]>p[i-1]) p[i]=p[i-1]; // can not be higher then neigbours
if (p[i]>p[i+1]) p[i]=p[i+1];
}
}
}
for (i0=0,i1=1;i1<n;i0=i1,i1++) // loop through all local min,max intervals
{
for (;(!q[i1])&&(i1<n-1);i1++); // <i0,i1>
// restore original local min,max
a0=p0[i0]; b0=p[i0];
a1=p0[i1]; b1=p[i1];
if (a0>a1)
{
dp=a0; a0=a1; a1=dp;
dp=b0; b0=b1; b1=dp;
}
b1-=b0;
if (b1>=1e-6)
for (dp=(a1-a0)/b1,i=i0;i<=i1;i++)
p[i]=a0+((p[i]-b0)*dp);
}
delete[] p0;
}
所以p[n]
是輸入/輸出數據。有跡象表明,可以調整等幾件事情:
- 權重計算(常數0.8和0.35意味着權重
<0.8,0.8+0.35/2>
)(在for循環現在5)
- 數平滑遍
- 越大重量少濾波
1.0
意味着沒有變化
的主要思想是背後:
- 找到局部極值
計算權重,用於平滑
所以鄰近局部極值是輸出
光滑
- 修復動態範圍每每個間隔的幾乎沒有變化在所有當地極端之間
[注意事項]
我也嘗試恢復該地區,但是這是與我的任務不兼容,因爲它扭曲的形狀很多。所以,如果你真的需要這個區域,那麼就關注那個區域,而不是那個形狀。平滑造成信號大部分縮小後區域恢復的幅度上升。
實際過濾器狀態沒有可標記的形狀側移(這是我的主要目標)。更多的顛簸信號某些圖像(原過濾器是在這個可憐的極端):
正如你可以看到沒有明顯的信號形狀轉移。當地有極端傾向很重的平滑之後形成鋒利的尖刺但預計
希望它可以幫助...
我喜歡這個。它具有最小能量樣條的概念。 Upvoted它。 – fang 2014-12-04 19:09:31
我不明白解決方案。我們爲什麼要最小化S和A?其實我知道發生了什麼,但是爲什麼它似乎完全讓我昏迷。 – Sohaib 2014-12-05 05:22:20
很好地解釋了很多。只是更清楚一點,那麼我會將其標記爲正確。d的初始值應該是多少? 又是什麼?你能否解釋一下你是如何得到第二個方程的:S = sqr(|| A * d-b ||)'。 – Sohaib 2014-12-06 16:02:48