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

实验四 显著性检测实验

一、实验目的

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

二、实验内容和要求

1.实验内容:

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

2.基本要求:

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

三、实验设备

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

四、实验原理

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

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

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

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

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

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

如下图给图片打分: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显著性检测

python 复制代码
import cv2
import numpy as np
from matplotlib import pyplot as plt

def figure_normalize(In_image):
# 归一化至0-1
    o_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_image

img_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.基于最稳定区域的显著性检测

python 复制代码
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.基于最小方向对比度的显著性检测

python 复制代码
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 * img
    mscn_contrast = cv2.GaussianBlur(img_sq, (7, 7), 7)**0.5
    return 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 等。例如,通过将显著图二值化,与人工标注的显著区域进行比较,计算准确率(正确检测为显著的像素占检测为显著的像素总数的比例)和召回率(正确检测为显著的像素占实际显著像素总数的比例),进而绘制准确率 - 召回率曲线。

相关推荐
千穹凌帝1 分钟前
基于深度学习多图像融合的屏幕缺陷检测方案
人工智能·深度学习·数码相机
上理考研周导师1 小时前
【单片机原理】第1章 微机基础知识,运算器,控制器,寄存器,微机工作过程,数制转换
算法
檀越剑指大厂1 小时前
【Python系列】Python中的`any`函数:检查“至少有一个”条件满足
开发语言·python
程序员黄同学2 小时前
如何使用 Python 连接 MySQL 数据库?
数据库·python·mysql
I_Am_Me_2 小时前
【JavaEE初阶】线程安全问题
开发语言·python
IT猿手2 小时前
基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码
算法·elk·机器学习·matlab·无人机·聚类·强化学习
张叔zhangshu2 小时前
TensorFlow 的基本概念和使用场景
人工智能·python·tensorflow
运维&陈同学2 小时前
【Elasticsearch05】企业级日志分析系统ELK之集群工作原理
运维·开发语言·后端·python·elasticsearch·自动化·jenkins·哈希算法
新手小袁_J3 小时前
实现Python将csv数据导入到Neo4j
数据库·python·neo4j·《我是刑警》·python连接neo4j·python导入csv·csv数据集导入neo4j
清风ꦿ3 小时前
neo4j 图表数据导入到 TuGraph
python·neo4j·knowledge graph