|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案" X- q( H2 z% [' |! I; D6 B8 B- O! r
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.5 U4 a" f# f" h+ v3 g$ l
4 d* h8 X* M5 s$ a; {* t1 `! g- c
舉個4進4出的例子:2 I8 w) o8 k2 r" `4 P( A! e
input [word length] a[4];
6 u% E/ j; t. f+ G- a2 \5 _reg [word length] b[4], c[4];# `9 q( Q0 ]& C0 z% m
第一次排序
' V- ]! n2 g+ Ab[0]=min(a[0], a[1]);
6 W9 _# }+ _5 w5 H& u9 Vb[1]=max(a[0], a[1]);: X4 C. G, ^, U5 k0 {/ \$ |2 T0 ~
b[2]=min(a[2], a[3]);! ~# Q. L& }3 y+ \ c# n
b[3]=max(a[2], a[3]);
& }7 i5 R6 @9 V% P* b& b第二次排序, ]) f- c9 n5 M0 M# P
c[0]=min(b[0], b[2]); //real minmum0 |/ U1 J8 L8 [ \+ y/ S
c[1]=max(b[0], b[2]);9 \- I! w2 g$ P. S
c[2]=min(b[1], b[3]);9 Z8 _6 ]' {( p5 j; l; x, N! a
c[3]=max(b[1], b[3]);//real maximum! k% D$ T! r' S I( f) ~! E
第三次修正項& c5 i, `* N9 T( C2 i/ P
d[0]=c[0]; //real minmum T# Z6 B3 h7 B' z
d[1]=min(c[1], c[2]);
/ t( ~( H7 S/ \% v c! `d[2]=max(c[1], c[2]);2 L2 Y( ]1 g, Y$ D6 l# c
d[3]=c[3];//real maximum
; z% C; J4 x. l//d[0]~d[3]就是依序小到大的答案8 N4 N! q" ?8 Y' @$ S L1 j* n
& k5 U2 ]: s! U& s
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
& g& O1 L- J* R3 J+ g) t& g- I+ [0 D& Z) U, @3 s& ^! ]
實做的考量
K8 ^' v1 b; k o4 r1. 實做上min()跟max()應該是一起做的
/ d0 X; C8 F* z# K if(a>b)7 m# x6 ?& I. _' t0 Y3 @6 ~3 p7 ^
min = b;- u3 [: Q; e: J) }
max = a;
( I: {/ x. } I' R else Y) Q3 {9 o( m0 D+ D
min = a;
" h1 B+ R4 q3 X5 z5 X5 u max = b;. D$ ^ C8 j. F
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.% ~" m$ l) f1 c' m% F
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.. o2 H/ x# i& t- n8 O1 N
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|