package edu.stanford.rsl.tutorial.atract;
import edu.stanford.rsl.conrad.data.numeric.Grid3D;
/**
* This class implements a method to remove the borders caused by the Collimator.
* Use this for 2-D detectors.
* @author Marco Boegel (Reco Project 2012 - Individual Project)
*
*/
public class BorderRemoval2D {
/**
* Use this method in combination with the Laplace2D Filter.
* This method searches for the collimator borders in a laplacian filtered image.
* The current implementation searches in each detector for the first and last non-zero element.
* The coordinates with the maximum number of non-zero elements across all projections are then assumed to be the
* borders and set to zero.
* @param input Laplacian filtered Sinogram
*/
public void applyToGrid(Grid3D input) {
double eps = 0.1;
int maxProj = input.getSize()[2];
int maxU = input.getSize()[0];
int maxV = input.getSize()[1];
int counter[][] = new int[maxV][maxU];
for(int p = 0; p < maxProj; p++) {
//left border
for(int v = 0; v < maxV; v++) {
for(int u = 0; u < maxU/2; u++){
if(input.getAtIndex(u,v,p)*-1.0 > eps) {
counter[v][u]++;
break;
}
}
}
//top border
for(int u = 0; u < maxU; u++) {
for(int v = 0 ; v < maxV/2; v++){
if(input.getAtIndex(u,v,p)*-1.0 > eps) {
counter[v][u]++;
break;
}
}
}
//right border
for(int v = 0; v < maxV; v++){
for(int u = maxU-1; u > maxU/2; u--){
if(input.getAtIndex(u,v,p)*-1.0 > eps) {
counter[v][u]++;
break;
}
}
}
//bottom border
for(int u = 0 ; u < maxU; u++){
for(int v = maxV-1; v > maxV/2; v--){
if(input.getAtIndex(u,v,p)*-1.0 > eps) {
counter[v][u]++;
break;
}
}
}
}
int horizontal[] = new int[maxU];
int vertical[] = new int[maxV];
for(int i = 0; i < maxU; i++) {
for(int j = 0 ; j < maxV; j++){
horizontal[i] += counter[j][i];
vertical[j] += counter[j][i];
}
}
//left
int tmp1 = 0;
int max1 = 0;
for(int i = 0; i < maxU/2; i++) {
if(horizontal[i] > max1) {
max1 = horizontal[i];
tmp1 = i;
}
}
//right
int tmp2 = 0;
int max2 = 0;
for(int j = maxU-1; j > maxU/2; j--) {
if(horizontal[j] > max2) {
max2 = horizontal[j];
tmp2 = j;
}
}
//top
int tmp3 = 0;
int max3 = 0;
for(int i = 0; i < maxV/2; i++) {
if(vertical[i] > max3) {
max3 = vertical[i];
tmp3 = i;
}
}
//bottom
int tmp4 = 0;
int max4 = 0;
for(int j = maxV-1; j > maxV/2; j--) {
if(vertical[j] > max4) {
max4 = vertical[j];
tmp4 = j;
}
}
for(int i = 0; i < maxProj; i++) {
for(int v = 0; v < maxV; v++){
input.setAtIndex( tmp1,v,i, 0);
input.setAtIndex(tmp1+1,v,i, 0);
input.setAtIndex( tmp2,v,i, 0);
input.setAtIndex(tmp2-1,v,i, 0);
}
for(int u = 0; u < maxU; u++){
input.setAtIndex(u, tmp3, i, 0);
input.setAtIndex(u,tmp3+1,i,0);
input.setAtIndex(u, tmp4, i, 0);
input.setAtIndex(u, tmp4-1, i, 0);
}
}
}
}
/*
* Copyright (C) 2010-2014 Marco B�gel
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/