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

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

詳細はこちら
OpenCV

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

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1746閲覧

Pythonで画像で読み込んだ配列を扱うときエラーが起こる

mu-ro

総合スコア20

OpenCV

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

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/01/22 08:02

Pythonで災害領域検出の画像処理プログラムを作っています。
実行しているとfor文内で以下のようなメモリエラーが発生します。

Traceback (most recent call last): File ".\ana.py", line 42, in <module> lnd,fld = methods.detection() File "C:\Users\cs17090\Saji-Lab\researchSaji\programs\methods.py", line 110, in detection landslide = (Lp<180)&(ap>128)&(sp>70)&(edge>100) MemoryError: Unable to allocate array with shape (40811, 40811) and data type bool

画像の領域1つ毎に検出をするプログラムを書いているのですが、どうも領域のサイズが大きい箇所でメモリエラーを起こすようです。
ただ、気になるのがedgeという画像配列を用いずにこのプログラムを実行するとエラーが発生しません。
それに、領域が大きいと言っても40811サイズの1次元配列比較なのでそんな簡単にメモリが不足するものなのでしょうか。

どなたか、解決方法ございましたら教えていただきたいです。

以下の2つが今回用いたプログラムで、入力画像サイズはimgが(218,500,3)でedgeが(218,500)です。

analyze.py

1import cv2 2import numpy as np 3import matplotlib.pyplot as plt 4import methods 5 6 7# 入力画像読込 8# - png形式画像を用いるのが好ましい 9# - 本来の画像サイズ(1800x1080 pix)での処理が好ましい 10# img = cv2.imread('images/madslide11.jpg', cv2.IMREAD_COLOR) 11img = cv2.imread('images/madslide12.jpg', cv2.IMREAD_COLOR) 12# img = cv2.imread('images/smallimage.jpg', cv2.IMREAD_COLOR) 13 14# オリジナル画像保存 15# import pdb; pdb.set_trace() 16org = img.copy() 17cv2.imwrite('results/original.png', org) 18 19# 画像ファイル 20# - 画像データを処理プログラムに送る 21methods.image(org,img) 22 23# PyMeanShift 24# - Lab変換後の画像に適用 25# - 第1引数:探索範囲、第2引数:探索色相、第3引数:粗さ 26methods.meanshift(12,3,200) 27 28# ヒストグラム均一化 29# - Lab変換して処理した方が好ましい可能性がある 30# - 明度以外の要素も均一化した方が好ましい可能性がある 31methods.equalization() 32 33# 類似色統合 34methods.clustering() 35 36# カラーラベリング 37methods.labeling() 38 39# 災害領域検出 40# - 斜面崩壊・瓦礫でピクセル穴がある  41# - 浸水検出結果で緑色のノイズがある 42lnd,fld = methods.detection()

methods.py

1import cv2 2import numpy as np 3import pymeanshift as pms 4import matplotlib.pyplot as plt 5import matplotlib as mpl 6from PIL import Image 7from collections import deque 8 9def image(_org,_img): 10 global org,img,h,w,c 11 global bo,go,ro,al 12 13 org,img = _org,_img 14 h,w,c = img.shape 15 bo,go,ro = cv2.split(org) 16 al = 0.55 17 18def meanshift(spatial_radius,range_radius,min_density): 19 global img 20 lab_img, labels, num_seg = pms.segment(cv2.cvtColor(img, cv2.COLOR_BGR2Lab), spatial_radius, range_radius,min_density) 21 new_rgb_img = cv2.cvtColor(lab_img, cv2.COLOR_Lab2BGR) 22 23 img = new_rgb_img 24 return (new_rgb_img, labels, num_seg) 25 26def equalization(): 27 global img 28 hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 29 h, s, v = cv2.split(hsv_img) 30 31 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(3, 3)) 32 new_v = clahe.apply(v) 33 34 hsv_clahe = cv2.merge((h, s, new_v)) 35 new_rgb_img = cv2.cvtColor(hsv_clahe, cv2.COLOR_HSV2BGR) 36 37 img = new_rgb_img 38 return new_rgb_img 39 40def clustering(): 41 global img 42 img = Image.fromarray(img) 43 img_q = img.quantize(colors=128, method=0, dither=1) 44 a = np.asarray(img_q) 45 46 img = np.stack([a]*3, axis=2) 47 return np.stack([a]*3, axis=2) 48 49def approximation(pix1, pix2): 50 dif = abs(pix1 - pix2) 51 dv = 15 52 return (dif < dv).all() 53 54def neighbours(idx, lim): 55 w, h, _ = lim 56 i, j = idx 57 return sorted([ 58 (i + n, j + m) 59 for n in range(-1, 2) 60 for m in range(-1, 2) 61 if not (n == 0 and m == 0) and i + n >= 0 and j + m >= 0 and i + n < w and j + m < h 62 ]) 63 64def relabeling(dummy, src, idx, labels, label): 65 q = deque([idx]) 66 while len(q) > 0: 67 idx = q.popleft() 68 labels[idx] = (label * 5, label * 10, label * 30) 69 dummy[idx] = label 70 ns = neighbours(idx, src.shape) 71 q.extendleft(n for n in ns if approximation(src[n], src[idx]) and dummy[n] == 0) 72 73def labeling(): 74 global img,dummy,label 75 76 dummy = np.zeros((h, w), dtype=int) 77 labels = np.zeros((h, w, c), dtype=int) 78 label = 1 79 80 it = np.nditer(img, flags=['multi_index'], op_axes=[[0, 1]]) 81 for n in it: 82 if dummy[it.multi_index] == 0: 83 relabeling(dummy, img, it.multi_index,labels, label) 84 label += 1 85 86 print('label number :',label) 87 88 np.savetxt('results/dummy.txt',dummy.astype(np.uint8),fmt='%d') 89 with open('results/label.txt', 'w') as f: 90 print(label, file=f) 91 cv2.imwrite('results/labeling.png', labels.astype(np.uint8)) 92 cv2.imwrite('results/dummy.png', dummy.astype(np.uint8)) 93 94def detection(): 95 bl,gl,rl = cv2.split(org) 96 bf,gf,rf = cv2.split(org) 97 _lnd,_fld = np.full((h,w), 255),np.full((h,w), 255) 98 99 lab,hsv = cv2.cvtColor(img,cv2.COLOR_BGR2Lab),cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 100 _dis = cv2.imread('results/tex/dissimilarity.png', cv2.IMREAD_GRAYSCALE) 101 _edge = cv2.imread('results/edge/canny.png', cv2.IMREAD_GRAYSCALE) 102 # 領域単位での投票処理 103 for l in range(1,label+1): 104 idx = np.where(dummy==l) 105 106 Lp,ap,bp = np.split(lab[idx],3,axis=1) 107 hp,sp,vp = np.split(hsv[idx],3,axis=1) 108 dis,edge = _dis[idx],_edge[idx] 109 110 landslide = (Lp<180)&(ap>128)&(sp>70)&(edge>100) 111 _flooded = (Lp>135)&(ap>128)&(sp<=70) 112 flooded = _flooded&(~landslide) 113 114 if (np.count_nonzero(landslide)>np.count_nonzero(~landslide)): 115 bl[idx],gl[idx],rl[idx] = (bo[idx]),(go[idx]),(ro[idx]*al+250*(1-al)) 116 _lnd[idx] = 0 117 118 if (np.count_nonzero(flooded)>np.count_nonzero(~flooded)): 119 bf[idx],gf[idx],rf[idx] = (bo[idx]),(go[idx]*al+250*(1-al)),(ro[idx]*al+250*(1-al)) 120 _fld[idx] = 0 121 122 lnd,fld = np.dstack((np.dstack((bl,gl)),rl)),np.dstack((np.dstack((bf,gf)),rf)) 123 124 cv2.imwrite('results/landslide.png', lnd) 125 cv2.imwrite('results/flooded.png', fld) 126 cv2.imwrite('results/_landslide.png', _lnd) 127 cv2.imwrite('results/_flooded.png', _fld) 128 129 return _lnd,_fld

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

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

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

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

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

guest

回答1

0

自己解決

edgeの読み込みをグレースケールでなくカラー画像として読み込み、分割したところメモリエラーを起こさずに実行できました。

methods.py

1(中略) 2 _dis = cv2.imread('results/tex/dissimilarity.png', cv2.IMREAD_COLOR) 3 _edge = cv2.imread('results/edge/canny.png', cv2.IMREAD_COLOR) 4 5 6 # 領域単位での投票処理 7 for l in range(1,label+1): 8 idx = np.where(dummy==l) 9 # print(dummy) 10 # print(l) 11 12 Lp,ap,bp = np.split(lab[idx],3,axis=1) 13 hp,sp,vp = np.split(hsv[idx],3,axis=1) 14 edge,e1,e2 = np.split(_edge[idx],3,axis=1) 15 16 landslide = (Lp<180)&(ap>128)&(sp>70)&(edge>100) 17 _flooded = (Lp>135)&(ap>128)&(sp<=70) 18 flooded = _flooded&(~landslide)

投稿2021/01/22 08:19

mu-ro

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問