计算机视觉-显著性检测实验报告

实验四  显著性检测实验

一、实验目的

  1. 掌握多种显著性检测算法的基本原理。
  2. 学会使用计算机程序实现不同的显著性检测方法。
  3. 通过对比不同的显著性检测算法,理解各算法的优缺点。
  4. 分析显著性检测在实际图像处理应用中的效果和局限性。

二、实验内容和要求

1.实验内容:

  1. 为每种显著性检测方法选择一组图像作为实验对象。
  2. 使用Python 和 OpenCV分别实现 HC 显著性检测、基于最小方向对比度显著性检测以及基于最稳定区域显著性检测算法。
  3. 调整各算法的参数,比较不同参数设置下的检测效果。
  4. 可视化显著性检测结果,通过图像分析显著性区域的覆盖情况。

2.基本要求:

  1. 编写三种显著性检测程序,并能够对给定图像进行检测。
  2. 熟悉各显著性检测方法的参数及其对检测结果的影响,并能分析不同参数设置下的检测效果。
  3. 对比不同图像和不同算法的检测效果,详细分析并撰写实验报告。

三、实验设备

        实验设备主要有:计算机、OpenCV库

四、实验原理

        1.HC的显著性图生成主要是基于输入图像的颜色值直方图分布,生成像素级别的显著性值,每个像素点的显著性值是它跟剩下全部图像像素点的对比度(色差)来定义的:

上式经过扩展像素等级变如下方程:

其中 N 为图像 I 中的像素数量。

从上式中看出拥有相同像素的值,得到显著性值会相同,把相同的像素值都归为同一类别Cj,对每种颜色得到显著性值:

        2. 在复杂背景下,基于(逐个)像素或者超像素低层特征的方法很难获得鲁棒的显著性结果。事实上,人的视觉系统在判断一个目标是否具有显著性的时候,倾向于将目标区域看作一个整体来考虑,而不是逐个像素或者超像素来计算。

        可以考虑这个像素或者超像素周围的这样一个邻域:其内部各像素应当具有比较相似的颜色或灰度(内部差别小),但其总体又与其外部有明显不同的外观(内外差别大)。将这个满足上述条件、能表示最可能属于哪个目标的最稳定区域

如下图给图片打分:6个得分分别是1.04,4.65、19.25、21.94、20.6、0.0。f得分最高所以对应的区域被定为最稳定区域。

3.基于最小方向对比度的显著性检测是一种用于图像处理的技术,其核心思想是通过计算每个像素点在其周围局部区域内的方向对比度来确定该像素点的显著性。显著性高的区域通常具有明显的方向变化或梯度变化。梯度幅值:代表灰度值变化的大小,可以通过以下公式计算:

[M(x, y) = \sqrt{G_x(x, y)^2 + G_y(x, y)^2}]

其中,(G_x) 和 (G_y) 分别是图像在 (x) 和 (y) 方向的梯度。梯度方向:表示灰度值变化的方向,可以通过以下公式计算:

[\Theta(x, y) = \arctan{\left(\frac{G_y(x, y)}{G_x(x, y)}\right)}]

五、实验步骤

1.HC显著性检测

import cv2
import numpy as np
from matplotlib import pyplot as pltdef figure_normalize(In_image):
# 归一化至0-1o_max_image = np.max(In_image)o_min_image = np.min(In_image)Out_image = (In_image - o_min_image) / (o_max_image - o_min_image)return Out_imageimg_in = cv2.imread("C:\\Users\\aslon\\Desktop\\louna.jpg")//图片路径
m = img_in.shape[0]
n = img_in.shape[1]img_lab = cv2.cvtColor(img_in, cv2.COLOR_BGR2LAB)
img_L_mean = np.mean(img_lab[:,:,0])
img_a_mean = np.mean(img_lab[:,:,1])
img_b_mean = np.mean(img_lab[:,:,2])# 高斯滤波
img_blur = cv2.GaussianBlur(img_in, (7, 7), 0)plt.imshow(cv2.cvtColor(img_blur, cv2.COLOR_BGR2RGB))
plt.show()img_lab_blur = cv2.cvtColor(img_blur, cv2.COLOR_BGR2LAB)
# 计算显著图
Sd = np.zeros((m,n))
for i in range(m):for j in range(n):Sd[i,j] = np.sqrt((img_L_mean - img_lab_blur[i,j,0])**2 + (img_a_mean - img_lab_blur[i,j,1])**2 + (img_b_mean - img_lab_blur[i,j,2])**2)# 归一化
Sd_normalized = figure_normalize(Sd)
cv2.imwrite('FT_saliency.jpg', (255*Sd_normalized).astype(np.uint8))
plt.imshow(Sd_normalized, cmap='gray')
plt.show()

实验原图:

执行结果:

 2.基于最稳定区域的显著性检测

import cv2
import numpy as np
from PIL import Image
def saliency_detection(image):
# 将图像转换为灰度图像gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 构建图像金字塔pyramid = [gray]for i in range(2, 6):pyramid.append(cv2.pyrDown(pyramid[i-2]))# 对每个尺度的图像进行显著性检测saliency_maps = []for level in pyramid:
# 进行二值化处理_, binary = cv2.threshold(level, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)saliency_maps.append(binary)
# 根据显著性图像的最大值选择稳定区域对应的尺度max_index = np.argmax([np.max(map_) for map_ in saliency_maps])stable_map = saliency_maps[max_index]return stable_map
# 读取图像
image = cv2.imread("C:\\Users\\aslon\\Desktop\\lena.jpg")
# 进行显著性检测
saliency_map = saliency_detection(image)
# 显示原始图像和显著性图像
pil_image = Image.fromarray(saliency_map)
pil_image.show()

实验原图:

实验结果:

 3.基于最小方向对比度的显著性检测

import cv2
import numpy as np
def compute_mscn_contrast(img):
# 将图像转换为浮点型img = img.astype(np.float32)
# 计算均值mean, _ = cv2.meanStdDev(img)
# 去除均值img -= mean
# 计算局部对比度img_sq = img * imgmscn_contrast = cv2.GaussianBlur(img_sq, (7, 7), 7)**0.5return mscn_contrast
def estimate_saliency(img):
# 计算最小方向对比度显著性图img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)mscn_contrast = compute_mscn_contrast(img_gray)saliency_map = mscn_contrast
# 归一化saliency_map = (saliency_map - np.min(saliency_map)) / (np.max(saliency_map) - np.min(saliency_map))return saliency_map
# 读取图像
img = cv2.imread("C:\\Users\\aslon\\Desktop\\lena.jpg")
# 计算显著性图
saliency_map = estimate_saliency(img)
# 显示结果
cv2.imshow('Saliency Map', saliency_map)
cv2.waitKey(0)
cv2.destroyAllWindows()

实验原图:

实验结果:

六、实验总结

  1. 视觉评估

        观察显著图是否能够有效地突出图像中的主要目标。例如,在包含人物和背景的图像中,显著图应该使人物区域比背景更亮(表示更显著)。比较基于频率域和空间域方法的显著图,看哪种方法更符合人类的视觉感知。

  1. 定量评估

        可以使用一些指标来评估显著性检测的质量,如准确率 - 召回率曲线(Precision - Recall Curve)、F - measure 等。例如,通过将显著图二值化,与人工标注的显著区域进行比较,计算准确率(正确检测为显著的像素占检测为显著的像素总数的比例)和召回率(正确检测为显著的像素占实际显著像素总数的比例),进而绘制准确率 - 召回率曲线。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/2982.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

05-Dubbo的应用及注册和SPI机制

05-Dubbo的应用及注册和SPI机制 Dubbo 的服务注册中应用级注册优化 Dubbo 的注册中心 Dubbo 支持很多种注册中心,支持的主流注册中心包括:ZooKeeper、Nacos、Redis Dubbo 需要引入注册中心依赖,并且配置注册中心地址,这里以 ZooKe…

【 AI 大模型:重塑软件开发的新势力】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

南宁周边乡村游微信小程序ssm+论文源码调试讲解

第二章 开发工具及关键技术介绍 2.1微信开发者工具 微信开发者工具现在已经被小程序开发团队开发运行,目前微信开发者工具任然在不断的完善中,在开发小程序时经常要不断的更新。可以使用微信扫码登陆开发者工具,开发者工具将使用这个微信帐号…

ssm校园二手交易管理系统+vue

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码看文章最下面 需要定制看文章最下面 目 录 1 绪论 1 1.1 选题背景 1 1.2 选题意义 1 1.3 研究内容 2 2 系统开发技术 3 2.1 MySQL数…

DB-GPT系列(二):DB-GPT部署(镜像一键部署、源码部署)

一、简介 DB-GPT 是一个开源项目,其将大语言模型 LLM 与数据库紧密结合。该项目主要致力于探索如何让预训练的大规模语言模型(例如 GPT)能够直接与数据库进行交互,从而生成更为准确且信息丰富的回答。 DB-GPT部署后能否直接使用…

掌握 Jest 配置文件:优化单元测试的灵活性与可维护性

引言 在现代软件开发中,单元测试是确保代码质量和稳定性的关键步骤。Jest 是一个广泛使用的 JavaScript 测试框架,提供了丰富的配置选项来优化测试过程。通过配置文件,开发者可以更灵活地控制测试环境,确保测试的可靠性和可维护性…

网络:IP分片和组装

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言16位标识,3位标志,13位片偏移分片组装总结 前言 对于IP分片和组装的总结 当一个IP数据报的大小超过网络的MTU(最…

Node.js:Express 中间件 CORS 跨域资源共享

Node.js:Express 中间件 & CORS 中间件全局中间件局部中间件分类错误级中间件内置中间件 CORS原理预检请求 中间件 中间件是不直接接收请求,也不直接发送响应,而是在这之间处理一个中间过程的组件。 当一个请求到来,会经过多…

【VScode】中文版ChatGPT编程工具-CodeMoss!教程+示例+快捷键

文章目录 1. 多模型选择2. 编辑快捷键3. 历史记录收藏 CodeMoss使用教程1. 安装CodeMoss插件2. 配置AI模型3. 使用快捷键4. 进行代码优化与解释5. 收藏历史记录 总结与展望 在当今快速发展的编程世界中,开发者们面临着越来越多的挑战。如何提高编程效率,…

LabVIEW适合开发的软件

LabVIEW作为一种图形化编程环境,主要用于测试、测量和控制系统的开发。以下是LabVIEW在不同应用场景中的适用性和优势。 一、测试与测量系统 LabVIEW在测试与测量系统中的应用广泛,是工程测试领域的主流工具之一。利用其强大的数据采集与处理功能&…

命令模式(Command)

1 意图 将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 2 结构 Command 声明执行操作的接口。ConcreteCommand 将一个接收者对象绑定于一个动作;调用接收者相应的操作&#xff0c…

Linux 线程概念

一. 线程的基本概念 线程是进程内的一个执行单元,它是调度和执行的基本单位。 1.1 Linux中的线程 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。 1.2 线程的优点 创建一个新线程的代价要比创建一个新进程小得多。与进…

Qt聊天室项目

目录 项目要求 项目背景 技术分析 架构设计 服务器架构 模块划分 模块之间的交互 客户端架构 模块划分 模块之间交互 项目展示 项目实现 服务器 ui server.pro dialog.h dialog.cpp 客户端 ui cient.pro dialog.h dialog.cpp 打包步骤不做演示 视频演示 项目…

node.js模块化分析

什么是Node.js模块化 Node.js中的模块化‌是指将一个大文件拆分成独立且相互依赖的多个小模块。每个JS文件被视为一个独立的模块,模块之间是互相不可见的。如果一个模块需要使用另一个模块,则需要使用指定的语法来引入该模块,并且只能使用模块…

sql练习专场(一) (1-5)

这是总结的一些sql题目,共25道题,每个博客会写5道题 第一题 这道题需要找出连续活跃3天以上的用户,其中每个用户每天可以连续登录多次。 create table sql1_1(uid string,dt string );insert into sql1_1 values(A,2023-10-01),(A,2023…

自动化立体仓库:详细设计方案

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 这份文件是关于自动化立体仓库设计方案的详细介绍,包括了自动化立体仓库的重要性、特点、设计程序、机械部分设计方案、系统硬件设计、系统软件设计以及系统调试等关键部分…

windows运行ffmpeg的脚本报错:av_ts2str、av_ts2timestr、av_err2str => E0029 C4576

问题描述 我目前的环境是: 编辑器: Microsoft Visual Studio Community 2022 (64 位) 运行的脚本是ffmpeg自带的remux样例,只不过我想用c语言执行这个样例。在执行的过程中报错如下图: C4576 后跟初始值设定项列表的带圆括…

CentOS 文件系统扩容与缩容

一、 概述 理解Linux文件系统的管理,需要了解以下的一张图: 一般使用LVM (Logical Volume Manager) 管理磁盘存储,该工具允许用户更灵活地分配和管理存储空间。主要有以下几个概念: PV(Physical Volume,物…

Linux系统使用第三方邮件客户端发送邮件

文章目录 安装第三方邮件客户端(s-nail)S-nail的简单介绍重要的特性差异 配置邮件服务配置文件 (以QQ邮箱为例)获取QQ邮箱授权码获取QQ服务器证书使用 OpenSSL 获取 QQ 邮箱服务器的证书安装OpenSSL连接到 QQ 邮箱的 SMTP 服务器并下载证书保存证书验证证…

家常菜点餐|基于java和小程序的家庭大厨家常菜点餐系统设计与实现(源码+数据库+文档)

家常菜点餐系统 目录 基于java和小程序的家庭大厨家常菜系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&am…