Opencv之谱残差显著性检测

article/2025/10/12 8:42:23

学习资料参考:

张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.


前言

在使用谱残差进行显著性检测之前,我们需要理解两个概念,分别是幅度谱和相位谱。
幅度谱和相位谱是将图片进行傅里叶正向变换之后得到的结果。幅度谱表示的是每个正弦波的最大幅度值,相位谱表示的是每个正弦波的相位(当然需要选定一个基点)。


原理

图像的傅里叶变换是由幅度谱和相位谱表示的,即通过幅度谱和相位谱可以还原图像。而显著性检测就是通过调整幅度谱和相位谱显示显著目标。


主要操作步骤

  1. 计算图像的快速傅里叶变换矩阵 F F F
  2. 计算傅里叶变换的幅度谱的灰度级H1
  3. 计算相位谱,根据相位谱计算对应的正弦谱和余弦谱
  4. H 1 H1 H1进行平滑得到 H 2 H2 H2
  5. 计算谱残差。谱残差= H 2 − H 1 H2-H1 H2H1
  6. 对谱残差矩阵的每一个值进行幂指数运算,得到H3
  7. 将H3作为新的“幅度谱”,并结合原图的相位谱进行傅里叶逆变换,得到复数矩阵M。
  8. 将M进行开方计算并进行高斯平滑和灰度级转换。

python实现

import cv2
import numpy as np
from matplotlib import pyplot as plt# 读取图片
image = cv2.imread(r"C:\Users\1\Pictures\test2.jpg", 0)# 快速傅里叶变换
r, c = image.shape[:2]
rPadded = cv2.getOptimalDFTSize(r)
cPadded = cv2.getOptimalDFTSize(c)
fft2 = np.zeros((rPadded, cPadded, 2), np.float32)
fft2[:r, :c, 0] = image
cv2.dft(fft2, fft2, cv2.DFT_COMPLEX_OUTPUT)# 计算幅度谱
amplitude = cv2.magnitude(fft2[:, :, 0], fft2[:, :, 1])
# 幅度谱的灰度级
logAmplitude = np.log(np.abs(amplitude) + 1.0)# 相位谱
phase = np.arctan2(fft2[:, :, 1], fft2[:, :, 0])
# 余弦谱
cosSpectrum = np.cos(phase)
# 正弦谱
sinSpectrum = np.sin(phase)# 对幅度谱的灰度级进行均值平滑
meanLogAmplitude = cv2.boxFilter(logAmplitude, cv2.CV_32FC1, (3, 3))# 计算谱残差
spectralResidual = logAmplitude - meanLogAmplitude# 谱残差的幂指数运算(因为前面进行了对数取值运算)
expSR = np.exp(spectralResidual)
# 计算实部和虚部
real = expSR * cosSpectrum
imaginary = expSR * sinSpectrum# 合并实部和虚部
com = np.zeros((real.shape[0], real.shape[1], 2), np.float32)
com[:, :, 0] = real
com[:, :, 1] = imaginary# 进行傅里叶逆变换
saliencymap = cv2.dft(com, flags=cv2.DFT_COMPLEX_OUTPUT + cv2.DFT_INVERSE)
saliencymap = np.power(saliencymap[:, :, 0], 2) + np.power(saliencymap[:, :, 1], 2)
saliencymap = cv2.GaussianBlur(saliencymap, (11, 11), 2.5)
saliencymap = saliencymap / np.max(saliencymap)# 伽马变换,增加对比度
saliencymap = np.power(saliencymap, 0.5)
saliencymap = np.round(saliencymap * 255)
saliencymap = saliencymap.astype(np.uint8)# 显示图片的变化过程
plt.subplot(231), plt.imshow(image, 'gray'), plt.title('Original Image')
plt.axis('off')
plt.subplot(232), plt.imshow(logAmplitude, 'gray'), plt.title('logAmplitude Image')
plt.axis('off')
plt.subplot(233), plt.imshow(meanLogAmplitude, 'gray'), plt.title('mean Image')
plt.axis('off')
plt.subplot(234), plt.imshow(spectralResidual, 'gray'), plt.title('spectra Image')
plt.axis('off')
plt.subplot(235), plt.imshow(saliencymap, 'gray'), plt.title('saliencymap Image')
plt.axis('off')
plt.show()

运行结果
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/ZwC1EeCo.shtml

相关文章

显著性检测——GR模型

显著性检测——GR模型 1. Introduction2. Saliency Model2.1 Initial Saliency Map2.2 Saliency Map Refining With Graph Regularization 3. Experiments4. Conclusion参考文献 本人最近在做视觉显著性检测相关的工作,决定把自己的学习经历形成文字,希望…

视频显著性检测----《Flow Guided Recurrent Neural Encoder for Video Salient Object Detection》

本文将重点与大家探讨和分享发表于CVPR2018上的视频显著性检测文章–《Flow Guided Recurrent Neural Encoder for Video Salient Object Detection》,在讨论之前,先带领大家简单回顾一下什么是显著性检测,目前图片显著性检测的常用方法&…

计算机视觉——图像视觉显著性检测

目录 系列文章目录 零、问题描述 一、图像显著性检测 1.定义 2.难点 二、常用评价标准和计算方法 1.综述 2.ROS曲线详述 2.1 混淆矩阵 2.2 ROC曲线简介 2.3 ROC曲线绘制及其判别标准 2.4 ROC曲线补充 三、Fast and Efficient Saliency (FES) 1.算法简介 2.项目导…

显著性检测后处理

将显著性检测图像后处理,绘出一个矩形框,方便使用 先通过边缘检测,然后通过opencv接口实现 结果如下: # --coding:utf # -8-*- import osimport cv2 as cv import numpy as np# canny边缘检测 def canny_demo(image):t 50cann…

基于深度学习的视频显著性检测学习(入门)

一、传统的视频显著性检测 什么是视频显著性检测呢? 我的理解是检测某一段视频的每一帧图片的显著性区域,那这样理解的话就相当于多个图片的显著性检测,所以他是依赖于输入视频帧的对比度、梯度以及纹理来进行相关计算。但既然是视频显著性检…

显著性检测—学习笔记

视觉显著性旨在模仿人类视觉系统选择视觉场景的某个子集的能力。而显著性物体检测(SOD)则侧重于检测场景中吸引最多注意力的物体,然后逐像素的提取物体的轮廓。SOD的优点在于它在许多计算机视觉任务中均有广泛的应用,包括&#xf…

显著性检测

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_32493539/article/details/79530118 转载请附链接,注明出处。 显著性对象检测综述…

在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具

最近发现一个超好用的“在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具”。 链接在此奉上:在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具 很好的一点就是我们只要QQ登录后,就可以记住请求地址,包括请求参数,包括请求co…

https协议的接口测试

用jmeter测试https接口: 和传统的http协议套路不太一样. 注意细节: 1、取样器正常选择http请求,端口号:为443(具体根据接口文档我刚开始用的80端口所以错了) 2、请求方法,一定一句接口文档&…

接口测试HTTP请求

一、Get请求与Post请求的区别 1.get请求没有请求体,post请求有请求体 2.get请求的参数(需要传递的数据)要放在URL中发送。大小有限制 post请求的参数可以放在URL后传递,也可以放在请求体中(大小不受限制&#xff09…

Jmeter进行http接口测试,这一篇就搞定

jmeter-http接口测试脚本 jmeter进行http接口测试的主要步骤 (1.添加线程组 2.添加http请求 3.在http请求中写入接口的URL,路径,请求方式,参数 4.添加查看结果树 5.调用接口,查看返回值) 针对接口添加…

http接口测试——Jmeter接口测试实例讲解

一、测试需求描述 1、 本次测试的接口为http服务端接口 2、 接口的主要分成两类,一类提供给查询功能接口,一类提供保存数据功能接口,这里我们举例2个保存数据的接口,因为这两个接口有关联性,比较有代表性;…

http接口测试工具-Advanced-REST-client

非常好用的http接口测试工具 相信作为一个java开发人员,大家或多或少的要写或者接触一些http接口。而当我们需要本地调试接口常常会因为没有一款好用的工具而烦恼。今天要给大家介绍一款非常好用、实用且方便的http接口测试工具。本人认为这是目前我用过的最好http…

http接口测试:了解协议、请求方法、响应状态码

http接口测试:了解协议、请求方法、响应状态码 接口在各个系统间的重要性无需重申,主要体现在外部系统与系统之间以及内部各子系统之间的交互点。通过这些特定的交互点和一些特殊的规则标准(协议)来进行系统数据之间的交互&#…

如何用postman进行http接口测试?好好看好好学

目录 优点: 1、什么是POSTMAN 2、新建一个项目 2、新增一个用例 3、添加请求信息 4、post请求参数 5、添加头信息 6、预处理和结果检查 7、全局变量与环境变量 8、导出用例为代码 9、批量执行用例 HTTP的接口测试工具有很多,可以进行http请求…

如何用postman进行http接口测试,这篇文章绝对会颠覆你的认知

目录 前言 优点: 1、什么是POSTMAN 2、新建一个项目 2、新增一个用例 3、添加请求信息 4、post请求参数 5、添加头信息 6、预处理和结果检查 7、全局变量与环境变量 8、导出用例为代码 9、批量执行用例 前言 HTTP的接口测试工具有很多,可以进…

http接口测试工具

http接口测试工具 工具图形界面特点postmanY图形界面,功能齐全curlN可用于下载,但更侧重于模拟各种http请求,与网站API的交互wgetN专注于下载,支持断点,支持递归(可用于全站下载)httpieN采用Pt…

接口测试——HttpClient

这里写目录标题 Get请求Post请求HttpClient设置代理FastJson的应用示例常用的代码块正则表达式(提取)封装后的一个demo HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包…

jmeter之接口测试(http接口测试)

基础知识储备 一、了解jmeter接口测试请求接口的原理 客户端--发送一个请求动作--服务器响应--返回客户端 客户端--发送一个请求动作--jmeter代理服务器---服务器--jmeter代理服务器--服务器 二、了解基础接口知识: 1、什么是接口:前端与后台之间的…

http post请求接口测试

http post请求接口测试 单纯的http post请求,请求参数为json格式的接口测试总结。 方法一Postman(推荐): 最简单的方法是用Postman (可做post请求模拟工具用)。真的超级简单,下面是操作方法&…