Okay, so for all those that did attend, and for those that didn't these
are a bunch of notes I'm putting together as I wait for the sky to clear
to try to take some star trail pictures tonight.

I had fun last night.  Hope you all did too. 

--R

=======================================================================


For those that want to see the things I've done, look here:

http://www.capturing-photons.blogspot.com/
http://picasaweb.google.com/rcludw


Hugin

Great program used as a base for other programs.  It can be bit
cumbersome to use though, but it can produce great results, fairly
easily, as was demonstrated last night.

http://hugin.sourceforge.net/

If you've not seen the flickriver, you might be mesmerized for an hour,
like I was during Christmas at my parents house.  Just keep scrolling
down.

http://www.flickriver.com/photos/tags/hugin/interesting/

Hugin also has a large number of tutorials:

http://hugin.sourceforge.net/tutorials/index.shtml

Also if you're going to spend hours of time looking at panoramas anyway,
it's probably worth some time to look at the gigapan images.

http://www.gigapan.org




LuminanceHDR (formerly qtpfsgui) for High Dynamic Range pictures

For Ubuntu this was provided by the getdeb repositories.  Getdeb is/was
down, but it will probably make it's way into Ubuntu soon enough.

http://qtpfsgui.sourceforge.net/

This is a fairly nice package that will do the fattal tonemapping as
good as photoshop will, something to keep in mind.

So to understand exposure bracketing, there's a good wikipedia entry on
it.

http://en.wikipedia.org/wiki/Bracketing

For most HDR pictures 3 pictures, each 1 EV apart is good.  For the
sunset picture I did intervals of 2EV.  

Alternatively I could have done 5 pictures in 1EV increments from the
range of -2.0 EV to 2.0 EV would have worked swell too.  Most cameras
can do the EV, but not all of them will do the automatic bracketing.




Focus Stacking:

This is the tutorial I pretty much followed, except I started
with .JPG's and not .TIF's.  This requires Hugin.

http://photoblog.edu-perez.com/2009/01/greater-depth-field-macro.html

For those that don't want to read:
align_image_stack -m -a AIS_ *.JPG  #JPG may need to be jpg instead.
enfuse -o result.tif --wExposure=0 --wSaturation=0 --wContrast=1 \
--HardMask AIS_????.tif



Color Profiling:

http://www.argyllcms.com/

You may need to compile this one by hand in order for it to properly
work.  There's a list of equipment that Argyll will work with if you're
looking to buy something ( or just bring your display to me with a cold
beer or two, and I'll profile it for you).

Also for many printers, cameras and scanners, it's possible to get a
color profile (.icc file) for the device.  UFRaw makes many profiles
available for different cameras.  

Also the x-rite color checker passport is useful not only for color
checking, but for instant tweaking of white-balance and exposure.

http://www.amazon.com/X-Rite-MSCCPP-ColorChecker-Passport/dp/B002NU5UW8

The colorimeter I have is a colormunki create: 

http://www.colormunki.com/product/show?product=create

.icc profiles are supported by gnome, gimp, UFRaw and many other
graphics programs.



EyeFI for Linux:

The trick is to install the EyeFi and use it under windows first.  Then
you can get the upload key.

Once you have the upload key you can use this:

http://returnbooleantrue.blogspot.com/2009/04/eye-fi-standalone-server-version-20.html
http://github.com/tachang/EyeFiServer

(Look in the Release 2.0 directory)

Put the upload key in the configuration file in the right spot, then run
the server with the -c option pointing to your config file.

To add a new wi-fi network, use this:
http://dave-hansen.blogspot.com/2009/02/new-release-008.html

There exists an android app called "Wi-Fi Droid" that does the same
thing as the server above.


Picture Frames:

This is the part I didn't get to last night.  I wrote a python script
(addpic.py) to easily convert images to a 1024x768 frame.  This script
chooses the height or width of the image and resizes it down, keeping
the aspect correct, allowing the use to save space on a 2gig card since
the display won't even do 1MP yet alone 12MP.  

I can go through my images drag them into the terminal where the script
is running, hit return, and the images will pop into the card at a lower
resolution.



#!/usr/bin/env python


def read_params(path):
    """
    Returns a tuple in the form of
    (last file number, width, height, keepaspect ratio)
    To get the current file number add one to the last file number.
    """

    filename="%s/.idx"
    file=open(filename%path,"r")
    data = file.readline() 
    file.close()

    (fileno, width, height, keepaspect)=tuple(data.split(","))
    fileno=int(fileno)
    width=int(width)
    height=int(height)
    keepaspect=bool(keepaspect) 
    return (fileno, width, height, keepaspect)
    
    
        

def write_params(path, params):
    """
    Writes the tuple in the form of
    (last file number, width, heigh, keepaspect ratio)
    The last file number is the last one written to disk.
    """

    filename="%s/.idx"
    f=open(filename%path,"w")
    outparams=map(str,params)
    f.write(",".join(outparams))
    f.close()


def resize_image(imagefile, width, height, keepaspect, path, fileno):
    
    import Image
    iml = Image.open(imagefile)
    x,y = iml.size
    ratio = float(x) / float(y)
    w=width
    h=height
    if keepaspect:
        if ratio > 1.0:
            h=int (width / ratio)
        else:
            w=int (ratio * height)

    size=4-len(str(fileno)) 
    prefix = size * "0"
    filename=prefix + str(fileno) + ".jpg"
    outputpath=path+"/images/"+filename

    print "Converting %s --> %s " % (imagefile, outputpath)
    newiml=iml.resize((w,h), Image.ANTIALIAS)

    newiml.save(outputpath)

    

def clean_card(path):
    import os
    if path=="":
        raise ValueError("Empty Path")
    if path[0] != "/":
        raise ValueError("Not absolute path")
    if path=="/":
        raise ValueError("Not the root filesystem, are you mad?")
    if path==os.environ["HOME"]:
        raise ValueError("Not going to delete your home filesystem, sorry")

    os.system("rm -rf %s/*" % path)
    os.system("mkdir %s/images" %path)



        
def main():
    from optparse import OptionParser
    parser=OptionParser()
    parser.add_option("-n", "--new", default=False, action="store_true", dest="new", help="New card")
    parser.add_option("-x", "--width", default=800, type="int", dest="width", help="Width",
            metavar="WIDTH")
    parser.add_option("-y", "--height", default=600, type="int", dest="height", help="Height",
            metavar="HEIGHT")
    parser.add_option("-a", "--noaspect", action="store_false", dest="keepaspect", help="Don't keep aspect")
    parser.add_option("-p", "--path", default="/media/Pictures", type="string", dest="path", help="Path to sdcard", metavar="PATH")
    parser.add_option("-c", "--pipe", action="store_true", dest="pipe", help="read files names from standard input", default=False)

    (options,args) = parser.parse_args()

    if options.new==True:
        print "Are you sure you want to delete the card and it's contents at %s (y/N)?" % options.path
        input=raw_input()
        if input != "y" and input != "Y":
            exit()
        clean_card(options.path)
        write_params(options.path, (0, options.width, options.height, options.keepaspect))
        
    (file_number, width, height, keepaspect) = read_params(options.path)

    for arg in args:
        resize_image(arg, width, height, keepaspect, options.path, file_number+1)
        file_number+=1

    if options.pipe:
        print
        print "Drag and drop files here, then press return to process"
        print "CTRL-D to Exit"
        print

        while True:
            try:
                line=raw_input().strip() #split("'").reverse()
                line = line.split("'")
                line.reverse()
                while len(line) > 0:
                    arg=line.pop().strip()
                    if arg!='':
                        resize_image(arg, width, height, keepaspect, options.path, file_number+1)
                        file_number+=1
            
            except EOFError:
                break            
        
            
    write_params(options.path, (file_number, options.width, options.height, options.keepaspect))



if __name__=="__main__":
    main()
_______________________________________________
Fwlug mailing list
[email protected]
http://fortwaynelug.org/mailman/listinfo/fwlug_fortwaynelug.org

Reply via email to