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

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

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

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

Q&A

解決済

1回答

1222閲覧

[Python] 画像処理の二重ループの解消

yukiobata

総合スコア5

Python

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

0グッド

0クリップ

投稿2019/09/22 13:05

編集2019/09/22 14:26

実現したいこと

pythonの画像処理を高速化したいです。f(x,y)をそのピクセルの画素値,l(x,y)は1だったら白、0だったら黒としてイメージ説明
このような処理を達成するために下のコードを書いたのですが、二重ループが入っているので遅く、高速化したいです。どのように改善したら良いか、どのようなモジュールを使えばいいか、ご教示ください。

該当のソースコード

python3

1picture = cv2.imread("/Users/name/Courtemplete.png") 2gray = cv2.cvtColor(picture,cv2.COLOR_RGB2GRAY) 3σl = 180 4σd = 40 5τ = 8 6background_thresh = np.where(gray<σl,0,255).astype(np.uint8) 7for x in range(τ,picture.shape[0]-τ): 8 for y in range(τ,picture.shape[1]-τ): 9 if background_thresh[x,y]: 10 pixel = gray[x,y] 11 12 pix_candicate[x,y] = ((((pixel-gray[x+τ,y])>σd) and ((pixel-gray[x-τ,y])>σd)) or (((pixel-gray[x,y+τ])>σd) and ((pixel-gray[x,y-τ])>σd))) 13 else: 14 pix_candicate[x,y] = 0

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

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

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

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

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

pepperleaf

2019/09/22 14:20

小手先としては、何度も出現する gray[x, y] を一時変数に入れる。 最適化で消えるか? もっと簡便なのがありそうなので、回答でなく、こちらに置きます。
yukiobata

2019/09/22 14:27 編集

やって見ました。ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

numpy.rollで差分位置の値をとることにより、numpy演算のみでいけそうです。
ちゃんと検証はしていませんが、元コードと同じ画像結果が得られました。

Python

1import cv2 2import numpy as np 3 4def func(img): 5 img_self = img >= σl 6 7 img_minus_x = (img - np.roll(img, τ, axis=1)) > σd 8 img_plus_x = (img - np.roll(img, -τ, axis=1)) > σd 9 img_minus_y = (img - np.roll(img, τ, axis=0)) > σd 10 img_plus_y = (img - np.roll(img, -τ, axis=0)) > σd 11 12 c1 = (img_self & img_minus_x & img_plus_x) 13 c2 = (img_self & img_minus_y & img_plus_y) 14 lf = (c1 | c2) 15 16 ret = np.zeros(img.shape) 17 ret[τ:-τ,τ:-τ] = lf[τ:-τ,τ:-τ] 18 19 return ret 20 21picture = cv2.imread('lena.png') 22gray = cv2.cvtColor(picture,cv2.COLOR_RGB2GRAY) 23 24σl = 180 25σd = 40 26τ = 8 27 28ret = func(gray) 29 30# 確認用の画像 31ret *= 255 32cv2.imwrite('ret.png', ret)

イメージ説明

投稿2019/09/23 02:17

can110

総合スコア38233

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

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

yukiobata

2019/09/23 03:10

うまくいきました!記法もわかりやすく、参考にします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問