質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

287閲覧

pythonの画像処理について

black925

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/25 08:18

前提・実現したいこと

256,256サイズのjpg画像を32,32のサイズに画像左上からトリミングしていくコードを書きましたが、うまく動きません。
プログラム自体初心者なので内容なども間違いが感じられたら指摘お願いします

発生している問題・エラーメッセージ

PermissionError: [Errno 13] Permission denied: 'C:/Users/Desktop/sugi_split/test'

該当のソースコード

python3

path2 = 'C:/Users/Desktop/sugi_split/'
list2 = os.listdir(path2)
print(list2)
count = 0
for b in list2:
im2 = Image.open(path2+b)
height = 256
width = 256
for c in range(height, 32):
for d in range(width, 32):
tmp = im2.crop((d, c, d+32, c+32))
tmp.save('C:/Users/Desktop\split'+str(count)+'.jpg')
count += 1

### 試したこと パーミッションの確認、保存先のウィンドウを閉じて実行 ### 補足情報(FW/ツールのバージョンなど) pycharmをwin10で使っています python=3.6.4です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2018/09/25 08:35

「 Permission denied:」(アクセス権がないため、拒否されました!)というエラーなのですから、コードではなくファイルやディレクトリのパーミッションを調べ、必要なパーミッションを設定してください。
black925

2018/09/25 09:19

パーミッションの確認をしたのですがだめでした
guest

回答1

0

ベストアンサー

画像を 32x32 のグリッド上に分割して保存するコードを PIL と numpy を使用して書きました。
こんな感じでいいでしょうか。

サンプルコード

python

1import glob 2import os 3 4import matplotlib.pyplot as plt 5import numpy as np 6from PIL import Image 7 8def split_img(img, draw_result=False): 9 h, w, c = img.shape 10 v_split = h // 32 # 垂直方向の分割数 11 h_split = w // 32 # 水平方向の分割数 12 print('partitions: (horizonal {}, vertical {})'.format(h_split, v_split)) 13 14 # 均等に分割できないと np.spllt() が使えないので、 15 # 除算したときに余りがでないように画像の端数を切り捨てる。 16 _img = img[:h // v_split * v_split, :w // h_split * h_split] 17 print('{} -> {}'.format(img.shape, _img.shape)) # (167, 292, 3) -> (164, 161, 3) 18 19 # 分割する。 20 out_imgs = [] 21 for h_img in np.vsplit(_img, v_split): # 垂直方向に分割する。 22 for v_img in np.hsplit(h_img, h_split): # 水平方向に分割する。 23 out_imgs.append(v_img) 24 25 # 描画する。 26 if draw_result: 27 fig, axes_list = plt.subplots(v_split, h_split, figsize=(10, 10)) 28 axes_list = axes_list.ravel() 29 for i, (sub, axes) in enumerate(zip(out_imgs, axes_list)): 30 axes.imshow(sub) 31 axes.set_axis_off() 32 plt.show() 33 34 return out_imgs 35 36img_paths = 'test/*.png' # 分割する画像があるディレクトリ 37for img_path in glob.glob(img_paths): 38 img = np.array(Image.open(img_path)) 39 out_imgs = split_img(img) # 画像を分割する。 40 41 img_dirpath, basename = os.path.split(img_path) 42 name, ext = os.path.splitext(basename) 43 44 # 画像を出力するディレクトリを作成する。 45 out_dirpath = os.path.join(img_dirpath, name) 46 os.makedirs(out_dirpath, exist_ok=True) 47 print('save divided images to `{}`'.format(out_dirpath)) 48 49 for i, out_img in enumerate(out_imgs): 50 basename = '{}_{}.{}'.format(name, i, ext) 51 out_path = os.path.join(out_dirpath, basename) 52 53 # 画像を保存する。 54 Image.fromarray(out_img).save(out_path)

結果

イメージ説明

イメージ説明

投稿2018/09/25 08:57

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

black925

2018/09/25 08:59

ありがとうございます、コメントを見ながらがんばります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問