2

opencv ビデオの色範囲のしきい値を設定しています。目標は、学術プロジェクトの医療用超音波ビデオで、B モード (黒と白、場所に関する情報であり、速度に関する情報ではない) をカラー フロー ドップラー モード (速度情報) から分離することです。超音波装置によって提供されたカラースケールから再構築したHSV色相範囲に基づいてしきい値を設定しようとしました(水色[opencv色相90]から黄色[opencv色相35])。残念ながら、結果は良くありません。しきい値設定を間違えましたか? または、望ましい結果を達成するための別の方法はありますか? 以下は私のコードと私の結果のフレーム例です。 結果例

#!/usr/bin/env python
# -*- coding: utf-8 -*-

##IMPORTS
import cv2.cv as cv
import numpy as np

##VARIABLES
#colors
doppler_hues=np.concatenate([np.arange(90,181),np.arange(0,36)])

##MAIN
#start video stream analysis
frames = raw_input('Please enter video file:')
if not frames:
   print "This program requires a file as input!"
   sys.exit(1)


# first, create the necessary windows
cv.NamedWindow ('image', cv.CV_WINDOW_AUTOSIZE)
cv.NamedWindow ('original', cv.CV_WINDOW_AUTOSIZE)

#File capture
vidFile = cv.CaptureFromFile(frames)
nFrames = int(  cv.GetCaptureProperty( vidFile, cv.CV_CAP_PROP_FRAME_COUNT ) )
fps = cv.GetCaptureProperty( vidFile, cv.CV_CAP_PROP_FPS )
waitPerFrameInMillisec = int( 1/fps * 1000/1 )


for f in xrange( nFrames ):
   #frame capture
   frame = cv.QueryFrame( vidFile )

   # create the images we need
   original = cv.CreateImage (cv.GetSize (frame), 8, 3)
   cv.Copy(frame,original)
   image = cv.CreateImage (cv.GetSize (frame), 8, 3)
   cv.CvtColor(frame, image, cv.CV_BGR2HSV)
   image2 = cv.CreateImage (cv.GetSize (frame), 8, 3)

   if not frame:
      break

   #Replace pixel colors
   image=np.asarray(image[:,:])
   hue=np.resize(image,(480,640,1))
   hue[np.where((np.not_equal(hue,doppler_hues)).all(axis=2))]=[0]
   hue2=np.resize(hue,(480,640,3))
   image[np.where((hue2==[0,0,0]).all(axis=2))]=[0,0,0]

   image=cv.fromarray(image[:,:])
   cv.CvtColor(image, image2, cv.CV_HSV2BGR)

   #show the image
   cv.ShowImage("image", image2)
   cv.ShowImage("original", original)

   #quit command ESC
   if cv.WaitKey(waitPerFrameInMillisec)==27:
      break
   else:
      cv.WaitKey(waitPerFrameInMillisec) % 0x100

cv.DestroyAllWindows()
4

1 に答える 1

3

色相コンポーネントのみに基づくしきい値処理は、どういうわけか役に立ちません。
以下に示すように、特定の色相の場合、可能な色の範囲には灰色も含まれます。

スペクトラム

また、H、S、V チャンネルを見ると、H チャンネルだけでは役に立たないと言えます。彩度チャネルも使用する必要があります。

色相チャンネル
(色相チャンネル)

ただし、彩度チャネルを使用すると、カラフルな領域を簡単に見つけることができます。

飽和

彩度 <180 色をフィルタリングすると、次のようになります。
脱穀土

これで、カラフルな領域ができました。そのサイドバーが処理する画像に常にある場合は、Value チャネルで Value<150 をフィルタリングして、それらも除外することができます。

Sat および Val フィルター

ところで、cv2 を使用すると、コードがはるかに読みやすくなり、保守が容易になります。

import cv2

img = cv2.imread('image.png')
image_thr = img.copy()

imh = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
image_thr[(imh[...,1]<180) | (imh[...,2]<150)]=0

cv2.imshow('filtered',image_thr)
于 2013-06-02T21:36:07.497 に答える