1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#!/usr/bin/env python
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler''' An example of Laplacian Pyramid construction and merging.
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLevel : Intermediate
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerUsage : python lappyr.py [<video source>]
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerReferences:
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.54.299
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAlexander Mordvintsev 6/10/12
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler'''
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerimport numpy as np
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerimport cv2
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerimport video
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerfrom common import nothing, getsize
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdef build_lappyr(img, leveln=6, dtype=np.int16):
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    img = dtype(img)
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    levels = []
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for i in xrange(leveln-1):
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        next_img = cv2.pyrDown(img)
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        img1 = cv2.pyrUp(next_img, dstsize=getsize(img))
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        levels.append(img-img1)
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        img = next_img
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    levels.append(img)
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return levels
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdef merge_lappyr(levels):
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    img = levels[-1]
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for lev_img in levels[-2::-1]:
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        img = cv2.pyrUp(img, dstsize=getsize(lev_img))
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        img += lev_img
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return np.uint8(np.clip(img, 0, 255))
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerif __name__ == '__main__':
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    import sys
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    print __doc__
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    try:
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        fn = sys.argv[1]
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    except:
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        fn = 0
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cap = video.create_capture(fn)
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    leveln = 6
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv2.namedWindow('level control')
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for i in xrange(leveln):
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cv2.createTrackbar('%d'%i, 'level control', 5, 50, nothing)
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    while True:
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ret, frame = cap.read()
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        pyr = build_lappyr(frame, leveln)
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for i in xrange(leveln):
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            v = cv2.getTrackbarPos('%d'%i, 'level control') / 5
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            pyr[i] *= v
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        res = merge_lappyr(pyr)
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cv2.imshow('laplacian pyramid filter', res)
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if cv2.waitKey(1) & 0xFF == 27:
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break
67