gpt4 book ai didi

opencv - opencv 视频的颜色阈值

转载 作者:太空宇宙 更新时间:2023-11-03 21:28:01 26 4
gpt4 key购买 nike

我正在对 opencv 视频中的颜色范围进行阈值处理。目标是在学术项目的医学超声视频中将 B 模式(黑白,位置信息而非速度信息)与彩色血流多普勒模式(速度信息)分开。我尝试根据 HSV 色调范围设置阈值,该范围是我从超声波机器提供的色标重建的(浅蓝色 [opencv hue 90] 到黄色 [opencv hue 35])。不幸的是,结果并不好。我在阈值中犯了错误吗?或者会有另一种方法来达到预期的结果吗?下面是我的代码和我的结果的框架示例。 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()

最佳答案

仅基于 Hue 组件的阈值在某种程度上是无用的。
正如您在下面看到的,对于特定的色调,可能的颜色范围还包括灰色。

spectrum

此外,看到 H、S、V channel ,我可以说仅靠 H channel 无法帮助您。您还应该使用饱和度 channel :

Hue Channel
(色相 channel )

不过,您可以看到饱和度 channel 可以帮助您更轻松地找到彩色区域:

Saturation

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

现在你有了彩色区域。如果那个侧边栏总是在你处理的图片中,你可以在 Value channel 中过滤 Value<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)

关于opencv - opencv 视频的颜色阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16882928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com