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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

3280閲覧

Pythonを使って画像を分割・保存したいが、分割した画像が真っ黒になってしまう(IndexError: cannot do a non-empty take from an empty axes.)

masa_jl033

総合スコア12

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2019/08/05 01:48

編集2019/08/05 07:14

前提・実現したいこと

Pythonの初心者です。
フルカラーの画像を細かく分割して保存したいのですが、分割して保存した画像の色が失われてしまいます。
画像の分割、保存はできているようですが、どこかの段階で画素の値が全て0 or 小さい値になってしまっている疑いがあります。
画像の色を保たれたまま保存するにはどうすればよいか、ご助言をいただけませんでしょうか?

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

IndexError: cannot do a non-empty take from an empty axes.

該当のソースコード

Pycharmで以下のように記述しました。

from skimage import io import os import skimage tile_size = 100 filename = 'pic.png' new_dir = 'data/' # os.mkdir(new_dir) im = io.imread(filename) print(im) for i in range(10): ii = tile_size * i + 100 for j in range(10): jj = tile_size * j + 100 tmp = im[ii:ii+tile_size, jj:jj+tile_size, 1] print(tmp) # for z in range(tmp.shape[0]): # tmp[z, :, :] = skimage.filters.median(tmp[z, :, :]) io.imsave(new_dir + str(i)+ "_" + str(j) + ".tif", tmp)

試したこと

上記と同じエラーメッセージが出た方の対処法を調べたのですが、エラーの原因、対処法を特定できませんでした。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のようにするとできると思います。

OpenCV - 画像をグリッド上に分割する方法について

サンプルコード

画像を 100x100 のグリッド上に分割して output ディレクトリ以下に保存する例

python

1from pathlib import Path 2 3import numpy as np 4from skimage import io 5 6img = io.imread("sample.jpg") 7 8vsize, hsize = 100, 100 # 分割後の各セルのサイズ 9h, w = img.shape[:2] # 画像の大きさ 10num_vsplits, num_hsplits = np.floor_divide([h, w], [vsize, hsize]) # 分割数 11 12# 均等に分割できないと np.spllt() が使えないので、 13# 除算したときに余りがでないように画像の端数を切り捨てる。 14crop_img = img[: num_vsplits * vsize, : num_hsplits * hsize] 15 16# 分割する。 17grid = [] 18for h_img in np.vsplit(crop_img, num_vsplits): # 垂直方向に分割する。 19 for v_img in np.hsplit(h_img, num_hsplits): # 水平方向に分割する。 20 grid.append(v_img) 21 22out_dir = Path("output") # 出力ディレクトリ 23out_dir.mkdir(exist_ok=True) 24 25for i, small_img in enumerate(grid): 26 out_path = out_dir / f"{i}.png" 27 io.imsave(out_path, small_img)

投稿2019/08/05 08:03

tiitoi

総合スコア21960

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

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

masa_jl033

2019/08/05 08:22

ありがとうございました。できました。私が投稿した記述では何がいけなかったのでしょうか?
tiitoi

2019/08/05 08:30

`im[ii : ii + tile_size, jj : jj + tile_size, 1]` としているので、RGB のうち Green のチャンネルだけスライスされているため、出力は1チャンネルのグレースケールとなります。 RGB のままスライスしたい場合は im[ii : ii + tile_size, jj : jj + tile_size] でいいのではないでしょうか。
masa_jl033

2019/08/07 01:07

ご教示くださりありがとうございます。元のコードが3次元画像を扱っていたので、その分はz軸方向のパラメータを入れていたようです。次元ではなく、RGBを表していたのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問