🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

Q&A

解決済

2回答

1969閲覧

Python3で読み込んだ画像を分割して保存したい

mirrage

総合スコア5

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

0グッド

0クリップ

投稿2019/12/24 10:47

編集2019/12/26 18:21

前提・実現したいこと

Python3(Jupyter Notebook)に入っている1つの画像(今回は"s298_1(3).jpg")を100×100ピクセル等分に切り抜いて保存したいです。
※先ほどのインデントの問題は解決しましたが、また新たな問題が発生したので編集させていただきました。
※何度も編集してすみません。

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

None ------------------------------------------------------------------------------ TypeError Traceback (most recent call last) <ipython-input-10-140e2b678da4> in <module> 6 7 # 画像の [100:200, 100:300] の範囲を切り抜く。 ----> 8 clipped = img[100:200, 100:300] TypeError: 'NoneType' object is not subscriptable AttributeError Traceback (most recent call last) <ipython-input-11-22c40eb2a96f> in <module> 1 import os 2 ----> 3 class ImgInfo: 4 def __init__(self, name, sx, sy, ex, ey): 5 self.name = name + '.png' <ipython-input-11-22c40eb2a96f> in ImgInfo() 20 21 # 画像を開く ---> 22 img = img.open("s298_1(3).jpg") 23 # 画像を切り出す 24 imgCrop = img.crop((始点X, 始点Y, 終点X, 終点Y)) AttributeError: 'NoneType' object has no attribute 'open'

imgファイルには該当するものが「ない」といわれました。
対象画像は「エクスプローラー」の「ピクチャ」で「jpgファイル」として保存し、それを「img」ファイルに移動させました。

また、'NoneType'といわれ、このバージョンでは通用しない関数文だったようです。
この場合、どのように直すのが正解なのでしょう。

該当のソースコード

import cv2 #画像の読み込み img=cv2.imread("s298_1(3).jpg") print(img) class ImgInfo: def __init__(self, name, sx, sy, ex, ey): self.name = name + '.png' self.sx = sx self.sy = sy self.ex = ex self.ey = ey def carving(self): # 画像を切り出して保存 baseFile = imgDir + imgName img = Image.open(baseFile) imgCrop = img.crop((self.sx, self.sy, self.ex, self.ey)) output = imgDir + self.name imgCrop.save(output) def show(self): # 情報表示 print('[{}] {: >100}, {: >100}, {: >100}, {: >100}'.format(self.name, self.sx, self.sy, self.ex, self.ey)) # 画像を開く img = Image.open("開くファイル(=s298_1(3).jpg)") # 画像を切り出す imgCrop = img.crop((始点X, 始点Y, 終点X, 終点Y)) # 切り出した画像を保存 imgCrop.save("保存するパス(=Python)") def getOfsList(num, size): ofs = [] for i in range(0,num) ofs.append(i * size) return ofs # イメージの始点 startX = 5 startY = 5 # イメージの幅、高さ imgW = 120 imgH = 120 xofs = getOfsList(100, imgW) yofs = getOfsList(100, imgH) cnt = 0 ycnt = 1 for y in yofs: xcnt = 1 for x in xofs: name = str(cnt).zfill(2) sx = x + startX sy = y + startY ex = (imgW * xcnt) + startX ey = (imgH * ycnt) + startY cnt += 1 xcnt += 1 ycnt += 1 for img in imgs: img.carving()

試したこと

from PIL import Image img = Image.open('s298_1(3).jpg') cropped_img = img.crop(box=(0, 0, 500, 500)) cropped_img.save('s298_1(01).jpg')

それでも同じ結果になりました。

補足情報(FW/ツールのバージョンなど)

PC環境
・Windows10
・Python3.7
・OpenCV3.4.2
・Jupyter Notebook(tensorflow16)

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

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

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

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

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

guest

回答2

0

ベストアンサー

プログラムでの画像のオープンに失敗しているようです。
JupyterNoteBookから以下のコマンドを試してみてください。
結果がFalseの場合は画像ファイルがプログラムから見えていないです。

python

1import os 2os.path.exists("s298_1(3).jpg")

追記

ディレクトリ構成が以下の場合だったとします。

text

1C:\hogehoge\jupyter\ # ルートディレクトリ 2├----Anaconda3 3| ├----- hoge.py # 実行中の*.pyファイル名(c:\hogehoge\jupyter\Anaconda3\hoge.py) 4| 5├-----img 6 ├----- s298_1(3).jpg # 開きたい画像ファイル名(c:\hogehoge\jupyter\img\s298_1(3).jpg)

その場合このようにすれば画像ファイルへの相対パスが得られます。

python

1import os 2curPath = os.getcwd() 3imgfile = os.path.join(curPath, "..", "img", "s298_1(3).jpg") 4print("img file path: " + imgfile) 5print(os.path.exists(imgfile)) #ファイルがあればTrueになる

投稿2019/12/26 19:13

編集2019/12/27 18:17
TaroToyotomi

総合スコア1448

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

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

mirrage

2019/12/27 08:58

import cv2 import os img_path_name = "s298_1(3).jpg" # 対象画像の名前 bace = os.path.dirname(os.path.abspath(__img__)) # 実行ファイルのディレクトリ名 target_path = os.path.join(bace, img_path_name) # パスの連結 img = cv2.imread(target_path) red = img[:, :, 2].copy() Falseになったので、https://qiita.com/right1121/items/af0c3555b75fd3e51bdf を参考にして上記のようにやってみました。 結果 NameError Traceback (most recent call last) <ipython-input-3-0d03eeeb3af9> in <module> 3 4 img_path_name = "s298_1(3).jpg" # 対象画像の名前 ----> 5 bace = os.path.dirname(os.path.abspath(__img__)) # 実行ファイルのディレクトリ名 6 target_path = os.path.join(bace, img_path_name) # パスの連結 7 img = cv2.imread(target_path) NameError: name '__img__' is not defined 他に変えるべき場所は? 何度も質問してすみません。
TaroToyotomi

2019/12/27 15:24

bace = os.path.dirname(os.path.abspath(__img__)) # 実行ファイルのディレクトリ名 ではなく bace = os.path.dirname(os.path.abspath(__file__)) # 実行ファイルのディレクトリ名 では? これは*.pyファイルが存在するディレクトリ名を絶対パスで取得している処理です。
mirrage

2019/12/27 15:31

なるほど。ありがとうございました!
mirrage

2019/12/27 16:04

これでやっても同じ結果になってしまいました。
mirrage

2019/12/27 16:19

Jupyter内では「Anaconda3」というディレクトリに*.pyファイルがありました。 そこで(__Anaconda3__)でやってみたんですけど変わらず…。
TaroToyotomi

2019/12/27 17:12

__Anaconda3__とか__img__は定義されていないので使えません。 パスの取得については https://note.nkmk.me/python-script-file-path/ を参考にしてください。 画像ファイルのパスは、カレントディレクトリからの相対パスまたは絶対パスで指定しないとプログラムからは見えません。
mirrage

2019/12/27 17:52 編集

やってみましたが「__file__」が入ってるだけで定義されませんでした????。
mirrage

2019/12/27 22:14

ありがとうございました。
guest

0

インデントを下げてください

for img in imgs: img.carving()

投稿2019/12/24 11:09

編集2019/12/24 11:11
tatamyiwathy

総合スコア1045

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

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

tatamyiwathy

2019/12/24 11:14

あれ?質問よく読んだらエラーについてではないのかな。だとしたら失礼しました。
mirrage

2019/12/24 16:24

すみません。質問内容を更新しました。
tatamyiwathy

2019/12/25 10:36

s298_1(3).jpgはPythonスクリプトを実行するディレクトリと同じ場所にありますか? そうでないとき img = Image.open('s298_1(3).jpg') はエラーになり、imgはNoneTypeになります。
mirrage

2019/12/26 16:22 編集

「Jupyter Notebook」のディレクトリの「img」フォルダには入っていますし、画像も開けます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問