質問編集履歴

3

タグにNumpyを追加しました。

2019/08/08 06:39

投稿

masa_jl033
masa_jl033

スコア12

test CHANGED
File without changes
test CHANGED
File without changes

2

当方の進捗状況に合わせ、より具体的になるように本文を修正しました。

2019/08/08 06:39

投稿

masa_jl033
masa_jl033

スコア12

test CHANGED
@@ -1 +1 @@
1
- Pythonで画像を一定のサイズに分割させ、そのサイズに満たない端部の画像は出力させないようにしたい
1
+ Pythonで画像を一定のサイズに分割させ、端部の処理をしたい
test CHANGED
@@ -1,6 +1,6 @@
1
1
  Pythonの初心者です。
2
2
 
3
- 前回の質問でおかげさまでPythonを使った画像分割のコードを書けるようになりました。
3
+ 前回の質問でおかげさまで以下のようにPythonを使った画像分割のコードを書けるようになりました。
4
4
 
5
5
  ```Python
6
6
 
@@ -48,30 +48,158 @@
48
48
 
49
49
  ```
50
50
 
51
- 今回、Pythonで例えば50*50のサイズ画像を分割させ
52
-
53
- 50*50のサイズに満たない端部の画像は保存しないようなコード付け加えたいと考えています。
54
-
55
-
56
-
57
- 考えた方法は以の2つ
58
-
59
-
60
-
61
- 方法1:rangeの指定において、もし右、下端のサイズが50*50に満ないならば出力しないようにする
62
-
63
- 方法2:最初shapeを使って画素の大きさ調べて、割り切れないはループスキップす
64
-
65
-
66
-
67
- なのですが、まず、これらの方法はうまくいきますでしょうか?
68
-
69
- またどような関数を使ってコードを書けばよいか見当がつかないのですが、必要な関数を教えていただませんか?
70
-
71
-
72
-
73
- また、上記の方法以外にうまいやり方があればアバイスいただけると助かります。
74
-
75
-
76
-
77
- うぞよろしくお願致します。
51
+ 上のコードでrange(10)、すなわち横方向に10分割、縦方向10分割となっていますが
52
+
53
+ これ
54
+
55
+ ・左端から右端まで
56
+
57
+ ・上端から端まで
58
+
59
+ と分割し、端部の処理については
60
+
61
+ ・一番がちょうど分割後各セルのサイズだっ場合は、分割した画像を出力する
62
+
63
+ ・端部が分割後の各セルのサイズ満たない場合は割した画像切り捨て
64
+
65
+ としたいと考えています。
66
+
67
+
68
+
69
+ **1番目方法(解決済み)---**
70
+
71
+ 前回のアドバイスを参考に、分割数を算出するコードを記述し、
72
+
73
+ 出力する範囲を1番目から(分割数-1)でとし記のコーでは
74
+
75
+ きちんと出力されました。
76
+
77
+ しかし、これではもし一番端の画像サイズがちょう分割後の各セルのサイズに足りてる場合も
78
+
79
+ トリミングされることになってしまい、少し困ってしまいます。
80
+
81
+ ```Python
82
+
83
+ from skimage import io
84
+
85
+ import os
86
+
87
+ import numpy as np
88
+
89
+
90
+
91
+ tile_size = 50
92
+
93
+ filename = 'pic.png'
94
+
95
+
96
+
97
+ new_dir = 'data/'
98
+
99
+ os.mkdir(new_dir)
100
+
101
+
102
+
103
+ im = io.imread(filename)
104
+
105
+
106
+
107
+ vsize, hsize = 50, 50 # 分割後の各セルのサイズ
108
+
109
+ h, w = im.shape[:2] # 画像の大きさ
110
+
111
+ num_vsplits, num_hsplits = np.floor_divide([h, w], [vsize, hsize]) # 分割数
112
+
113
+
114
+
115
+ print(im)
116
+
117
+ for i in range(num_vsplits-1):
118
+
119
+ ii = tile_size * i + 50
120
+
121
+ for j in range(num_hsplits-1):
122
+
123
+ jj = tile_size * j + 50
124
+
125
+ tmp = im[ii:ii+tile_size, jj:jj+tile_size]
126
+
127
+ print(tmp)
128
+
129
+
130
+
131
+ io.imsave(new_dir + str(i)+ "_" + str(j) + ".tif", tmp)
132
+
133
+ ```
134
+
135
+ **2番目の方法(未解決)**---
136
+
137
+ もう一つの方法として、出力する範囲を
138
+
139
+ 1から(「画像の縦or横の長さ/分割後の各セルのサイズ」の整数部分)まで
140
+
141
+ とすれば、もし一番端の画像サイズがちょうど分割後の各セルのサイズに足りている場合は
142
+
143
+ 出力されることになり、今回の目的に合う方法だと考えました。
144
+
145
+
146
+
147
+ 記述したコードは次のようになります。
148
+
149
+ ```Python
150
+
151
+ from skimage import io
152
+
153
+ import os
154
+
155
+ import numpy as np
156
+
157
+
158
+
159
+ tile_size = 50
160
+
161
+ filename = 'pic.png'
162
+
163
+
164
+
165
+ new_dir = 'data2/'
166
+
167
+ os.mkdir(new_dir)
168
+
169
+
170
+
171
+ im = io.imread(filename)
172
+
173
+
174
+
175
+ print(im)
176
+
177
+ for i in range(int(width // 50)):
178
+
179
+ ii = tile_size * i + 50
180
+
181
+ for j in range(int(width // 50)):
182
+
183
+ jj = tile_size * j + 50
184
+
185
+ tmp = im[ii:ii+tile_size, jj:jj+tile_size]
186
+
187
+ print(tmp)
188
+
189
+
190
+
191
+ io.imsave(new_dir + str(i)+ "_" + str(j) + ".tif", tmp)
192
+
193
+ ```
194
+
195
+ しかし、data2というファイルはきちんと生成されるものの、画像が1つも出力されません。
196
+
197
+ エラーは出ていませんが、どこがいけないのかご教示いただけませんか?
198
+
199
+
200
+
201
+ また、これよりもエレガントな方法があれば、ご教示いただけますと助かります。
202
+
203
+
204
+
205
+ どうぞよろしくお願いします。

1

本文を修正しました

2019/08/08 06:34

投稿

masa_jl033
masa_jl033

スコア12

test CHANGED
File without changes
test CHANGED
@@ -64,9 +64,9 @@
64
64
 
65
65
 
66
66
 
67
- なのですが、これらの方法はうまくいきますでしょうか?
67
+ なのですが、まず、これらの方法はうまくいきますでしょうか?
68
68
 
69
- だ不慣れでコードを書けないので、教えていただけないでしょうか?
69
+ たどのような関数を使ってコードを書けばよいか見当がつかないのですが必要な関数を教えていただませんか?
70
70
 
71
71
 
72
72