【附代码实现】图像差分法

前言

研究生阶段用到了一点图像差分的技术,现在分享出来,算是对工作的一些总结吧

1.差分法

面部表情图像在采集时难免会引入光照、背景等噪声,并且人脸表情自身还存在着个体差异。针对个体差异及环境噪声对抑郁症识别的影响,使用人脸表情图像差分方法,最大化保留人脸表情信息的同时,消除个体差异和环境噪声。实验中选取每个受试者的第一帧图像作为标准帧,其余图像作为被测帧进行图像差分:

  • 针对光线图像噪声等自然条件干扰的影响,使用高斯滤波器对图像进行平滑降噪,抑制噪声。
  • 将被测帧在图像空间域上与标准帧进行差分𝐷𝑓(𝑥,𝑦,∇𝑡_𝑖 )=𝑎𝑏𝑠[𝑓(𝑥,𝑦,𝑡_𝑖 )−𝑓(𝑥,𝑦,𝑡_0)]。
  • 将差分后的图像灰度值归一化至0-255之间。
  • 形态学处理,利用腐蚀和膨胀处理提取差分图像的边缘信息。

2.效果图

在这里插入图片描述

2.程序

import os
import cv2
import numpy as np

# 指定GPU
# os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"          #按照PCI_BUS_ID顺序从0开始排列GPU设备
# os.environ["CUDA_VISIBLE_DEVICES"] = "2"                #使用第3块GPU进行训练

def generate_flow(src, des): # 以个体为单位生成光流图
    """

    :param src: 原图每个个体的文件夹路径
    :param des: 差分图每个个体的文件夹路径
    :return:
    """
    def mkfile(file):
        if not os.path.exists(file):
            os.makedirs(file)

    file_list=os.listdir(src)
    file_list = sorted(file_list)

    # 获取第一帧
    frame1 = cv2.imread(os.path.join(src, file_list[0]))

    for file in file_list:
        # 选取第一帧作为背景图
        background_img = frame1.astype(np.int16)
        # 对背景图高斯滤波
        #background_img_blur = cv2.GaussianBlur(background_img, (3, 3), 0)
        path = os.path.join(src, file)
        # 读取前景图片
        front_image = cv2.imread(path).astype(np.int16)
        # 对前景图高斯滤波
        #front_image_blur = cv2.GaussianBlur(front_image, (3, 3), 0)
        # 图像差分
        differ_image = cv2.absdiff(front_image, background_img)
        # # 二值化处理,用OTSU自动寻找阈值,th2为返回的图像
        # ret2, differ_image = cv2.threshold(differ_image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
        # # #
        # 把灰度值归一化到0~255
        differ_image = cv2.normalize(differ_image, None, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC3)
        # 形态操作
        kernel = np.ones((1, 1), np.uint8)
        differ_image = cv2.morphologyEx(differ_image, cv2.MORPH_OPEN, kernel)
        mkfile(des)
        # 写入新的文件夹
        try:
            cv2.imwrite(os.path.join(des, file), differ_image)
        except Exception as e:
            continue

        prvs = next
    print('img number:%d' % len(os.listdir(des)))

original_dir_path = r"C:\Users\yc\Desktop\zong"
flow_dir_path = r"C:\Users\yc\Desktop\shengcheng"

for root, s_dirs, _ in os.walk(original_dir_path, topdown=True):
    s_dirs = sorted(s_dirs)
    print (s_dirs)
    for sub_dir in s_dirs:
        sub_dir_path = os.path.join(root, sub_dir)  # 原图每个个体文件夹的绝对路径
        flow_dir_path_geti = os.path.join(flow_dir_path, sub_dir)
        generate_flow(sub_dir_path, flow_dir_path_geti)
        print('%s is finished!' % sub_dir)
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值