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

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

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

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

Q&A

解決済

1回答

339閲覧

Python3.5とOpenCV3を使った画像のcrop処理 出力に関する質問

checkJ

総合スコア31

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

0グッド

0クリップ

投稿2018/11/21 08:08

編集2018/11/21 08:54

#概要

皆様、お久しぶりです。以下について困っているので意見をいただけると嬉しいです。
私は現在、「巨大な一枚の画像を細切りにして保存する」コードを作成しています。
一枚の画像を何枚にも区切って保存したいのですが、出力される画像が一枚だけになるなど
期待している出力が得られなくて困っております。

#処理の流れ
保存したいディレクトリの作成や読み込むディレクトリの指定部分については割愛し、取り込んだ画像をどのように処理したいかを以下に示します。

1.巨大な画像を読み込む
2.読み込んだ画像のサイズを33で割り切れる形にトリミング (resize_image)
3.resize_imageを33×33の画像サイズでcropし、保存(cropped_img)
4.cropped_imgを中心を基準に21×21にcropし、保存(label_img)

#困っているポイント
基本的にエラーは出ていないのですが、出力される画像が一枚だけとなり困っております。
初歩的なミスだとは思うのですが、急ぎ解決する必要があるため質問を投稿しました。

参考させていただいたサイト様
Neural Network Console を用いた超解像処理の実装

#コードの該当箇所
おそらく原因であろう箇所を抜粋しています。
最後に全文を載せておきます。

python

1starting_point = [6,8] 2end_point = [3834, 2153] 3num = 0 4n = 0 5 6 7for i in range(range1): 8 ii = i +1 9 input_dir_sub = os.path.join(input_dir,str(ii)) 10 11 os.chdir(input_dir_sub) 12 imgs = os.listdir(input_dir_sub) 13 14 15 for a in imgs: 16 img = cv2.imread(a) 17 resize_img = drop_size(img, starting_point,end_point ) 18 19 test_dir = os.path.join(dataset_dir,"test",str(ii) ,str(a)) 20 label_dir = os.path.join(dataset_dir,"label",str(ii) ,str(a)) 21 22 if not os.path.exists(test_dir): 23 os.makedirs(test_dir) 24 if not os.path.exists(label_dir): 25 os.makedirs(label_dir) 26 27 if resize_img is None: 28 sys.stdout.write("Failed to load image file.\n") 29 sys.exit(1) 30 if len(resize_img.shape) == 3: 31 height, width, channels = resize_img.shape[:3] 32 else: 33 height, width = resize_img.shape[:2] 34 channels = 1 35 36 numX = width // 33 37 numY = height // 33 38 39 for i in range(numX): 40 for j in range(numY): 41 cropped_img = resize_img[33*j:33*(j+1),33*i:33*(i+1)] 42 label_img = cropped_img[6:27,6:27] 43 44 45 46 cv2.imwrite(test_dir+"\crop_" + ('%04d'%num) + ".png",cropped_img) 47 cv2.imwrite(label_dir+"\label_" + ('%04d'%num) + ".png",label_img) 48 49 num = num + 1 50 n = n + 1 51 52

#補足
上に挙げた参考サイトを見てわかるように、CNNのためのデータセット作成用プログラムとなります。
比較的サイズの大きい画像を超解像度化させるため、処理の都合上、画像を細切れにしたいのです。

#コード(全文)
最後に、コードの全文を載せておきます。
エラーが発生しては場当たり的に解決するように記述しているため
見苦しいですが、よろしくお願いします。

python

1import numpy 2import cv2 3import sys 4import os 5from pathlib import Path 6 7 8def drop_size(input_image , start_point ,end_point): 9 image =(input_image.shape[0], input_image.shape[1]) 10 small_image = input_image[start_point[1]:end_point[1],start_point[0]:end_point[0]] 11 12 return small_image 13 14 15 16input_dir = input("input_iamge_directory: ") 17range1 = len(os.listdir(input_dir)) 18print("ファイルの数 : %d" %range1) 19dataset_dir = input("dataset directory : ") 20 21 22os.chdir(dataset_dir) 23if not os.path.exists("test"): 24 os.mkdir("test") 25if not os.path.exists("label"): 26 os.mkdir("label") 27 28------------------------------------------------------------------------------------------------------ 29#基点の指定 30starting_point = [6,8] 31end_point = [3834, 2153] 32num = 0 33n = 0 34 35 36for i in range(range1): 37 ii = i +1 38 input_dir_sub = os.path.join(input_dir,str(ii)) 39 40 os.chdir(input_dir_sub) 41 imgs = os.listdir(input_dir_sub) 42 43 44 for a in imgs: 45 img = cv2.imread(a) 46 resize_img = drop_size(img, starting_point,end_point ) 47 48 test_dir = os.path.join(dataset_dir,"test",str(ii) ,str(a)) 49 label_dir = os.path.join(dataset_dir,"label",str(ii) ,str(a)) 50 51 if not os.path.exists(test_dir): 52 os.makedirs(test_dir) 53 if not os.path.exists(label_dir): 54 os.makedirs(label_dir) 55 56 if resize_img is None: 57 sys.stdout.write("Failed to load image file.\n") 58 sys.exit(1) 59 if len(resize_img.shape) == 3: 60 height, width, channels = resize_img.shape[:3] 61 else: 62 height, width = resize_img.shape[:2] 63 channels = 1 64 65 numX = width // 33 66 numY = height // 33 67 68 for i in range(numX): 69 for j in range(numY): 70 cropped_img = resize_img[33*j:33*(j+1),33*i:33*(i+1)] 71 label_img = cropped_img[6:27,6:27] 72 73 74 75 cv2.imwrite(test_dir+"\crop_" + ('%04d'%num) + ".png",cropped_img) 76 cv2.imwrite(label_dir+"\label_" + ('%04d'%num) + ".png",label_img) 77 78 num = num + 1 79 n = n + 1 80---------------------------------------------------------------------------------------------------------- 81 82print("Finish!!") 83

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

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

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

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

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

guest

回答1

0

ベストアンサー

画像をグリッド上に分割したいということでしょうか

画像をグリッド上に分割する。

python

1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4 5img = cv2.imread('sample.jpg') 6 7vsize, hsize = 33, 33 8h, w = img.shape[:2] 9num_vsplits = h // vsize # 垂直方向の分割数 10num_hsplits = w // hsize # 水平方向の分割数 11 12# 均等に分割できないと np.spllt() が使えないので、 13# 除算したときに余りがでないように画像の端数を切り捨てる。 14crop_img = img[:h // num_vsplits * num_vsplits, :w // num_hsplits * num_hsplits] 15print('{} -> {}'.format(img.shape, crop_img.shape)) # (480, 640, 3) -> (476, 627, 3) 16 17# 分割する。 18out_imgs = [] 19for h_img in np.vsplit(crop_img, num_vsplits): # 垂直方向に分割する。 20 for v_img in np.hsplit(h_img, num_hsplits): # 水平方向に分割する。 21 out_imgs.append(v_img) 22out_imgs = np.array(out_imgs) 23print(out_imgs.shape) # (266, 34, 33, 3)

結果を描画する。

# 描画する。 fig, ax_list = plt.subplots(num_vsplits, num_hsplits, figsize=(8, 8)) for sub_img, ax in zip(out_imgs, ax_list.ravel()): ax.imshow(sub_img[..., ::-1]) ax.set_axis_off() plt.show()

イメージ説明

イメージ説明

投稿2018/11/21 08:38

tiitoi

総合スコア21956

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

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

checkJ

2018/11/21 08:58

迅速な回答ありがとうございます! おっしゃる通り、画像をグリット上に分割したいのです。 冗長な質問投稿でしたが、的確に読み取っていただけて助かりました。 解答していただいたコードで書き直してみようと思います。
checkJ

2018/11/21 09:25

無事に解決いたしました! 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問