这个放大器的代码还是来自于opencv的官网,是官网提供的样例代码
在opencv的源码中,目录为:opencv/samples/python/browse.py
那么我们运行这个源码,命令行提示如下:
现在正在建立一个4096x4096 的图片,同时程序会建立一个名为preview的窗口,如下:
这个preview中显示的图片就是代码自动生成的4096x4096的图片。
可以看到,图片上很多细节看不到,细节看起来比较模糊,因为图片太大,但是我们的显示窗口相对来说没有那么大。假设电脑屏幕就只有preview窗口这个大的。
这时候,我们就主要一个放大镜的功能了。
我们把鼠标放在原图的某个位置,就会在以这个位置为中心,提取一个600*800区域的子图片出来,
上图中,preview是原图,zoom是鼠标放在原图上后,显示的子图片
子图片就是把原图上的一个600x800区域的像素复制出来单独显示到zoom窗口里的。
这样显示出来就能看到细节了
这样就实现了放大器的功能。
代码如下:
(base) zhaomingming@iMac python % vim browse.py
1 #!/usr/bin/env python
2
3 '''
4 browse.py
5 =========
6
7 Sample shows how to implement a simple hi resolution image navigation
8
9 Usage
10 -----
11 browse.py [image filename]
12
13 '''
14
15 # Python 2/3 compatibility
16 from __future__ import print_function
17 import sys
18 PY3 = sys.version_info[0] == 3
19
20 if PY3:
21 xrange = range
22
23 import numpy as np
24 import cv2 as cv
25
26 # built-in modules
27 import sys
28
29 def main():
30 if len(sys.argv) > 1:
31 fn = cv.samples.findFile(sys.argv[1])
32 print('loading %s ...' % fn)
33 img = cv.imread(fn)
34 if img is None:
35 print('Failed to load fn:', fn)
36 sys.exit(1)
37
38 else:
39 sz = 4096
40 print('generating %dx%d procedural image ...' % (sz, sz))
41 img = np.zeros((sz, sz), np.uint8)
42 track = np.cumsum(np.random.rand(500000, 2)-0.5, axis=0)
43 track = np.int32(track*10 + (sz/2, sz/2))
44 cv.polylines(img, [track], 0, 255, 1, cv.LINE_AA)
45
46
47 small = img
48 for _i in xrange(3):
49 small = cv.pyrDown(small)
50
51 def onmouse(event, x, y, flags, param):
52 h, _w = img.shape[:2]
53 h1, _w1 = small.shape[:2]
54 x, y = 1.0*x*h/h1, 1.0*y*h/h1
55 zoom = cv.getRectSubPix(img, (800, 600), (x+0.5, y+0.5))
56 cv.imshow('zoom', zoom)
57
58 cv.imshow('preview', small)
59 cv.setMouseCallback('preview', onmouse)
60 cv.waitKey()
61 print('Done')
62
63
64 if __name__ == '__main__':
65 print(__doc__)
66 main()
67 cv.destroyAllWindows()