720 likes | 813 Views
Twas the Lecture Before Holiday Break. Readings Present Makefiles Image Array Manipulation and I/O Simple Widget Programs. Holiday Reading. The Cuckoo’s Egg (Gift Quiz Material) References for doing homework and final project Gumley Chapters 2, 3.1-3.2,4.1-4.4 (programming)
E N D
Twas the Lecture Before Holiday Break Readings Present Makefiles Image Array Manipulation and I/O Simple Widget Programs
Holiday Reading • The Cuckoo’s Egg (Gift Quiz Material) References for doing homework and final project • Gumley Chapters • 2, 3.1-3.2,4.1-4.4 (programming) • 7.1-7.5 (displaying images) • 9.1-9.3 (GUI programming) • UNIX Power Tools Chapters • 48-51
netpbm.tgz netpbm.tgz This is the package that contains the entire PBMPLUS (also known as netpbm) and is distributed in a format known as Compressed TAR File or gzipped TAR file
present.tgz • To illustrate how to process these types of files, there is a file called simpler file (present.tgz) which can be accessed via anonymous ftp from % ftp ftp.cis.rit.edu
Anonymous ftp session login % ftp ftp.cis.rit.edu Name (ftp.cis.rit.edu:rvrpci): anonymous 331 Guest login ok, send your complete e-mail address as password. Password:
Most important ftp command ftp> ?
ftp session change directory ftp> cd people/rolo/simg726 250 "/people/rolo/simg726" is new cwd. ftp> ls 200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. Makefile_example.tgz fortran_stats.tgz present.tgz 226 Listing completed. 54 bytes received in 0.015 seconds (3.50 Kbytes/s)
ftp file transfer type ftp> ascii 200 Type okay. ftp> binary 200 Type okay.
ftp getting a single file ftp> get present.tgz 200 PORT command successful. 150 Opening ASCII mode data connection for present.tgz (1211 bytes). 226 Transfer completed. local: present.tgz remote: present.tgz 1219 bytes received in 0.015 seconds (80.45 Kbytes/s)
Getting multiple files ftp> prompt Interactive mode off. ftp> hash Hash mark printing on (8192 bytes/hash mark). ftp> mget *.tgz 200 PORT command successful. 150 Opening ASCII mode data connection for Makefile_example.tgz (31544 bytes). ##
Getting out of ftp ftp> quit 221 Goodbye.
Most common ftp mistake • Sending a binary file under ASCII mode • Result • Characters not conforming to the ASCII character set are removed • ALWAYS • Check the size of the source file and the transferred file
Uncompressing and UnTAR • To uncompress the file % gunzip present.tgz • To extract the contents of the tar file % tar xvf present.tar • Challenge - look at the file xmas.c and figure out what it does % cd present % more xmas.c
Compiling the Package • To compile or build the package, a Makefile is typically present which is an automatic mechanism to compile all the files and place them in the proper locations % make • To run the program % xmas
What is a Makefile • A makefile is a description of how to build “things” in UNIX • Automates the creation of “stuff” • It is different from a script or batch file • Describes the relationship of components to the resulting object • Keeps track of intermediate results and their age
Other Makefile examples • Makefile_example.tgz • Fortran_stats.tgz
Makefile_example • Take a raw file -> convert to pgm image • Take pgm image -> rotate image • Take rotated image -> label image • Makefiles work on file dependencies
[Mm]akefile % more Makefile MyCat_labeled.pgm : MyCat_rotated.pgm label.dat ppmlabel -x 0 -y 200 -file label.dat MyCat_rotated.pgm > MyCat_labeled.pgm MyCat_rotated.pgm : MyCat.pgm pnmrotate 45 MyCat.pgm > MyCat_rotated.pgm MyCat.pgm : MyCat.raw rawtopgm 256 256 MyCat.raw > MyCat.pgm clean: rm MyCat_labeled.pgm MyCat_rotated.pgm MyCat.pgm
If a file is out of date… • If you edit a file and update it, the makefile will know • Example • Edit label.dat to some other new text • Type make again • Look at the image
Fortran_stats example • Compile a fortran program that computes the mean of 1,2,3,4,5 • To compile the program % make • To run the program % stats
Fortran_stats % more Makefile stats : main.o sum.o mean.o g77 -o stats main.o sum.o mean.o main.o : main.f g77 -c main.f sum.o : sum.f g77 -c sum.f mean.o : mean.f g77 -c mean.f clean: rm *.o
Fortran_stats % more Makefile FORTRAN = g77 stats : main.o sum.o mean.o $(FORTRAN) -o stats main.o sum.o mean.o main.o : main.f $(FORTRAN) -c main.f sum.o : sum.f $(FORTRAN) -c sum.f mean.o : mean.f $(FORTRAN) -c mean.f clean: rm *.o
Typical unreadable makefile % more makefile FORTRAN = g77 OBJS = main.o mean.o sum.o .f.o: $(FORTRAN) -c $*.f stats: $(OBJS) $(FORTRAN) -o stats $(OBJS) clean: rm *.o
Array Manipulation in IDL • Let’s create an array representing a multiband image IDL> image=bindgen(2,3,4) IDL> print,image 0 1 2 3 4 5
Array Manipulation in IDL • image continued 6 7 8 9 10 11 12 13 14 15 16 17
Array Manipulation in IDL • image continued 18 19 20 21 22 23
Array Manipulation in IDL • Extract the first and last band of the image IDL> print,image(*,*,0) 0 1 2 3 4 5 IDL> print,image(*,*,3) 18 19 20 21 22 23
Array Manipulation in IDL • Extract the first and last band of the image simultaneously IDL> print,image(*,*, [0,3] ) 0 1 2 3 4 5 18 19 20 21 22 23
Array Manipulation in IDL • Extracting the “color” or “spectral vector” of the first pixel IDL> print,image(0,0,*) 0 6 12 18
Array Manipulation in IDL • Assign band 1 to band 4 IDL> band1=image(*,*,0) IDL> image(*,*,3) = band1 • Shortcut IDL> image(*,*,3)=image(*,*,0)
Array Manipulation in IDL • Subsectioning parts of an image IDL> print,image(0:1,0:1,*) 0 1 2 3 6 7 8 9 12 13 14 15 0 1 2 3
Array Manipulation • where function to find indices of elements that meet certain criteria IDL> print, where( image gt 5 and image lt 12) • Use of other arrays to index other arrays IDL> indices=where(image gt 5 and image lt 12) IDL> image(indices)=-1
Reading & Writing Data Files • IDL can read many types of file formats • Files can be categorized into two general types • Formatted ( Readable Text & Numbers, ASCII) • Unformatted( Images)
Reading & Writing Data Files • The three IDL commands we can use for opening files are as follows openr(open a file for reading) openw(open a file for writing) openu(open a file for reading/writing)
sample_data_1.dat 0 1 2 3 4 5 6 7 8 9 10 11
Syntax for Opening Data Files • Example command for opening a file for input IDL> openr, 1, ‘sample_data_1.dat’ • The argument 1 is referred to as the logical unit number (also known as a file handle) ‘sample_data_1.dat’ is the input file name
Reading the Data • Need to allocate the array to read in the data IDL> a=fltarr( 12) OR IDL> a=fltarr( 2, 6) • Read in the data using the readf statement IDL> readf, 1, a
Closing the Data File • To close the data file you can give the following command IDL> close, 1 • A common mistake is to try to open a file(s) that is already open causing the error % OPENR: File unit is already open: 1. % Execution halted at $MAIN$ (OPENR) • Solution IDL> close, /all
Putting it all together IDL> openr, 1, ‘sample_data_1.dat’ IDL> a = fltarr( 2,12) IDL> readf, 1, a IDL> close, 1 IDL> print, a
Another Way of Reading in a File IDL> openr, lun, ‘sample_data_1.dat’, $ /get_lun IDL> a = fltarr( 2, 6 ) IDL> readf, lun, a IDL> free_lun, lun IDL> print, a
Yet Another Way IDL> file_name = ‘sample_data_1.dat’ IDL> a = fltarr( 2, 6 ) IDL> openr, lun, file_name, /get_lun IDL> readf, lun, a IDL> free_lun, lun IDL> print, a
To Output a Formatted File IDL> b = bindgen( 3, 2)*10+42 IDL> openw, lun, ‘test_output.dat’, $ /get_lun IDL> printf, lun, b IDL> free_lun, lun
test_output.dat 42 52 62 72 82 92
To Output an Unformatted File IDL> b = bindgen( 3, 2)*10+42 IDL> openw, lun, ‘test_output.dat’,$ /get_lun IDL> writeu, lun, b IDL> free_lun, lun
test_output.dat *4>HR\ • Why? Because ... *- has an ASCII value of 42 decimal 4- has an ASCII value of 52 decimal >- has an ASCII value of 62 decimal H- has an ASCII value of 72 decimal R- has an ASCII value of 82 decimal \- has an ASCII value of 92 decimal
test_P2_image.pgm P2 3 2 255 42 52 62 72 82 92
test_P5_image.pgm P5 3 2 255 *4>HR\
Testing Out Your or Somebody Else’s Image I/O Routines • Read in a small test image IDL> a=Read_P2_Image(“test_input.pgm”) • Write out the small test image IDL> Write_P2_Image,“test_output.pgm”,a • Read in the small test image you just wrote IDL> b=Read_P2_Image(“test_output.pgm”) • Statistics (sum, mean, etc.) must be equal • Finally, sum_squares( a - b ) must be 0.0