#include <stdio.h> #include <sys/types.h> #include <tiffio.h> int outside,rorb; uint32 *tiff_read2raster(char filename[], uint32 *nrow, uint32 *ncol); int tiff_raster2file(char filename[], uint32 *raster, uint32 nrow, uint32 ncol); int getalpha(uint32 pixel); int getred(uint32 pixel); int getgreen(uint32 pixel); int getblue(uint32 pixel); void inttouint(int *outarray,uint32 *image,uint32 rows, uint32 cols); int lookupandback(int *outarray,int i, int j, uint32 rows, uint32 cols); int lookdownandright(int *outarray, int i, int j, uint32 rows, uint32 cols); void setcolor (uint32 *image,int i, int j,uint32 rows, uint32 cols, int red, int green, int blue); void PassTwice(uint32 *image, uint32 rows, uint32 cols); int condition(int r, int g, int b); int getalpha(uint32 pixel) { return(((pixel) & 0xFF000000) >>24); } int getblue(uint32 pixel) { return(((pixel) & 0x00FF0000) >>16); } int getgreen(uint32 pixel) { return(((pixel) & 0x0000FF00) >>8); } int getred(uint32 pixel) { return(((pixel) & 0x000000FF)); } void inttouint(int *outarray, uint32 *image, uint32 rows, uint32 cols) { int i,j; for (i=0;i<rows;i++){ for (j=0;j<cols;j++){ setcolor(image,i,j,rows, cols,outarray[i*cols+j],outarray[i*cols+j],outarray[i*cols+j]); } } } void setcolor(uint32 *image,int i, int j,uint32 rows, uint32 cols, int red, int green, int blue) { image[i*cols+j] = blue*256*256 + green *256 + red; } int lookupandback(int *outarray,int i, int j, uint32 rows, uint32 cols) { int min; //Wrong if edge pixel is within 255 pixels of an object, but will be corrected //in second pass printf("outside=%d\n",outside); if (i==0 || j==0) return(outside); min = outarray[i*cols+j -1]; if (outarray[(i-1)*cols + j]< min) min = outarray[(i-1)*cols + j]; return min; } int lookdownandright(int *outarray, int i, int j, uint32 rows, uint32 cols) { int min; // remember will not be used unless its smaller than current value if (i==rows-1 || j==cols-1) return(outside); min = outarray[i*cols+j +1]; if (outarray[(i+1)*cols + j]< min) min = outarray[(i+1)*cols + j]; return min; } void PassTwice(uint32 *image,uint32 rows,uint32 cols) { int outarray[rows*cols]; int i,j,r,g,b,min; for(i=0;i<rows;i++) { for(j=0;j<cols;j++) { r = getred(image[i*cols + j]); g = getgreen(image[i*cols + j]); b = getblue(image[i*cols + j]); if (condition(r, g, b)==0) outarray[i*cols + j] = 0; else outarray[i*cols+j] = lookupandback(outarray,i,j,rows,cols) + 1; if (outarray[i*cols+j] > 255) outarray[i*cols+j] = 255; } } for(i=rows-1;i>=0;i--) { for(j=cols-1;j>=0;j--) { r = getred(image[i*cols + j]); g = getgreen(image[i*cols + j]); b = getblue(image[i*cols + j]); if (condition(r, g, b)==1){ if (lookdownandright(outarray,i,j,rows,cols)<outarray[i*cols+j]) outarray[i*cols+j] = lookdownandright(outarray,i,j,rows,cols)+1; } } } inttouint(outarray,image,rows,cols); } int condition(int r, int g, int b) { if (rorb ==0) { if (r+g+b==0) return 1; else return 0; } else { if (r+g+b!=0) return 1; else return 0; } } main(int argc, char *argv[]) { uint32 *image; uint32 rows, cols; int i,j,r,g,b, min; if(strcmp(argv[3], "zero\0")==0) outside = 0; else if(strcmp(argv[3], "inf\0")==0) outside=255; else { printf("Wrong input for border value. Border set to 255.\n"); outside=255; } if(strcmp(argv[4], "plus\0")==0) rorb=1; else if(strcmp(argv[4], "minus\0")==0) rorb=0; else{ printf("Wrong input for region value. Setting to red.\n"); rorb=1; } printf("rorb = %d\n",rorb); printf("Beginning process\n"); image = tiff_read2raster(argv[1], &rows, &cols); printf("Image is %d rows by %d columns\n", rows, cols); PassTwice(image,rows,cols); printf("Starting write process\n"); tiff_raster2file(argv[2],image, rows, cols); printf("Exiting\n"); printf("outside= %d\n",outside); }