-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathimg_rotate.html
256 lines (227 loc) · 17.5 KB
/
img_rotate.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="utf-8" />
<title>python图像处理工具pillow opencv等练习1 旋转</title>
<link rel="stylesheet" href="/theme/css/main.css" />
</head>
<body id="index" class="home">
<header id="banner" class="body">
<h1><a href="/">python自动化测试人工智能 </a></h1>
<nav><ul>
<li><a href="/category/ba-zi.html">八字</a></li>
<li><a href="/category/ce-shi.html">测试</a></li>
<li><a href="/category/ce-shi-kuang-jia.html">测试框架</a></li>
<li><a href="/category/common.html">common</a></li>
<li><a href="/category/da-shu-ju.html">大数据</a></li>
<li><a href="/category/feng-shui.html">风水</a></li>
<li><a href="/category/ji-qi-xue-xi.html">机器学习</a></li>
<li><a href="/category/jie-meng.html">解梦</a></li>
<li><a href="/category/linux.html">linux</a></li>
<li class="active"><a href="/category/python.html">python</a></li>
<li><a href="/category/shu-ji.html">书籍</a></li>
<li><a href="/category/shu-ju-fen-xi.html">数据分析</a></li>
<li><a href="/category/zhong-cao-yao.html">中草药</a></li>
<li><a href="/category/zhong-yi.html">中医</a></li>
</ul></nav>
</header><!-- /#banner -->
<section id="content" class="body">
<article>
<header>
<h1 class="entry-title">
<a href="/img_rotate.html" rel="bookmark"
title="Permalink to python图像处理工具pillow opencv等练习1 旋转">python图像处理工具pillow opencv等练习1 旋转</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<abbr class="published" title="2018-12-26T08:20:00+08:00">
Published: 三 26 十二月 2018
</abbr>
<address class="vcard author">
By <a class="url fn" href="/author/andrew.html">andrew</a>
</address>
<p>In <a href="/category/python.html">python</a>.</p>
</footer><!-- /.post-info --> <ul>
<li><a href="https://china-testing.github.io/practices.html">python测试开发项目实战-目录</a></li>
<li><a href="https://china-testing.github.io/python_books.html">python工具书籍下载-持续更新</a></li>
<li><a href="https://china-testing.github.io/python3_quick.html">python 3.7极速入门教程 - 目录</a></li>
</ul>
<h3 id="_1">对如下图片旋转</h3>
<p><img alt="image.png" src="https://upload-images.jianshu.io/upload_images/12713060-3b0e1960983e5502.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<p>将上面图片逆时针旋转45度,90度,要求图片内容完整。</p>
<h3 id="pillow">pillow</h3>
<div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/env python3</span>
<span class="c1"># -*- coding: utf-8 -*-</span>
<span class="c1"># https://china-testing.github.io/pil1.html</span>
<span class="c1"># https://github.com/china-testing/python-api-tesing/blob/master/practices/pillow/rotate.py</span>
<span class="c1"># 项目实战讨论QQ群630011153 144081101</span>
<span class="c1"># CreateDate: 2018-12-26</span>
<span class="kn">from</span> <span class="nn">PIL</span> <span class="kn">import</span> <span class="n">Image</span>
<span class="n">im</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">"qun.jpg"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">im</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>
<span class="n">im</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="n">im2</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">rotate</span><span class="p">(</span><span class="mi">45</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">im2</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>
<span class="n">im2</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="n">im2</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="s2">"test1.jpg"</span><span class="p">)</span>
<span class="n">im3</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">rotate</span><span class="p">(</span><span class="mi">45</span><span class="p">,</span> <span class="n">expand</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">im3</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>
<span class="n">im3</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="n">im3</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="s2">"test2.jpg"</span><span class="p">)</span>
</pre></div>
<p>执行结果:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="mi">489</span><span class="p">,</span> <span class="mi">594</span><span class="p">)</span>
<span class="p">(</span><span class="mi">489</span><span class="p">,</span> <span class="mi">594</span><span class="p">)</span>
<span class="p">(</span><span class="mi">767</span><span class="p">,</span> <span class="mi">766</span><span class="p">)</span>
</pre></div>
<p><img alt="test1.jpg" src="https://upload-images.jianshu.io/upload_images/12713060-21643432eef1f1ab.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<p><img alt="test2.jpg" src="https://upload-images.jianshu.io/upload_images/12713060-f404abebcd88aad6.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<p>注意点:pillow在没有设置expand=True的情况,旋转可能会丢失部分内容。设置expand=True的情况下,则可能增大图片像素。</p>
<p>90度的旋转和45的类似。具体参考代码 https://github.com/china-testing/python-api-tesing/blob/master/practices/pillow/rotate.py。</p>
<p>90度旋转在没有设置expand=True的情况下,图片也是有丢失的。</p>
<p><img alt="test3.jpg" src="https://upload-images.jianshu.io/upload_images/12713060-dc2bde95859af7dc.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<p>另外:transpose(Image.ROTATE_90)和im.rotate(90, expand=True)的效果实际是相同。</p>
<p>参考资料:</p>
<p>https://www.toutiao.com/i6637827317458567687/</p>
<p>https://china-testing.github.io/python3_lib_pil.html</p>
<h3 id="pillow_1">旋转图片更多pillow练习</h3>
<p>把/home/andrew/code/tmp_photos2的jpg图片旋转270度,放在/home/andrew/code/tmp_photos3 </p>
<p>参考资料:<a href="https://github.com/china-testing/python-api-tesing#%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86image-processing">python图像处理库</a></p>
<p>要求实现的命令行界面如下:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17</pre></div></td><td class="code"><div class="highlight"><pre><span></span>$ python3 rotate.py -h
usage: rotate.py <span class="o">[</span>-h<span class="o">]</span> <span class="o">[</span>-t TYPE<span class="o">]</span> <span class="o">[</span>-a ANGLE<span class="o">]</span> <span class="o">[</span>--version<span class="o">]</span> src dst
功能:旋转图片
示例: $ python3 rotate.py /home/andrew/code/tmp_photos2 /home/andrew/code/tmp_photos3 -a <span class="m">270</span>
把/home/andrew/code/tmp_photos2的jpg图片旋转270度,放在/home/andrew/code/tmp_photos3
positional arguments:
src 源目录
dst 目的目录
optional arguments:
-h, --help show this <span class="nb">help</span> message and <span class="nb">exit</span>
-t TYPE 文件扩展名, 默认为jpg
-a ANGLE 旋转角度,默认为90度,方向都为逆时针。
--version show program<span class="err">'</span>s version number and <span class="nb">exit</span>
</pre></div>
</td></tr></table>
<p>旋转前:</p>
<p><img alt="photo.jpg" src="https://upload-images.jianshu.io/upload_images/10819934-f2f74d08c0cd62dc.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<p>旋转后</p>
<p><img alt="photo.jpg" src="https://upload-images.jianshu.io/upload_images/10819934-6e06decc073c0180.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p>
<p>需求来源: 用户拍的图片人脸未必是头在上,下巴在下面,但是人脸识别的时扶正的识别效果比较好,为此...</p>
<p>参考代码:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">glob</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">from</span> <span class="nn">PIL</span> <span class="kn">import</span> <span class="n">Image</span>
<span class="kn">import</span> <span class="nn">photos</span>
<span class="kn">import</span> <span class="nn">data_common</span>
<span class="n">description</span> <span class="o">=</span> <span class="s1">'''</span>
<span class="s1">功能:旋转图片</span>
<span class="s1">示例: $ python3 rotate.py /home/andrew/code/tmp_photos2 /home/andrew/code/tmp_photos3 -a 270</span>
<span class="s1">'''</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">,</span>
<span class="n">formatter_class</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">RawTextHelpFormatter</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'src'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="sa">u</span><span class="s1">'源目录'</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'dst'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="sa">u</span><span class="s1">'目的目录'</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'-t'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"type"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">"jpg"</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="sa">u</span><span class="s1">'文件扩展名, 默认为jpg'</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'-a'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"angle"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">90</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="sa">u</span><span class="s1">'旋转角度,默认为90度,方向都为逆时针。'</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--version'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'version'</span><span class="p">,</span>
<span class="n">version</span><span class="o">=</span><span class="s1">'</span><span class="si">%(prog)s</span><span class="s1"> 1.0 Rongzhong xu 2018 04 26'</span><span class="p">)</span>
<span class="n">options</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="n">data_common</span><span class="o">.</span><span class="n">check_directory</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">dst</span><span class="p">)</span>
<span class="n">files</span> <span class="o">=</span> <span class="n">data_common</span><span class="o">.</span><span class="n">find_files_by_type</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">src</span><span class="p">,</span> <span class="n">filetype</span><span class="o">=</span><span class="n">options</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
<span class="n">photos</span><span class="o">.</span><span class="n">rotate</span><span class="p">(</span><span class="n">files</span><span class="p">,</span> <span class="n">options</span><span class="o">.</span><span class="n">dst</span><span class="p">,</span> <span class="n">options</span><span class="o">.</span><span class="n">angle</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="https://github.com/china-testing/python-api-tesing/">上述代码依赖的部分库</a></p>
<h3 id="_2">参考资料</h3>
<ul>
<li>讨论qq群630011153 144081101</li>
<li><a href="https://github.com/china-testing/python-api-tesing">本文涉及的python测试开发库</a> 谢谢点赞!</li>
<li><a href="https://github.com/china-testing/python-api-tesing/blob/master/books.md">本文相关海量书籍下载</a></li>
<li><a href="https://china-testing.github.io/img_rotate.html">本文最新版本</a></li>
</ul>
<h3 id="opencv">opencv</h3>
<p>opencv的旋转比pillow复杂,不过好在有imutils辅助,具体代码参见:</p>
<p>https://github.com/china-testing/python-api-tesing/blob/master/practices/cv/rotate.py</p>
<p>本文如遇格式问题,请访问: https://china-testing.github.io/img_rotate.html</p>
<p>wand库旋转的参考: http://docs.wand-py.org/en/0.4.1/guide/transform.html</p>
<h3 id="_3">参考资料</h3>
<ul>
<li>讨论 qq群144081101 567351477</li>
<li><a href="https://china-testing.github.io/ai_books.html">本文最新版本地址</a></li>
<li><a href="https://github.com/china-testing/python-api-tesing">本文涉及的python测试开发库</a> 谢谢点赞!</li>
<li><a href="https://github.com/china-testing/python-api-tesing/blob/master/books.md">本文相关海量书籍下载</a> </li>
<li>道家技术-手相手诊看相中医等钉钉群21734177 qq群:391441566 184175668 338228106 看手相、面相、舌相、抽签、体质识别。服务费50元每人次起。请联系钉钉或者微信pythontesting</li>
<li><a href="https://china-testing.github.io/testing_training.html">接口自动化性能测试线上培训大纲</a></li>
<li><a href="https://www.fullstackpython.com/monitoring.html">Monitoring</a></li>
</ul>
</div><!-- /.entry-content -->
</article>
</section>
<section id="extras" class="body">
<div class="blogroll">
<h2>links</h2>
<ul>
<li><a href="https://china-testing.github.io/testing_training.html">自动化性能接口测试线上及深圳培训与项目实战 qq群:144081101 591302926</a></li>
<li><a href="http://blog.sciencenet.cn/blog-2604609-1112306.html">pandas数据分析scrapy爬虫 521070358 Py人工智能pandas-opencv 6089740</a></li>
<li><a href="http://blog.sciencenet.cn/blog-2604609-1112306.html">中医解梦看相八字算命qq群 391441566 csdn书籍下载-python爬虫 437355848</a></li>
</ul>
</div><!-- /.blogroll -->
</section><!-- /#extras -->
<footer id="contentinfo" class="body">
<address id="about" class="vcard body">
Proudly powered by <a href="http://getpelican.com/">Pelican</a>, which takes great advantage of <a href="http://python.org">Python</a>.
</address><!-- /#about -->
<p>The theme is by <a href="http://coding.smashingmagazine.com/2009/08/04/designing-a-html-5-layout-from-scratch/">Smashing Magazine</a>, thanks!</p>
</footer><!-- /#contentinfo -->
</body>
</html>