计算机视觉-显著性检测实验报告
实验四 显著性检测实验
一、实验目的
- 掌握多种显著性检测算法的基本原理。
- 学会使用计算机程序实现不同的显著性检测方法。
- 通过对比不同的显著性检测算法,理解各算法的优缺点。
- 分析显著性检测在实际图像处理应用中的效果和局限性。
二、实验内容和要求
1.实验内容:
- 为每种显著性检测方法选择一组图像作为实验对象。
- 使用Python 和 OpenCV分别实现 HC 显著性检测、基于最小方向对比度显著性检测以及基于最稳定区域显著性检测算法。
- 调整各算法的参数,比较不同参数设置下的检测效果。
- 可视化显著性检测结果,通过图像分析显著性区域的覆盖情况。
2.基本要求:
- 编写三种显著性检测程序,并能够对给定图像进行检测。
- 熟悉各显著性检测方法的参数及其对检测结果的影响,并能分析不同参数设置下的检测效果。
- 对比不同图像和不同算法的检测效果,详细分析并撰写实验报告。
三、实验设备
实验设备主要有:计算机、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 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.基于最稳定区域的显著性检测
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 * 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()
实验原图:
实验结果:
六、实验总结
- 视觉评估
观察显著图是否能够有效地突出图像中的主要目标。例如,在包含人物和背景的图像中,显著图应该使人物区域比背景更亮(表示更显著)。比较基于频率域和空间域方法的显著图,看哪种方法更符合人类的视觉感知。
- 定量评估
可以使用一些指标来评估显著性检测的质量,如准确率 - 召回率曲线(Precision - Recall Curve)、F - measure 等。例如,通过将显著图二值化,与人工标注的显著区域进行比较,计算准确率(正确检测为显著的像素占检测为显著的像素总数的比例)和召回率(正确检测为显著的像素占实际显著像素总数的比例),进而绘制准确率 - 召回率曲线。