rolando v. raqueñofriday, june 19, 2015 1 twas the lecture before holiday break readings present...

72
Rolando V. Raqueño Sunday, March 27, 20 22 1 1 Twas the Lecture Before Holiday Break Readings Present Makefiles Image Array Manipulation and I/O Simple Widget Programs

Post on 20-Dec-2015

213 views

Category:

Documents


0 download

TRANSCRIPT

Rolando V. Raqueño Tuesday, April 18, 202311

Twas the Lecture Before Holiday Break

Readings

Present

Makefiles

Image Array Manipulation and I/O

Simple Widget Programs

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 202366

Most important ftp command

ftp> ?

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 202388

ftp file transfer type

ftp> ascii

200 Type okay.

ftp> binary

200 Type okay.

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 20231111

Getting out of ftp

ftp> quit

221 Goodbye.

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 20231616

Other Makefile examples

• Makefile_example.tgz• Fortran_stats.tgz

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 20232424

Array Manipulation and I/O

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 20232626

Array Manipulation in IDL• image continued

6 7 8 9

10 11

12 13

14 15

16 17

Rolando V. Raqueño Tuesday, April 18, 20232727

Array Manipulation in IDL

• image continued

18 19

20 21

22 23

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 20233434

Reading & Writing Data Files in IDL

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 20233737

sample_data_1.dat

0 1

2 3

4 5

6 7

8 9

10 11

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 20234545

test_output.dat

42 52 62

72 82 92

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 20234848

test_P2_image.pgm

P2

3 2

255

42 52

62 72

82 92

Rolando V. Raqueño Tuesday, April 18, 20234949

test_P5_image.pgm

P5

3 2

255

*4>HR\

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 20235858

Widget Programming

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 20236262

Result of the Widget_Base

• You should see a blank window similar to the one below

Rolando V. Raqueño Tuesday, April 18, 20236363

Other Widget Types

• To invoke a Widget_ButtonIDL> button1 = Widget_Button( base )

IDL> Widget_Control, base, /realize

Rolando V. Raqueño Tuesday, April 18, 20236464

To Change the Title of a Button Widget

IDL>Widget_Control,button1,Set_Value=“OK”

Rolando V. Raqueño Tuesday, April 18, 20236565

Destroying a Widget

IDL> Widget_Control,button1,/destroy

Rolando V. Raqueño Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 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 Tuesday, April 18, 20237171

Getting Information from a Widget

IDL>widget_control,button1,get_value=button_value

IDL>print,button_value

First Button

Rolando V. Raqueño Tuesday, April 18, 20237272

Have a Safe and Happy Holiday

Remember, friends don’t let friends program drunk