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

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

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

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

Python 3.x

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

解決済

python 三重ループの値が更新されない

H4shikaN
H4shikaN

総合スコア1

OpenCV

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

Python 3.x

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

2回答

0評価

1クリップ

668閲覧

投稿2021/07/23 08:08

実現したいこと・問題点

PythonでOpenCVを用いて画像からRGB値により特定の色を精度良く抽出したいです。
そのため、最も精度良く抽出できている最適なパラメータを取得するために、下限のパラメータを1ずつ増加させて画像を保存させています。

そのとき、ファイル名からパラメータがわかるよう画像を保存しているのですが、変数a,b,cがなぜか更新されません。
その結果、同じ画像名の画像が連続で出力され続けています。
しかし、フォルダを見ていると画像は少しずつ変化しているのでパラメータはおそらく更新できているはずです。

どなたか原因が分かる方教えていただけないでしょうか。

該当のソースコード

python3.8.5

import os import cv2 import shutil import glob import numpy as np from time import sleep from PIL import Image cwd = os.getcwd() #file name img_dir = "E:/b/" out = "output" #Lower param lb = 34 lg = 3 lr = 53 #Upper param ub = 114 ug = 75 ur = 150 #Threshold lower = 200 upper = 1500 def test(): path = glob.glob(img_dir + "/*png") outPath = img_dir + "/" + out os.makedirs(outPath, exist_ok=True) for aaa in range (55): for bbb in range(36): for ccc in range(48): for i in path: a = lb + aaa b = lg + bbb c = lr + ccc name = os.path.basename(i) image = cv2.imread(i) # ファイル読み込み bgrLower = np.array([a, b, c]) # 抽出する色の下限 bgrUpper = np.array([ub, ug, ur]) # 抽出する色の上限 bgrResult = bgrExtraction(image, bgrLower, bgrUpper) w,h,c = bgrResult.shape count = 0 #全画素を探索してクロ以外の画素をカウント upper以上になったらストップ for i in range(w): for j in range(h): imgdata = bgrResult[i,j] b,g,r = imgdata if b != 0 and g != 0 and r !=0: count += 1 elif count == upper: break else: continue break #lower以上 uppr以下 であれば画像を保存 if count < lower and count > upper: continue cv2.imwrite(os.path.join(outPath , str(a) + "." + str(b) + "." + str(c) + "-" + name ),bgrResult) print(os.path.join(outPath , str(a) + "." + str(b) + "." + str(c) + "-" + name )) # BGRで特定の色を抽出する関数 def bgrExtraction(image, bgrLower, bgrUpper): img_mask = cv2.inRange(image, bgrLower, bgrUpper) # BGRからマスクを作成 result = cv2.bitwise_and(image, image, mask=img_mask) # 元画像とマスクを合成 return result if __name__ == '__main__': test()

試したこと

下から二行目のところで計算式を入れていたのがいけないのかと思い、変数に代入してからファイル名に入力:結果は変わらず
ファイル名に連番を追加:画像は別々に保存できるが肝心のパラメータがわからないため失敗

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

ここにより詳細な情報を記載してください。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

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

Python 3.x

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