利用简单的中值滤波提取视频背景

原理

  最近在learn opencv上学习简单的图像处理的知识,也算是提前了解一下opencv的基本操作吧。
  基本思想就是利用中值滤波,找到视频帧中的背景,然后用每一帧的图像减去背景即可得到背景中移动的物体了。

代码实现

  代码中用到的视频地址
  代码如下:

import numpy as np
import cv2
import imageio
# Open Video
cap = cv2.VideoCapture('video.mp4')

# Randomly select 25 frames
frameIds = cap.get(cv2.CAP_PROP_FRAME_COUNT) * np.random.uniform(size=25)
print(cap.get(cv2.CAP_PROP_FRAME_COUNT))

# Store selected frames in an array
frames = []
for fid in frameIds:
    cap.set(cv2.CAP_PROP_POS_FRAMES, fid)
    ret, frame = cap.read()
    if ret==True:
        frames.append(frame)

# Calculate the median along the time axis
medianFrame = np.median(frames, axis=0).astype(dtype=np.uint8)

# Display median frame
cv2.imshow('frame', cv2.cvtColor(medianFrame,cv2.COLOR_RGB2GRAY))
# set the frame id as 0
cap.set(cv2.CAP_PROP_POS_FRAMES,0)
gif=[]
while(True):
    try:
        ret,frame=cap.read()
        graymedianFrame=cv2.cvtColor(medianFrame,cv2.COLOR_RGB2GRAY)
        frame=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)
        dframe=cv2.absdiff(frame,graymedianFrame)
        th, dframe = cv2.threshold(dframe, 30, 255, cv2.THRESH_BINARY)
        if ret==True:
            cv2.imshow('video',dframe)
            gif.append(dframe)
            cv2.waitKey(20)
        else:
            break
    except:
        imageio.mimsave("demo.gif",gif,"GIF")
cap.release()
cv2.destroyAllWindows()

效果如下:
demo
效果还是挺不错的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中值滤波可以有效地去除图像中的噪声,从而提取出图像中的运动目标。下面是利用中值滤波提取运动目标的步骤: 1. 读入视频帧序列,将其转换为灰度图像。 2. 对每一帧图像进行中值滤波,去除图像中的噪声。 3. 选择一帧图像作为背景图像,将其作为参考。 4. 对于每一帧图像,将其与背景图像进行比较,得到差分图像。 5. 对差分图像进行二值化处理,得到二值化图像。 6. 对二值化图像进行形态学处理,消除小的干扰区域,得到运动目标的二值化图像。 7. 在原始图像上将运动目标用矩形框标出。 下面是一份利用中值滤波提取运动目标的 Matlab 代码,供参考: ```matlab % 读入视频帧序列 video = VideoReader('video.avi'); % 选择一帧作为背景图像 background = read(video, 1); background = rgb2gray(background); % 中值滤波窗口大小 windowSize = 5; % 形态学处理窗口大小 se = strel('disk', 3); % 阈值 threshold = 20; % 读取所有帧 while hasFrame(video) % 读取当前帧 frame = readFrame(video); % 转换为灰度图像 frame = rgb2gray(frame); % 中值滤波 frame = medfilt2(frame, [windowSize windowSize]); % 差分图像 diff = abs(double(frame) - double(background)); % 二值化图像 binary = diff > threshold; % 形态学处理 binary = imclose(binary, se); binary = imfill(binary, 'holes'); binary = bwareaopen(binary, 50); % 标记运动目标 stats = regionprops(binary, 'BoundingBox'); for i = 1:length(stats) rectangle('Position', stats(i).BoundingBox, 'EdgeColor', 'r', 'LineWidth', 2); end % 更新背景图像 background = frame; end ``` 这份代码中,中值滤波使用了 5x5 的窗口大小,形态学处理使用了 3x3 的圆形窗口大小,阈值为 20,可以根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值