|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案1 s: {" \6 v5 E- c L6 V3 u/ L
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.- Y" ?6 B5 V% v9 p
1 T6 H- J# H' b( [/ J舉個4進4出的例子:% l0 ^* @4 {8 v+ @ J
input [word length] a[4];$ Q9 a! h2 P6 R$ h* M+ _
reg [word length] b[4], c[4];6 P) Y5 n) g8 O% l* p8 M
第一次排序
2 N3 h3 \ j: }: f3 Tb[0]=min(a[0], a[1]);
/ {- V% H+ ^! Z' g) X$ v5 z+ c2 tb[1]=max(a[0], a[1]);) Z3 ?6 Q4 r5 Y
b[2]=min(a[2], a[3]);
' d/ W0 V8 X, X0 p* p1 q: i6 d" _b[3]=max(a[2], a[3]);
/ X5 }; Q ?. h6 A5 V第二次排序/ O% b2 z- m0 ]$ {1 I! U! T
c[0]=min(b[0], b[2]); //real minmum2 m, h- Z3 f$ J9 v$ f1 a
c[1]=max(b[0], b[2]);
. H+ Z2 H' e xc[2]=min(b[1], b[3]);- h' F: B& _! c
c[3]=max(b[1], b[3]);//real maximum
1 u8 p2 e! c& z5 r' J; r& s: T第三次修正項4 m& Z0 l' t/ z( W$ e% o
d[0]=c[0]; //real minmum
) B- J7 G; t7 y6 p4 u) |d[1]=min(c[1], c[2]);
+ K9 g4 P# P* t C8 Ad[2]=max(c[1], c[2]);
1 H1 f6 g/ `4 d* Ed[3]=c[3];//real maximum
' Z6 K" O( j7 p E$ s% W I//d[0]~d[3]就是依序小到大的答案
7 @& z3 ~4 S. r( s' |5 m+ Z6 |3 v0 I
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
! n. Y/ w1 m" W" U2 \/ s& e$ Z% r; J, {# |: {
實做的考量
' t7 i, u; K! Y" K& F3 |1. 實做上min()跟max()應該是一起做的$ o! _3 ~( v/ f9 h6 W. n w
if(a>b)
8 N: s. K* V6 P2 ~4 R: x min = b;! B! \4 B/ A+ S- ]
max = a;
1 n$ y. u9 \8 t( n [5 Y else
5 |2 S/ j; W3 O$ o) S" R5 q5 p4 D# x min = a;
4 r! s: o8 d6 v# M% X max = b;& u- {: S3 X0 f _- h# H0 W
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
: N5 e R4 h0 ]# H3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項. y# ^4 ?7 S: x& F0 A/ W5 m# [
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|