|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案& p7 c( I" c/ Z
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
% w# S# B& U% m% t5 b2 W8 H5 U/ N
; k) @$ p: e1 n) `" s舉個4進4出的例子:
: d1 B, I) t$ O; j A9 ^input [word length] a[4];" z% L" H! k+ ]5 E: l0 B2 |9 k9 N8 s$ g
reg [word length] b[4], c[4];* J, ?/ ?; ~ z5 [: w! E
第一次排序
' g& c% B$ v" ?) }& w1 Q6 A- k; Ob[0]=min(a[0], a[1]);
0 `5 ? [# k" z. @b[1]=max(a[0], a[1]); w% x% @( M: G" I
b[2]=min(a[2], a[3]);/ r+ r( e% k) O& [; c7 K9 f
b[3]=max(a[2], a[3]);" e! \" ]( T# m" l& x8 T7 ]7 x
第二次排序# e4 c% @5 ?5 L* @2 J+ M
c[0]=min(b[0], b[2]); //real minmum3 ]' M l4 E; |$ I7 _& l
c[1]=max(b[0], b[2]);- c. ?1 r: H) x( F; g7 f
c[2]=min(b[1], b[3]);
6 C* t5 g; T: ~$ R' ec[3]=max(b[1], b[3]);//real maximum
7 j( A' Q `9 o# p3 c5 F7 e. |; n第三次修正項" a: S# X0 b2 R9 {3 i" i
d[0]=c[0]; //real minmum( z8 f4 I) S+ ]9 w3 u' ~6 s9 J- b& X
d[1]=min(c[1], c[2]);
{, g/ p. C7 X' o5 dd[2]=max(c[1], c[2]);6 C" u) ~1 d) M) W C
d[3]=c[3];//real maximum& L: B3 C& j$ S$ ^$ s
//d[0]~d[3]就是依序小到大的答案
# ]9 T9 C; P, Z
; q V3 Z! R0 w* ?& S' O這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
# I+ Q5 N) y/ U; c- j# J
' e2 |6 E; [. _) j, u$ O實做的考量6 s4 t0 T- o8 i7 E
1. 實做上min()跟max()應該是一起做的5 Z; q7 |2 F' N @, |) ^
if(a>b)
" v' v1 S! j4 {! G min = b;
* c" f' V% i6 I! K6 P% s: o max = a;
. ?, O! N0 ^7 d8 ], S; O else
! U: O1 b8 B! E' w$ ` min = a;
" H) [. N: K: X max = b;7 {6 E" p+ n5 L9 h# G* e9 B5 ~0 Q! Q
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.$ F- ]' G+ ~, \$ T# n v" d' x
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
( x! d5 B) X- Y9 V l! z, `+ s& vP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|