在opencv视频上的颜色阈值

时间:2013-06-02 12:51:04

标签: opencv colors video-processing

我正在对opencv视频中的颜色范围进行阈值处理。目标是在医学超声视频中为学术项目分离B模式(黑白,有关位置但不是速度的信息)的彩色流多普勒模式(速度信息)。我已经尝试根据我从超声波机器(浅蓝色[opencv hue 90]到黄色[opencv hue 35])提供的色标重建的HSV色调范围进行阈值处理。不幸的是,结果并不好。在阈值处理中我犯了错误吗?或者是否有另一种方法可以达到预期的效果?下面是我的代码和我的结果的框架示例。 result example

#!/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()

1 个答案:

答案 0 :(得分:3)

仅基于Hue组件的阈值处理在某种程度上是无用的 如下所示,对于一个特殊的Hue,可能的颜色范围也包括灰色。

spectrum

另外,看到H,S,V频道,我可以说只有H频道无法帮助你。您还应该使用饱和度通道:

Hue Channel
(顺化频道)

但是,您可以看到饱和度通道可以帮助您更轻松地找到彩色区域:

Saturation

过滤饱和度< 180色,会给你这个:
Thresh Sat

现在你有丰富多彩的领域。如果该侧边栏始终位于您处理的图片中,您只需过滤价值通道中的值< 150以过滤它们:

Sat and Val Filter

顺便说一下,使用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)