TPCCLIB
Loading...
Searching...
No Matches
mrprior.c File Reference

Median Root Prior. More...

#include "libtpcrec.h"

Go to the source code of this file.

Functions

float med9 (float *inp, int dim)
float med21 (float *inp, int dim)
void do_prior (float *img, float beta, float *med_coef, int dim, float small, int maskdim, float *maxm)

Detailed Description

Median Root Prior.

Based on the program fbprec (Feb 1998) written by Sakari Alenius for Sun UNIX workstations.

Author
Vesa Oikonen

Definition in file mrprior.c.

Function Documentation

◆ do_prior()

void do_prior ( float * img,
float beta,
float * med_coef,
int dim,
float small,
int maskdim,
float * maxm )

Do prior in MRP reconstruction.

Parameters
imgFloat array of size dim*dim containing the image data.
betaBeta value.
med_coefMedian coefficients, an array of size dim*dim, calculated here.
dimImage dimensions.
smallLimit for too small values.
maskdimMask dimensions; 3 or 5.
maxmMax median coefficient; enter NULL if not needed.

Definition at line 77 of file mrprior.c.

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}
float med21(float *inp, int dim)
Definition mrprior.c:49
float med9(float *inp, int dim)
Definition mrprior.c:15

Referenced by mrp(), and trmrp().

◆ med21()

float med21 ( float * inp,
int dim )

Compute 5x5 median without corners from image data inside float array.

Returns
Returns the median value.
Parameters
inpPointer to central pixel in image data, around which the median is computed.
dimImage dimensions.

Definition at line 49 of file mrprior.c.

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}
float fmedian(float *data, long long int n)
Definition imgminmax.c:593

Referenced by do_prior(), and trmrp().

◆ med9()

float med9 ( float * inp,
int dim )

Compute 3x3 median from image data inside float array.

Returns
Returns the median value.
Parameters
inpPointer to central pixel in image data, around which the median is computed.
dimImage dimensions.

Definition at line 15 of file mrprior.c.

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}

Referenced by do_prior(), and trmrp().