TPCCLIB
Loading...
Searching...
No Matches
mrprior.c
Go to the documentation of this file.
1
7/*****************************************************************************/
8#include "libtpcrec.h"
9/*****************************************************************************/
10
11/*****************************************************************************/
15float med9(
17 float *inp,
19 int dim
20) {
21// xxx
22// xXx
23// xxx
24 float w[9], *p;
25 int n=0;
26
27 /* upper row */
28 p=inp-dim-1;
29 w[n]=*p++; if(isfinite(w[n])) n++;
30 w[n]=*p++; if(isfinite(w[n])) n++;
31 w[n]=*p; if(isfinite(w[n])) n++;
32 /* mid row */
33 p=inp-1;
34 w[n]=*p++; if(isfinite(w[n])) n++;
35 w[n]=*p++; if(isfinite(w[n])) n++;
36 w[n]=*p; if(isfinite(w[n])) n++;
37 /* lower row */
38 p=inp+dim-1;
39 w[n]=*p++; if(isfinite(w[n])) n++;
40 w[n]=*p++; if(isfinite(w[n])) n++;
41 w[n]=*p; if(isfinite(w[n])) n++;
42 /* Median */
43 return(fmedian(w, n));
44}
45/*****************************************************************************/
49float med21(
51 float *inp,
53 int dim
54) {
55// oxxxo
56// xxxxx
57// xxXxx
58// xxxxx
59// oxxxo
60 float w[21], *p;
61
62 /* 1st row */
63 p=inp-2*dim-1; w[0]=*p++; w[1]=*p++; w[2]=*p;
64 /* 2nd row */
65 p=inp-dim-2; w[3]=*p++; w[4]=*p++; w[5]=*p++; w[6]=*p++; w[7]=*p;
66 /* 3rd row */
67 p=inp-2; w[8]=*p++; w[9]=*p++; w[10]=*p++; w[11]=*p++; w[12]=*p;
68 /* 4th row */
69 p=inp+dim-2; w[13]=*p++; w[14]=*p++; w[15]=*p++; w[16]=*p++; w[17]=*p;
70 /* 5th row */
71 p=inp+2*dim-1; w[18]=*p++; w[19]=*p++; w[20]=*p;
72 /* Median */
73 return(fmedian(w, 21));
74}
75/*****************************************************************************/
79 float *img,
81 float beta,
83 float *med_coef,
85 int dim,
87 float small,
89 int maskdim,
91 float *maxm
92) {
93 int i, j;
94 float *iptr, *mptr, med, f, mmax=0.0;
95 float one_minus_beta=1.0-beta;
96
97 //printf("do_prior(%d, %d)\n", dim, maskdim); fflush(stdout);
98 for(i=0; i<dim*dim; i++) med_coef[i]=0.0;
99
100 if(maskdim==3) {
101 iptr=img+dim+1;
102 mptr=med_coef+dim+1;
103 for(j=1; j<dim-1; j++) {
104 for(i=1; i<dim-1; i++) {
105 if(*iptr<=small) {
106 *mptr=0.0;
107 } else {
108 med=med9(iptr, dim);
109 if(med==0.0) {
110 *mptr=0.0;
111 } else {
112 f=med/(beta*(*iptr) + one_minus_beta*med);
113 if(f>1.0E-08) *mptr=f; else *mptr=0.0;
114 }
115 }
116 if(*mptr>mmax) mmax=*mptr;
117 iptr++; mptr++;
118 }
119 iptr+=2; mptr+=2;
120 }
121 if(maxm!=NULL) *maxm=mmax;
122 //printf("out from do_prior()\n"); fflush(stdout);
123 return;
124 }
125
126 if(maskdim==5) {
127 iptr=img+2*dim+2;
128 mptr=med_coef+2*dim+2;
129 for(j=2; j<dim-2; j++) {
130 for(i=2; i<dim-2; i++) {
131 if(*iptr<=small) {
132 *mptr=0.0;
133 } else {
134 med=med21(iptr, dim);
135 if(med==0.0) {
136 *mptr=0.0;
137 } else {
138 f=med/(beta*(*iptr) + one_minus_beta*med);
139 if(f>1.0E-08) *mptr=f; else *mptr=0.0;
140 }
141 }
142 if(*mptr>mmax) mmax=*mptr;
143 iptr++; mptr++;
144 }
145 iptr+=4; mptr+=4;
146 }
147 if(maxm!=NULL) *maxm=mmax;
148 //printf("out from do_prior()\n"); fflush(stdout);
149 return;
150 }
151}
152/*****************************************************************************/
153
154/*****************************************************************************/
float fmedian(float *data, long long int n)
Definition imgminmax.c:593
Header file for libtpcrec.
float med21(float *inp, int dim)
Definition mrprior.c:49
float med9(float *inp, int dim)
Definition mrprior.c:15
void do_prior(float *img, float beta, float *med_coef, int dim, float small, int maskdim, float *maxm)
Definition mrprior.c:77