Pythonの初心者です。
前回の質問で、おかげさまで以下のようにPythonを使った画像分割のコードを書けるようになりました。
Python
1from skimage import io 2import os 3import skimage 4 5tile_size = 50 6filename = 'pic.png' 7 8new_dir = 'data/' 9os.mkdir(new_dir) 10 11im = io.imread(filename) 12 13print(im) 14for i in range(10): 15 ii = tile_size * i + 50 16for j in range(10): 17 jj = tile_size * j + 50 18tmp = im[ii:ii+tile_size, jj:jj+tile_size] 19print(tmp) 20 21io.imsave(new_dir + str(i)+ "_" + str(j) + ".tif", tmp)
上のコードではrange(10)、すなわち横方向に10分割、縦方向に10分割となっていますが、
これを
・左端から右端まで
・上端から下端まで
と分割し、端部の処理については
・一番端がちょうど分割後の各セルのサイズだった場合は、分割した画像を出力する
・端部が分割後の各セルのサイズに満たない場合は分割した画像を切り捨てる
としたいと考えています。
1番目の方法(解決済み)---
前回のアドバイスを参考に、分割数を算出するコードを記述し、
出力する範囲を1番目から(分割数-1)までとした下記のコードでは
きちんと出力されました。
しかし、これではもし一番端の画像サイズがちょうど分割後の各セルのサイズに足りている場合も
トリミングされることになってしまい、少し困ってしまいます。
Python
1from skimage import io 2import os 3import numpy as np 4 5tile_size = 50 6filename = 'pic.png' 7 8new_dir = 'data/' 9os.mkdir(new_dir) 10 11im = io.imread(filename) 12 13vsize, hsize = 50, 50 # 分割後の各セルのサイズ 14h, w = im.shape[:2] # 画像の大きさ 15num_vsplits, num_hsplits = np.floor_divide([h, w], [vsize, hsize]) # 分割数 16 17print(im) 18for i in range(num_vsplits-1): 19 ii = tile_size * i + 50 20 for j in range(num_hsplits-1): 21 jj = tile_size * j + 50 22 tmp = im[ii:ii+tile_size, jj:jj+tile_size] 23 print(tmp) 24 25 io.imsave(new_dir + str(i)+ "_" + str(j) + ".tif", tmp)
2番目の方法(未解決)---
もう一つの方法として、出力する範囲を
1から(「画像の縦or横の長さ/分割後の各セルのサイズ」の整数部分)まで
とすれば、もし一番端の画像サイズがちょうど分割後の各セルのサイズに足りている場合は
出力されることになり、今回の目的に合う方法だと考えました。
記述したコードは次のようになります。
Python
1from skimage import io 2import os 3import numpy as np 4 5tile_size = 50 6filename = 'pic.png' 7 8new_dir = 'data2/' 9os.mkdir(new_dir) 10 11im = io.imread(filename) 12 13print(im) 14for i in range(int(width // 50)): 15 ii = tile_size * i + 50 16 for j in range(int(width // 50)): 17 jj = tile_size * j + 50 18 tmp = im[ii:ii+tile_size, jj:jj+tile_size] 19 print(tmp) 20 21 io.imsave(new_dir + str(i)+ "_" + str(j) + ".tif", tmp)
しかし、data2というファイルはきちんと生成されるものの、画像が1つも出力されません。
エラーは出ていませんが、どこがいけないのかご教示いただけませんか?
また、これよりもエレガントな方法があれば、ご教示いただけますと助かります。
どうぞよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー