// Pipeline Median and ssmedian // ============================================= // パイプラインメディアンフィルタ 速度比2.4 // ============================================= // 第1段 inline unsigned int plfirststage(int *a) { unsigned int s; if((a[0]>a[1])&&(a[0]>a[2])) { s=a[0]<<16; if(a[1]>a[2]) s |= (a[1]<<8)|(a[2]); else s |= (a[2]<<8)|(a[1]); } else if(a[1]>a[2]) { s=a[1]<<16; if(a[0]>a[2]) s |= (a[0]<<8)|(a[2]); else s |= (a[2]<<8)|(a[0]); } else { s=a[2]<<16; if(a[0]>a[1]) s |= (a[0]<<8)|(a[1]); else s |= (a[1]<<8)|(a[0]); } return s<<8; } // 本体 int plmedian(int *a) { unsigned int s1,s2,s3; s1=plfirststage(a+0); s2=plfirststage(a+3); s3=plfirststage(a+6); if((s1>s2)&&(s1>s3)) s1=s1<<8; else if(s2>s3) s2=s2<<8; else s3=s3<<8; if((s2>s3)&&(s2>s1)) s2=s2<<8; else if(s3>s1) s3=s3<<8; else s1=s1<<8; if((s3>s1)&&(s3>s2)) s3=s3<<8; else if(s1>s2) s1=s1<<8; else s2=s2<<8; if((s1>s2)&&(s1>s3)) s1=s1<<8; else if(s2>s3) s2=s2<<8; else s3=s3<<8; if((s1>s2)&&(s1>s3)) return s1>>24; else if(s2>s3) return s2>>24; else return s3>>24; } #if 0 // ============================================= // 総当たりソート 速度比 1 // ============================================= int ssmedian(int *a) { int i,j,t; for(i=0;i<5;i++) for(j=i+1;j<9;j++) { if(a[i]