FocalBlur: Difference between revisions
Jump to navigation
Jump to search
(angles as Fermat's spiral instead of random) |
(→Notes) |
||
(12 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{Infobox script-repo | |||
|type = script | |||
|filename = focal_blur.py | |||
|author = [[User:Jarl.Underhaug|Jarl Underhaug]] | |||
|license = - | |||
}} | |||
[[Image:StylizedFocalBlur.png|550px|right]] | |||
==Description== | ==Description== | ||
Line 7: | Line 18: | ||
Load the script using the [[run]] command. Execute the script using PyMOL syntax: | Load the script using the [[run]] command. Execute the script using PyMOL syntax: | ||
<source lang="python"> | <source lang="python"> | ||
FocalBlur aperture=2.0,samples= | FocalBlur aperture=2.0,samples=20,ray=1 | ||
</source> | </source> | ||
or using python syntax: | or using python syntax: | ||
<source lang="python"> | <source lang="python"> | ||
FocalBlur(aperture=2.0,samples= | FocalBlur(aperture=2.0,samples=20,ray=1) | ||
</source> | </source> | ||
Line 20: | Line 31: | ||
* When using raytracing, the image creation will take ''n'' times longer than normal, where ''n'' is the number of samples. | * When using raytracing, the image creation will take ''n'' times longer than normal, where ''n'' is the number of samples. | ||
* The aperture is related to the aperture on a camera, and is inversely proportional to the f-number. | |||
* The aperture is | |||
===Bugs=== | |||
* FocalBlur uses the Python Image Library (PIL), a necessary components of PIL is missing in the Windows version of PyMOL | |||
* There is a bug when not using ray tracing with the free version of PyMOL | |||
===Examples=== | ===Examples=== | ||
<gallery perrow=3 widths=300 heights=240> | |||
Image:FocalBlur_a1.0_r1.png|FocalBlur aperture=1,samples=100,ray=1 | |||
Image:FocalBlur_a2.0_r1.png|FocalBlur aperture=2,samples=100,ray=1 | |||
Image:FocalBlur_a4.0_r1.png|FocalBlur aperture=4,samples=400,ray=1 | |||
Image:FocalBlur_a4.0_r0.png|FocalBlur aperture=4,samples=400,ray=0 | |||
Image:Focal_blur _ex6.png | |||
Image:Focal blur_ex_ap3.png | |||
Image:Focal blur_ex_ap3_mode1.png | |||
Image:Focal blur_ex_ap3_mode2.png | |||
Image:Focal blur_ex_ap3_mode3.png | |||
</gallery> | |||
==Script== | ==Script== | ||
Line 40: | Line 57: | ||
<source lang="python"> | <source lang="python"> | ||
from pymol import cmd | from pymol import cmd | ||
from tempfile import mkdtemp | from tempfile import mkdtemp | ||
from shutil import rmtree | from shutil import rmtree | ||
from math import sin,cos,pi,sqrt | from math import sin,cos,pi,sqrt | ||
from PIL import Image | |||
def FocalBlur(aperture=2.0,samples=10,ray=0,width=0,height=0): | def FocalBlur(aperture=2.0,samples=10,ray=0,width=0,height=0): | ||
''' | ''' | ||
DESCRIPTION | DESCRIPTION | ||
Creates fancy figures by introducing a focal blur to the image. The object | Creates fancy figures by introducing a focal blur to the image. The object | ||
at the origin will be in focus. | at the origin will be in focus. | ||
AUTHOR | AUTHOR | ||
Jarl Underhaug | Jarl Underhaug | ||
University of Bergen | University of Bergen | ||
jarl_dot_underhaug_at_gmail_dot_com | jarl_dot_underhaug_at_gmail_dot_com | ||
Updates by Jason Vertrees and Thomas Holder | |||
USAGE | USAGE | ||
FocalBlur aperture=float, samples=int, ray=0/1, width=int, height=int | FocalBlur aperture=float, samples=int, ray=0/1, width=int, height=int | ||
EXAMPELS | EXAMPELS | ||
FocalBlur aperture=1, samples=100 | FocalBlur aperture=1, samples=100 | ||
FocalBlur aperture=2, samples=100, ray=1, width=600, height=400 | FocalBlur aperture=2, samples=100, ray=1, width=600, height=400 | ||
''' | ''' | ||
# Formalize the parameter types | |||
ray = (ray in ("True", "true", 1, "1")) | |||
aperture, samples = float(aperture), int(samples) | aperture, samples = float(aperture), int(samples) | ||
width, height = int(width), int(height) | |||
# Create a temporary directory | # Create a temporary directory | ||
tmpdir = mkdtemp() | tmpdir = mkdtemp() | ||
Line 82: | Line 99: | ||
light = [float(s) for s in light.split(',')] | light = [float(s) for s in light.split(',')] | ||
view = cmd.get_view() | view = cmd.get_view() | ||
# Rotate the protein and the light in order to create the blur | # Rotate the protein and the light in order to create the blur | ||
for frame in range(samples): | for frame in range(samples): | ||
Line 93: | Line 110: | ||
xr = x/180.0*pi | xr = x/180.0*pi | ||
yr = y/180.0*pi | yr = y/180.0*pi | ||
# Rotate the protein | # Rotate the protein | ||
cmd.turn('x',x) | cmd.turn('x',x) | ||
cmd.turn('y',y) | cmd.turn('y',y) | ||
# Rotate the light | # Rotate the light | ||
ly = light[1]*cos(xr)-light[2]*sin(xr) | ly = light[1]*cos(xr)-light[2]*sin(xr) | ||
Line 104: | Line 121: | ||
lz = lz*cos(yr)-lx*sin(yr) | lz = lz*cos(yr)-lx*sin(yr) | ||
cmd.set('light',[lx,ly,lz]) | cmd.set('light',[lx,ly,lz]) | ||
curFile = "%s/frame-%04d.png" % (tmpdir,frame) | |||
print "Created frame %i/%i (%0.0f%%)" % (frame+1,samples,100*(frame+1)/samples) | |||
# Save the image | # Save the image to temporary directory | ||
if ray: | |||
cmd.ray(width,height) | |||
cmd.png(curFile) | |||
else: | |||
cmd.png(curFile,quiet=1) | |||
# Create the average/blured image | |||
try: | |||
avg = Image.blend(avg,Image.open(curFile),1.0/(frame+1)) | |||
except: | |||
avg = Image.open(curFile) | |||
# Return the protein and the light to the original orientation | # Return the protein and the light to the original orientation | ||
cmd.set('light',light) | cmd.set('light',light) | ||
cmd.set_view(view) | cmd.set_view(view) | ||
# | # Load the blured image | ||
avg.save('%s/avg.png' % (tmpdir)) | |||
cmd.load('%s/avg.png' % (tmpdir)) | |||
cmd.load('%s/ | |||
# Delete the temporary files | # Delete the temporary files | ||
rmtree(tmpdir) | rmtree(tmpdir) |
Latest revision as of 02:52, 17 July 2014
Type | Python Script |
---|---|
Download | focal_blur.py |
Author(s) | Jarl Underhaug |
License | - |
This code has been put under version control in the project Pymol-script-repo |
Description
This script creates fancy figures by introducing a focal blur to the image. The object at the origin will be in focus.
Usage
Load the script using the run command. Execute the script using PyMOL syntax:
FocalBlur aperture=2.0,samples=20,ray=1
or using python syntax:
FocalBlur(aperture=2.0,samples=20,ray=1)
For additional options, see the script comments.
Notes
- When using raytracing, the image creation will take n times longer than normal, where n is the number of samples.
- The aperture is related to the aperture on a camera, and is inversely proportional to the f-number.
Bugs
- FocalBlur uses the Python Image Library (PIL), a necessary components of PIL is missing in the Windows version of PyMOL
- There is a bug when not using ray tracing with the free version of PyMOL
Examples
Script
Load the script using the run command
from pymol import cmd
from tempfile import mkdtemp
from shutil import rmtree
from math import sin,cos,pi,sqrt
from PIL import Image
def FocalBlur(aperture=2.0,samples=10,ray=0,width=0,height=0):
'''
DESCRIPTION
Creates fancy figures by introducing a focal blur to the image. The object
at the origin will be in focus.
AUTHOR
Jarl Underhaug
University of Bergen
jarl_dot_underhaug_at_gmail_dot_com
Updates by Jason Vertrees and Thomas Holder
USAGE
FocalBlur aperture=float, samples=int, ray=0/1, width=int, height=int
EXAMPELS
FocalBlur aperture=1, samples=100
FocalBlur aperture=2, samples=100, ray=1, width=600, height=400
'''
# Formalize the parameter types
ray = (ray in ("True", "true", 1, "1"))
aperture, samples = float(aperture), int(samples)
width, height = int(width), int(height)
# Create a temporary directory
tmpdir = mkdtemp()
# Get the orientation of the protein and the light
light = cmd.get('light')[1:-1]
light = [float(s) for s in light.split(',')]
view = cmd.get_view()
# Rotate the protein and the light in order to create the blur
for frame in range(samples):
# Angles to rotate protein and light
# Populate angles as Fermat's spiral
theta = frame * pi * 110.0/144.0
radius = 0.5 * aperture * sqrt(frame/float(samples-1))
x = cos(theta) * radius
y = sin(theta) * radius
xr = x/180.0*pi
yr = y/180.0*pi
# Rotate the protein
cmd.turn('x',x)
cmd.turn('y',y)
# Rotate the light
ly = light[1]*cos(xr)-light[2]*sin(xr)
lz = light[2]*cos(xr)+light[1]*sin(xr)
lx = light[0]*cos(yr)+lz*sin(yr)
lz = lz*cos(yr)-lx*sin(yr)
cmd.set('light',[lx,ly,lz])
curFile = "%s/frame-%04d.png" % (tmpdir,frame)
print "Created frame %i/%i (%0.0f%%)" % (frame+1,samples,100*(frame+1)/samples)
# Save the image to temporary directory
if ray:
cmd.ray(width,height)
cmd.png(curFile)
else:
cmd.png(curFile,quiet=1)
# Create the average/blured image
try:
avg = Image.blend(avg,Image.open(curFile),1.0/(frame+1))
except:
avg = Image.open(curFile)
# Return the protein and the light to the original orientation
cmd.set('light',light)
cmd.set_view(view)
# Load the blured image
avg.save('%s/avg.png' % (tmpdir))
cmd.load('%s/avg.png' % (tmpdir))
# Delete the temporary files
rmtree(tmpdir)
cmd.extend('FocalBlur', FocalBlur)