|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
* N2 i3 Y: p. b( J至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
6 u2 k" _) k% m% B0 G. l6 ?
, p5 f3 P! J3 `. d4 p; @, M4 v舉個4進4出的例子:
1 n4 b2 {1 U* i5 u4 a: `input [word length] a[4];5 Y2 N( K1 e% J7 z7 P
reg [word length] b[4], c[4];( v* F8 ^0 [ r; t- F
第一次排序
! T, y; T' S$ H8 jb[0]=min(a[0], a[1]);8 p2 C& }6 l% v
b[1]=max(a[0], a[1]);
, U, J1 k8 V8 [) X$ u" L& Xb[2]=min(a[2], a[3]);
1 o: D- n4 p8 { y4 ?' Sb[3]=max(a[2], a[3]);7 h0 P! k- U5 v9 e2 j# e
第二次排序 Y5 g7 v5 T; B$ u6 ]& D# b
c[0]=min(b[0], b[2]); //real minmum" G/ h8 \9 l3 x, o
c[1]=max(b[0], b[2]);- M$ e% O, T: l: \4 \1 b
c[2]=min(b[1], b[3]);
. f, H- k# c* o4 [- fc[3]=max(b[1], b[3]);//real maximum: }- M i% s1 |
第三次修正項4 {) `1 ?2 _% \2 C/ I
d[0]=c[0]; //real minmum
7 S. E9 ~, d0 f9 P8 `d[1]=min(c[1], c[2]);8 l1 u' w y) E/ Q% o
d[2]=max(c[1], c[2]);# l+ ^/ X0 L7 x" D
d[3]=c[3];//real maximum5 G; |9 f- x5 o/ Y+ [: \0 l& ~5 p' }
//d[0]~d[3]就是依序小到大的答案% ?1 J8 |! g8 ]0 G! B5 T; m/ ^2 q
8 W2 m* d% h0 J1 ]這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
H- q( b3 j8 ?- T; e2 T4 Q" J+ I; H9 v- q
實做的考量
& Y: `* e# @6 ?- L& Z1. 實做上min()跟max()應該是一起做的
; L4 f# R9 |2 h6 u if(a>b): }0 `+ b4 P" o
min = b;9 j: Q$ t0 R# M+ \7 f! U
max = a;% B5 {; @2 K+ J2 D" i5 i# U
else
) q/ o. c3 Y# c" }1 F6 u min = a;: r, {( R0 k. s# `- ? M ]! N
max = b;
- Z- @3 i. l& B/ J8 v" A3 u9 @2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
0 S% f- U; Y! {3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
u; q- R$ a: m' Q3 q' CP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|