|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案* r: i: Z7 p4 g4 O: V5 C
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.$ Z8 w1 V6 n7 e5 w1 Q
0 W$ t: S7 B" E r8 w0 n |舉個4進4出的例子:+ q% g; L; n3 {
input [word length] a[4];
+ v$ F- ^! _& E; f) _6 F- o, O" l- |reg [word length] b[4], c[4];
2 f4 W* a5 ^0 D' u# v) a第一次排序8 m6 X; U) V$ A( O" P j9 t7 e
b[0]=min(a[0], a[1]);( y8 q# u; V4 S! [0 {: z- G% a
b[1]=max(a[0], a[1]);5 y8 p6 S5 K7 Q6 y+ h
b[2]=min(a[2], a[3]);; j3 R( d! A( u. Z% R8 I, \0 s0 A
b[3]=max(a[2], a[3]);9 x* ]' K6 @$ V1 y8 W1 @
第二次排序6 e7 K2 K% G' Z' Q7 [( F: v
c[0]=min(b[0], b[2]); //real minmum( s7 g6 t: N3 h0 c) K, G
c[1]=max(b[0], b[2]);7 `3 H! N0 C1 p; s
c[2]=min(b[1], b[3]);
9 C, |. V, U: r! ic[3]=max(b[1], b[3]);//real maximum
* S$ d& w/ |, i( u' u第三次修正項
& w0 B, J2 R' X5 i8 {" md[0]=c[0]; //real minmum
; |& ~: k) K" h* g" B5 cd[1]=min(c[1], c[2]);$ i% _9 F6 R6 H9 ]" h, P* n1 z
d[2]=max(c[1], c[2]);. V( b, g* _3 J5 P& v
d[3]=c[3];//real maximum4 `7 k3 ]( k4 X+ k8 z6 }
//d[0]~d[3]就是依序小到大的答案3 X; Y8 k- g% j) U& b& g& ]
% u, J. N# G8 ] W7 z
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
9 E3 S( L# | Z/ ^* d% ]4 Q8 N$ x, }& f, g4 Y- L; G1 l! ]
實做的考量
2 K5 ?2 ^+ K( h( j. Z$ z- {6 Z1. 實做上min()跟max()應該是一起做的3 ?- z" s7 V; T1 N. y8 o! b8 b' l
if(a>b) m, ~8 w" U5 {1 c% \) y2 c
min = b;$ {4 u2 Q$ w( ]$ |: u
max = a;; U! k) j) T3 [, l3 s
else2 R/ E1 b+ y) H3 }% o) H
min = a;
% t2 y* [6 m7 o+ F+ Y7 J max = b;4 L' P4 ]4 @) q
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.2 u: {! \# @) u4 z
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.9 I/ }3 b9 D, `7 E! B1 N
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|