前提・実現したいこと
pythonのOpenCVを用いて、画像を2値化し、輪郭を捉え、外接矩形を描くことに挑戦しております。
一つの画像から物体を検出する際、閾値処理を行いますが、閾値を1から255までfor文で繰り返してみたところ、前に描かれた矩形が保存された状態で次の矩形が描かれました。
(例えば、閾値140の矩形付画像には、閾値1から139までに描かれた矩形がそのまま保存されているのです。)
本来の目的としては、閾値140とした時は、閾値140のときにのみ検出された輪郭から矩形を描いて欲しいのです。これを1から255までで繰り返したいのです。
ご教授ください。
ここに質問の内容を詳しく書いてください。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
ソースコード import matplotlib.pyplot as plt import cv2 import os name = "control_Ca_26_micro_1min_21" Path = "/Volumes/BioDB_3/data" os.makedirs("{0}/{1}".format(Path, name), exist_ok = True) src = cv2.imread("{}.tif".format(name), cv2.IMREAD_COLOR) 画像を読み込む # グレースケール画像へ変換 gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) #cvtColor・・・画像の色を変換(convert) gray = cv2.GaussianBlur(gray, (5, 5), 0) 画像を平滑化( plt.imshow(cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB)) plt.show() #0から255の範囲の閾値で2値化 for Threshold in range(0,255): # 2値化する retval, bw = cv2.threshold(gray, Threshold, 255, cv2.THRESH_BINARY) # 輪郭を検知 bw, contours, hierarchy = cv2.findContours(bw, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 矩形検出された数の初期化(デフォルトで0を指定) detect_count = 0 for i in range(0, len(contours)): # 輪郭の領域を計算 area = cv2.contourArea(contours[i]) if area < 3000 or 50000 < area: continue # 外接矩形をかく if len(contours[i]) > 0: rect = contours[i] x, y, w, h = cv2.boundingRect(rect) cv2.rectangle(src, (x, y), (x + w, y + h), (0, 0, 255), 2)#赤色で 線の太さ2 の四角形を描く detect_count = detect_count + 1 plt.imshow(cv2.cvtColor(src, cv2.COLOR_BGR2RGB)) cv2.imwrite("{0}/{1}/kiridashi{2}.tif".format(Path, name, Threshold), src) ### 試したこと ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー