parent
e7dda44a07
commit
58174f6ada
3 changed files with 79 additions and 0 deletions
@ -0,0 +1,67 @@ |
|||||||
|
''' |
||||||
|
gabor_threads.py |
||||||
|
========= |
||||||
|
|
||||||
|
Sample demonstrates: |
||||||
|
- use of multiple Gabor filter convolutions to get Fractalius-like image effect (http://www.redfieldplugins.com/filterFractalius.htm) |
||||||
|
- use of python threading to accelerate the computation |
||||||
|
|
||||||
|
Usage |
||||||
|
----- |
||||||
|
gabor_threads.py [image filename] |
||||||
|
|
||||||
|
''' |
||||||
|
|
||||||
|
import numpy as np |
||||||
|
import cv2 |
||||||
|
from threading import Lock |
||||||
|
from multiprocessing.pool import ThreadPool |
||||||
|
|
||||||
|
|
||||||
|
def build_filters(): |
||||||
|
filters = [] |
||||||
|
ksize = 31 |
||||||
|
for theta in np.arange(0, np.pi, np.pi / 16): |
||||||
|
kern = cv2.getGaborKernel((ksize, ksize), 4.0, theta, 10.0, 0.5, 0, ktype=cv2.CV_32F) |
||||||
|
kern /= 1.5*kern.sum() |
||||||
|
filters.append(kern) |
||||||
|
return filters |
||||||
|
|
||||||
|
def process(img, filters): |
||||||
|
accum = np.zeros_like(img) |
||||||
|
for kern in filters: |
||||||
|
fimg = cv2.filter2D(img, cv2.CV_8UC3, kern) |
||||||
|
np.maximum(accum, fimg, accum) |
||||||
|
return accum |
||||||
|
|
||||||
|
def process_threaded(img, filters, threadn = 8): |
||||||
|
accum = np.zeros_like(img) |
||||||
|
accum_lock = Lock() |
||||||
|
def f(kern): |
||||||
|
fimg = cv2.filter2D(img, cv2.CV_8UC3, kern) |
||||||
|
with accum_lock: |
||||||
|
np.maximum(accum, fimg, accum) |
||||||
|
pool = ThreadPool(processes=threadn) |
||||||
|
pool.map(f, filters) |
||||||
|
return accum |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
import sys |
||||||
|
from common import Timer |
||||||
|
|
||||||
|
print __doc__ |
||||||
|
try: img_fn = sys.argv[1] |
||||||
|
except: img_fn = '../cpp/baboon.jpg' |
||||||
|
|
||||||
|
img = cv2.imread(img_fn) |
||||||
|
filters = build_filters() |
||||||
|
|
||||||
|
with Timer('running single-threaded'): |
||||||
|
res1 = process(img, filters) |
||||||
|
with Timer('running multi-threaded'): |
||||||
|
res2 = process_threaded(img, filters) |
||||||
|
|
||||||
|
print 'res1 == res2: ', (res1 == res2).all() |
||||||
|
cv2.imshow('img', img) |
||||||
|
cv2.imshow('result', res2) |
||||||
|
cv2.waitKey() |
Loading…
Reference in new issue