opencv实战项目二十六:获取图像的显著图

前言

在当代计算机视觉的研究与应用中,图像显著性检测扮演着至关重要的角色。它模拟人类视觉系统的注意力机制,旨在识别图像中最能吸引观察者注意力的区域。这种视觉关注点的识别过程通过生成所谓的“显著图”来实现,这是一种量化图像中每个像素或区域显著性水平的二维映射,本文将介绍如何通过opencv获取图像的显著图并辅以对应的代码案例。

一、定义

图像的显著图是一种模拟人类视觉注意力的映射,它揭示了图像中哪些部分最引人注目。显著图通过计算每个像素或区域的显著性来生成,这种显著性基于颜色、亮度、纹理等视觉特征的差异。在显著图中,通常显著性高的区域会被突出显示,引导观察者快速定位图像中的重要信息。显著图在计算机视觉领域具有重要应用,如辅助图像分割、目标检测、视觉跟踪等任务,通过优先处理显著性高的区域,提高算法的效率和准确性。它还可以用于内容感知编码,优化图像和视频压缩,确保重要视觉内容的质量。总之,显著图为图像处理和理解提供了一个强有力的工具,有助于更好地模拟和利用人类的视觉注意力机制。

二、opencv使用:

在opencv中,有实现图像显著图提取的api,cv2.saliency.StaticSaliencyFineGrained(),其实现了一种基于频域的显著性检测方法。这种方法的核心思想是利用图像的频域信息来识别显著性区域。具体来说,它使用以下步骤来计算显著性图:

  1. 频域变换:首先,将图像从空间域转换到频域。这通常是通过快速傅里叶变换(FFT)来完成的。
  2. 频域分析:在频域中,图像被分解成不同的频率成分。StaticSaliencyFineGrained
    方法分析这些频率成分,特别是关注那些与显著性相关的频率。
  3. 显著性度量:该方法计算一个显著性度量,该度量基于图像中每个像素的频域表示。它通过比较像素的局部频率分布与其全局频率分布来评估每个像素的显著性。
  4. 显著性图生成:最后,基于上述显著性度量,生成一个显著性图,其中每个像素的值表示其显著性程度。

使用代码:

import cv2
import numpy as np

# 读取图像
image = cv2.imread(r'E:\1.png')

# 创建一个显著图计算对象
saliency = cv2.saliency.StaticSaliencyFineGrained().create()
# 计算显著图
(success, saliencyMap) = saliency.computeSaliency(image)
saliencyMap = (saliencyMap * 255).astype("uint8")

# 对显著图进行阈值处理以得到二值图
threshMap = cv2.threshold(saliencyMap.astype("uint8"), 0, 255,
                          cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

# 显示图像和显著图
cv2.imshow('Original Image', image)
cv2.imshow('Saliency Map', saliencyMap)
cv2.imshow('Thresholded Saliency Map', threshMap)

# 等待按键然后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

三、效果:

中间为显著图第三张为显著图二值化:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HanWenKing/article/details/142523422