twas the lecture before holiday break
DESCRIPTION
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) - PowerPoint PPT PresentationTRANSCRIPT
Rolando V. Raqueño Thursday, April 20, 202311
Twas the Lecture Before Holiday Break
Readings
Present
Makefiles
Image Array Manipulation and I/O
Simple Widget Programs
Rolando V. Raqueño Thursday, April 20, 202322
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
Rolando V. Raqueño Thursday, April 20, 202333
netpbm.tgz
netpbm.tgzThis 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
Rolando V. Raqueño Thursday, April 20, 202344
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
Rolando V. Raqueño Thursday, April 20, 202355
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:
Rolando V. Raqueño Thursday, April 20, 202366
Most important ftp command
ftp> ?
Rolando V. Raqueño Thursday, April 20, 202377
ftp session change directory
ftp> cd people/rolo/simg726250 "/people/rolo/simg726" is new cwd.ftp> ls200 PORT command successful.150 Opening ASCII mode data connection for /bin/ls.
Makefile_example.tgzfortran_stats.tgzpresent.tgz226 Listing completed.54 bytes received in 0.015 seconds (3.50 Kbytes/s)
Rolando V. Raqueño Thursday, April 20, 202388
ftp file transfer type
ftp> ascii
200 Type okay.
ftp> binary
200 Type okay.
Rolando V. Raqueño Thursday, April 20, 202399
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)
Rolando V. Raqueño Thursday, April 20, 20231010
Getting multiple files
ftp> promptInteractive mode off.ftp> hashHash mark printing on (8192 bytes/hash mark).
ftp> mget *.tgz200 PORT command successful.150 Opening ASCII mode data connection for Makefile_example.tgz (31544 bytes).
##
Rolando V. Raqueño Thursday, April 20, 20231111
Getting out of ftp
ftp> quit
221 Goodbye.
Rolando V. Raqueño Thursday, April 20, 20231212
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
Rolando V. Raqueño Thursday, April 20, 20231313
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
Rolando V. Raqueño Thursday, April 20, 20231414
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
Rolando V. Raqueño Thursday, April 20, 20231515
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
Rolando V. Raqueño Thursday, April 20, 20231616
Other Makefile examples
• Makefile_example.tgz• Fortran_stats.tgz
Rolando V. Raqueño Thursday, April 20, 20231717
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
Rolando V. Raqueño Thursday, April 20, 20231818
[Mm]akefile% more MakefileMyCat_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
Rolando V. Raqueño Thursday, April 20, 20231919
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
Rolando V. Raqueño Thursday, April 20, 20232020
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
Rolando V. Raqueño Thursday, April 20, 20232121
Fortran_stats
% more Makefilestats : main.o sum.o mean.o g77 -o stats main.o sum.o mean.o main.o : main.f g77 -c main.fsum.o : sum.f g77 -c sum.fmean.o : mean.f g77 -c mean.fclean: rm *.o
Rolando V. Raqueño Thursday, April 20, 20232222
Fortran_stats% more MakefileFORTRAN = g77stats : main.o sum.o mean.o $(FORTRAN) -o stats main.o sum.o mean.o main.o : main.f $(FORTRAN) -c main.fsum.o : sum.f $(FORTRAN) -c sum.fmean.o : mean.f $(FORTRAN) -c mean.fclean: rm *.o
Rolando V. Raqueño Thursday, April 20, 20232323
Typical unreadable makefile
% more makefileFORTRAN = g77OBJS = main.o mean.o sum.o.f.o: $(FORTRAN) -c $*.fstats: $(OBJS) $(FORTRAN) -o stats $(OBJS)clean: rm *.o
Rolando V. Raqueño Thursday, April 20, 20232424
Array Manipulation and I/O
Rolando V. Raqueño Thursday, April 20, 20232525
Array Manipulation in IDL
• Let’s create an array representing a multiband imageIDL> image=bindgen(2,3,4)
IDL> print,image
0 1
2 3
4 5
Rolando V. Raqueño Thursday, April 20, 20232626
Array Manipulation in IDL• image continued
6 7 8 9
10 11
12 13
14 15
16 17
Rolando V. Raqueño Thursday, April 20, 20232727
Array Manipulation in IDL
• image continued
18 19
20 21
22 23
Rolando V. Raqueño Thursday, April 20, 20232828
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
Rolando V. Raqueño Thursday, April 20, 20232929
Array Manipulation in IDL• Extract the first and last band of the image
simultaneouslyIDL> print,image(*,*, [0,3] ) 0 1 2 3 4 5
18 19 20 21 22 23
Rolando V. Raqueño Thursday, April 20, 20233030
Array Manipulation in IDL
• Extracting the “color” or “spectral vector” of the first pixelIDL> print,image(0,0,*)
0
6
12
18
Rolando V. Raqueño Thursday, April 20, 20233131
Array Manipulation in IDL
• Assign band 1 to band 4IDL> band1=image(*,*,0)
IDL> image(*,*,3) = band1
• ShortcutIDL> image(*,*,3)=image(*,*,0)
Rolando V. Raqueño Thursday, April 20, 20233232
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
Rolando V. Raqueño Thursday, April 20, 20233333
Array Manipulation
• where function to find indices of elements that meet certain criteriaIDL> print, where( image gt 5 and image lt 12)
• Use of other arrays to index other arraysIDL> indices=where(image gt 5 and image lt 12)
IDL> image(indices)=-1
Rolando V. Raqueño Thursday, April 20, 20233434
Reading & Writing Data Files in IDL
Rolando V. Raqueño Thursday, April 20, 20233535
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)
Rolando V. Raqueño Thursday, April 20, 20233636
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)
Rolando V. Raqueño Thursday, April 20, 20233737
sample_data_1.dat
0 1
2 3
4 5
6 7
8 9
10 11
Rolando V. Raqueño Thursday, April 20, 20233838
Syntax for Opening Data Files
• Example command for opening a file for inputIDL> 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
Rolando V. Raqueño Thursday, April 20, 20233939
Reading the Data
• Need to allocate the array to read in the dataIDL> a=fltarr( 12)
ORIDL> a=fltarr( 2, 6)
• Read in the data using the readf statementIDL> readf, 1, a
Rolando V. Raqueño Thursday, April 20, 20234040
Closing the Data File
• To close the data file you can give the following commandIDL> 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
Rolando V. Raqueño Thursday, April 20, 20234141
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
Rolando V. Raqueño Thursday, April 20, 20234242
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
Rolando V. Raqueño Thursday, April 20, 20234343
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
Rolando V. Raqueño Thursday, April 20, 20234444
To Output a Formatted FileIDL> b = bindgen( 3, 2)*10+42
IDL> openw, lun, ‘test_output.dat’, $
/get_lun
IDL> printf, lun, b
IDL> free_lun, lun
Rolando V. Raqueño Thursday, April 20, 20234545
test_output.dat
42 52 62
72 82 92
Rolando V. Raqueño Thursday, April 20, 20234646
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
Rolando V. Raqueño Thursday, April 20, 20234747
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
Rolando V. Raqueño Thursday, April 20, 20234848
test_P2_image.pgm
P2
3 2
255
42 52
62 72
82 92
Rolando V. Raqueño Thursday, April 20, 20234949
test_P5_image.pgm
P5
3 2
255
*4>HR\
Rolando V. Raqueño Thursday, April 20, 20235050
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 wroteIDL> b=Read_P2_Image(“test_output.pgm”)
• Statistics (sum, mean, etc.) must be equal• Finally, sum_squares( a - b ) must be 0.0
Rolando V. Raqueño Thursday, April 20, 20235151
Multiband Image Pixel Ordering
• Band Sequential
array( column, row, band)
array( sample, line, band)• Band Interleaved by Line
array( column, band, row )
array( sample, band, line)• Band Interleaved by Pixel
array( band, column, row )
array( band, sample, line )
Rolando V. Raqueño Thursday, April 20, 20235252
Multiband Image Pixel Ordering
• Let us take the following file• test_data.dat
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
• And look at the different interleaving representations as a multiband image.
Rolando V. Raqueño Thursday, April 20, 20235353
Band Sequential Example
• If we read in the test_data.dat using the array defined as a=bindgen(2,3,4), we would get
Band 0 Band 1 Band 2 Band 30 1 6 7 12 13 18 19
2 3 8 9 14 15 20 21
4 5 10 11 16 1722 23
Rolando V. Raqueño Thursday, April 20, 20235454
Band Interleaved by Line
• If we read in test_data.dat using the array defined as a=bindgen(2,4,3), we would get
Band 0Band 1 Band 2 Band 30 1 2 3 4 5 6 7
8 9 10 11 12 1314 15
16 17 18 19 20 2122 23
Rolando V. Raqueño Thursday, April 20, 20235555
Band Interleaved by Pixel
• If we read in test_data.dat using the array defined as a=bindgen(4,2,3), we would get
Band 0 Band 1 Band 2 Band 30 4 1 5 2 6 3 7
8 12 9 13 10 14 11 15
16 20 17 21 18 2219 23
Rolando V. Raqueño Thursday, April 20, 20235656
Reform/Transpose Conversion
• To convert previous examples from BSQ to BIL, we can use the following command
• Assume a BSQ image a=bindgen(2,3,4)IDL> b = reform( a, 2, 4, 3 )
IDL> c = transpose( b, [0, 2, 1] )
• The image c is now a BIL image
Rolando V. Raqueño Thursday, April 20, 20235757
Reform/Transpose Conversion
• To convert previous examples from BSQ to BIP, we can use the following command
• Assume a BSQ image a=bindgen(2,3,4)IDL> b = reform( a, 4, 2, 3 )
IDL> c = transpose( b, [1, 2, 0] )
• The image c is now a BIP image
Rolando V. Raqueño Thursday, April 20, 20235858
Widget Programming
Rolando V. Raqueño Thursday, April 20, 20235959
Widget
• What is a widget?– It is a graphical user interface component
• Basic IDL Widget Toolkit– Widget_Base, Widget_Button– Widget_Draw, Widget_DropList– Widget_Label, Widget_List– Widget_Slider, Widget_Text
Rolando V. Raqueño Thursday, April 20, 20236060
Widget_Base
• This widget type is used to hold other widget types. You can think of this as your blank canvas. It is also known as the “parent window” in other terms.
• To invoke a widget base, you would give the following commands
IDL> base = Widget_Base()
IDL> Widget_Control, base, /realize
Rolando V. Raqueño Thursday, April 20, 20236161
What the IDL Commands Mean
• base = Widget_Base()– In this function call, base will contain a unique
identifier (ID) to this specific instance of a blank window. The window is still described in memory, but not displayed
• Widget_Control, base, /realize– This tells IDL to display the entity with the ID
value in the variable base
Rolando V. Raqueño Thursday, April 20, 20236262
Result of the Widget_Base
• You should see a blank window similar to the one below
Rolando V. Raqueño Thursday, April 20, 20236363
Other Widget Types
• To invoke a Widget_ButtonIDL> button1 = Widget_Button( base )
IDL> Widget_Control, base, /realize
Rolando V. Raqueño Thursday, April 20, 20236464
To Change the Title of a Button Widget
IDL>Widget_Control,button1,Set_Value=“OK”
Rolando V. Raqueño Thursday, April 20, 20236565
Destroying a Widget
IDL> Widget_Control,button1,/destroy
Rolando V. Raqueño Thursday, April 20, 20236666
To Destroy the Base Widget
IDL> Widget_Control,base,/destroy– If there are any widgets attached to the base,
those children widgets will also be destroyed.
Rolando V. Raqueño Thursday, April 20, 20236767
Other Widget Examples
IDL> base=widget_base(column=1)
IDL> button=widget_button(base)
IDL> label=widget_label(base)
IDL> widget_control,base,/realize
Rolando V. Raqueño Thursday, April 20, 20236868
Other Widget Examples
IDL> base1=widget_base(column=1)
IDL> list1=widget_list(base1)
IDL> slider1=widget_slider(base1)
IDL> widget_control, base1, /realize
Rolando V. Raqueño Thursday, April 20, 20236969
Adding to the Previous Example
IDL> base2=widget_base(base1,row=2)
IDL> button1=widget_button(base2, value="First Button")
IDL> button2=widget_button(base2, value="Second Button")
IDL> widget_control,base1,/realize
Rolando V. Raqueño Thursday, April 20, 20237070
Modifying Previous Example
IDL> widget_control,slider1,set_value=100
IDL> widget_control,base1,/realize
IDL> widget_control,button2,set_value=
"Last Button"
Rolando V. Raqueño Thursday, April 20, 20237171
Getting Information from a Widget
IDL>widget_control,button1,get_value=button_value
IDL>print,button_value
First Button
Rolando V. Raqueño Thursday, April 20, 20237272
Have a Safe and Happy Holiday
Remember, friends don’t let friends program drunk