显著性检测- HC模型

article/2025/10/12 7:12:09

1. 模型论文:

Global Contrast based Salient Region detection. Ming-Ming Cheng, Niloy J. Mitra, Xiaolei Huang, Philip H. S. Torr, Shi-Min Hu. IEEE TPAMI, 2015

2. 实现代码

(1) 显著性检测公共头文件

#ifndef SALIENTCOMMON_H
#define SALIENTCOMMON_H
// std lib
#include <iostream>
#include <string>
#include <vector>
#include <fstream>// opencv lib
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>using namespace std;
using namespace cv;#endif // SALIENTCOMMON_H

(2) HC模型.h文件

#ifndef SALIENTHC_H
#define SALIENTHC_H
#include "salientcommon.h"
// Author: HSW 
// Date: 2017-11-19
// Global Contrast based Salient Region detection. Ming-Ming Cheng, Niloy J. Mitra, Xiaolei Huang, Philip H. S. Torr, Shi-Min Hu. IEEE TPAMI, 2015
//
// Histgram Contrast Model
class salientHC
{
public:salientHC(Mat& orgImg);~salientHC();void m_getSalientHC(Mat& result);
private:void m_getCompressColor(Mat& rgbImg);void m_getDistancTable();void m_getHistgram(Mat& labImg);
private:Mat m_OrgImg;Mat m_compressColorImg;Mat m_resultImg;unsigned int m_distTable[256];unsigned int m_histTable[3][256];
};#endif // SALIENTHC_H
(3) cpp文件
#include "salienthc.h"
#include "salientcommon.h"salientHC::salientHC(Mat& orgImg)
{orgImg.copyTo(m_OrgImg);memset(m_distTable, 0, sizeof(m_distTable));memset(m_histTable, 0, sizeof(m_histTable));
}salientHC::~salientHC()
{;
}void salientHC::m_getCompressColor(Mat &rgbImg)
{// step 1: Train GMM ModelMat samples[3] = {Mat::zeros(Size(1, rgbImg.rows * rgbImg.cols), CV_32FC1), Mat::zeros(Size(1, rgbImg.rows * rgbImg.cols), CV_32FC1), Mat::zeros(Size(1, rgbImg.rows * rgbImg.cols), CV_32FC1)};unsigned int rowIter, colIter, channelIter, meansIter;int H = rgbImg.rows;int W = rgbImg.cols;for(channelIter = 0; channelIter < 3; ++channelIter){Mat sample = samples[channelIter];for(rowIter = 0; rowIter < H; ++rowIter){for(colIter = 0; colIter < W; ++colIter){sample.at<float>(rowIter*W + colIter, 1) = (float)rgbImg.at<Vec3b>(rowIter, colIter)[channelIter];}}}Mat gmmMeans[3];for(channelIter = 0; channelIter < 3; ++channelIter){Ptr<ml::EM> em_model = ml::EM::create();em_model->setClustersNumber(12);em_model->setCovarianceMatrixType(ml::EM::COV_MAT_SPHERICAL);em_model->setTermCriteria(TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 100, 0.1));em_model->trainEM(samples[channelIter]);gmmMeans[channelIter] = em_model->getMeans();}// step 2: compress Colorm_compressColorImg = Mat::zeros(rgbImg.size(), CV_8UC3);for(channelIter = 0; channelIter < 3; ++channelIter){for(rowIter = 0; rowIter < H; ++rowIter){for(colIter = 0; colIter < W; ++colIter){unsigned int singleChannelVal = rgbImg.at<Vec3b>(rowIter, colIter)[channelIter];float minDistMean = 0;float minDist = 9999999;for(meansIter = 0; meansIter < 12; ++meansIter){if(abs(singleChannelVal - gmmMeans[channelIter].at<double>(meansIter, 1)) < minDist){minDist = abs(singleChannelVal - gmmMeans[channelIter].at<double>(meansIter, 1));minDistMean = gmmMeans[channelIter].at<double>(meansIter, 1);}}unsigned int means = cvRound(minDistMean);m_compressColorImg.at<Vec3b>(rowIter, colIter)[channelIter] = means;}}}
}void salientHC::m_getDistancTable()
{int iter;for(iter = 0; iter < 256; ++iter){m_distTable[iter] = iter;}
}void salientHC::m_getHistgram(Mat &labImg)
{int rowIter, colIter, channelIter;int H = labImg.rows;int W = labImg.cols;for(rowIter = 0; rowIter < H; ++rowIter){for(colIter = 0; colIter < W; ++colIter){for(channelIter = 0; channelIter < 3; ++channelIter){int labVal = labImg.at<Vec3b>(rowIter, colIter)[channelIter];m_histTable[channelIter][labVal] += 1;}}}}void salientHC::m_getSalientHC(Mat &result)
{Mat tmpRgbImg;if(m_OrgImg.channels() == 1){cvtColor(m_OrgImg, tmpRgbImg, CV_GRAY2RGB);}else if(m_OrgImg.channels() == 3){cvtColor(m_OrgImg, tmpRgbImg, CV_BGR2RGB);}// RGB Color Compress Colorsm_getCompressColor(tmpRgbImg);// RGB Color space To Lab Color SpaceMat tmpLabImg;cvtColor(m_compressColorImg, tmpLabImg, CV_RGB2Lab);tmpLabImg.convertTo(tmpLabImg, CV_8U);// Cal. Color Distance Tablem_getDistancTable();// Cal. Histgramm_getHistgram(tmpLabImg);// Cal. Salient Mapint rowIter, colIter, channelIter, histIter;int H = m_compressColorImg.rows;int W = m_compressColorImg.cols;// Cal. Search Tabledouble salientTable[3][256] = {0};for(channelIter = 0; channelIter < 3; ++channelIter){for(histIter = 0; histIter < 256; ++histIter){if(m_histTable[channelIter][histIter]){int iter;for(iter =  0; iter < 256; ++iter){if(m_histTable[channelIter][iter]){int gap = abs(histIter - iter);salientTable[channelIter][histIter] = m_histTable[channelIter][iter] * m_distTable[gap];}}}}}Mat tmpSalientImg = Mat::zeros(Size(W,H), CV_32FC1);m_resultImg = Mat::zeros(Size(W,H), CV_32FC1);for(rowIter = 0; rowIter < H; ++rowIter){for(colIter = 0; colIter < W; ++colIter){for(channelIter = 0; channelIter < 3; ++channelIter){tmpSalientImg.at<float>(rowIter, colIter) += salientTable[channelIter][tmpLabImg.at<Vec3b>(rowIter, colIter)[channelIter]];}}}// fine salient mapGaussianBlur(tmpSalientImg, tmpSalientImg, Size(5,5), 5);double minVal = 0, maxVal = 0;minMaxLoc(tmpSalientImg, &minVal, &maxVal);double scale = 255./(maxVal - minVal);double shift = -minVal * scale;convertScaleAbs(tmpSalientImg, m_resultImg, scale, shift);m_resultImg.copyTo(result);
}

3. 测试代码:

#include "salientcommon.h"
#include "salientlc.h"
#include "salientitti.h"
#include "salientft.h"
#include "salientsr.h"
#include "salientpft.h"
#include "salienthc.h"#define TEST_LC              (1)
#define TEST_ITTI            (2)
#define TEST_FT              (3)
#define TEST_RS              (4)
#define TEST_PFT             (5)
#define TEST_HC              (6)
#define TEST_VIDEO           (100)#define TEST_MODEL           (6)int main()
{
#if TEST_MODEL == TEST_LCMat inputImg = imread("test7.jpg");if(inputImg.empty()){cout << "Read Image Failed " << endl;return -1;}imshow("Org-Img", inputImg);waitKey(20);salientLC salientLCObj(inputImg);Mat resultImg;salientLCObj.m_getSalientLC(resultImg);imshow("LC-Result", resultImg);waitKey(0);return 0;#elif TEST_MODEL == TEST_ITTIstring imageName = "test2.jpg";Mat resultImg;salientITTI salientITTIObj(imageName);salientITTIObj.m_getSalientITTI(resultImg);imshow("ITTI-Result", resultImg);waitKey(0);return 0;#elif TEST_MODEL == TEST_FTMat inputImg = imread("test7.jpg");if(inputImg.empty()){cout << "Read Image Failed " << endl;return -1;}imshow("Org-Img", inputImg);waitKey(20);salientFT salientFTObj(inputImg);Mat resultImg;salientFTObj.m_getSalientFT(resultImg);imshow("FT-Result", resultImg);waitKey(0);return 0;
#elif TEST_MODEL == TEST_RSMat inputImg = imread("test7.jpg");if(inputImg.empty()){cout << "Read Image Failed " << endl;return -1;}imshow("Org-Img", inputImg);waitKey(20);salientSR salientSRObj(inputImg);Mat resultImg;salientSRObj.m_getSalientSR(resultImg);imshow("RS-Result", resultImg);waitKey(0);return 0;
#elif TEST_MODEL == TEST_PFTMat inputImg = imread("test1.jpg");if(inputImg.empty()){cout << "Read Image Failed " << endl;return -1;}imshow("Org-Img", inputImg);waitKey(20);salientPFT salientPFTObj(inputImg);Mat resultImg;salientPFTObj.m_getSalientPFT(resultImg);imshow("PFT-Result", resultImg);waitKey(0);return 0;
#elif TEST_MODEL == TEST_HCMat inputImg = imread("test6.jpg");if(inputImg.empty()){cout << "Read Image Failed " << endl;return -1;}imshow("Org-Img", inputImg);waitKey(20);salientHC salientHCObj(inputImg);Mat resultImg;salientHCObj.m_getSalientHC(resultImg);imshow("HC-Result", resultImg);waitKey(0);return 0;
#elif TEST_MODEL == TEST_VIDEOstring fileName = "testVideo4.yuv";ifstream ifstr(fileName, ios_base::in | ios_base::binary);if(!ifstr.is_open()){cout << "Open file Failed " << endl;return -1;}Mat yuvFrame;int frameHeight = 144;int frameWidth = 176;int yuvFrameSize = frameHeight * frameWidth * 3 / 2;yuvFrame.create(Size(frameWidth, frameHeight * 3 / 2), CV_8UC1);char* buffer = new char[yuvFrameSize];Mat rgbFrame;rgbFrame.create(Size(frameWidth, frameHeight), CV_8UC3);Mat meanLogMag;int count = 0;int isMeansFlag = 0;while(1){memset(buffer, 0, yuvFrameSize);ifstr.read(buffer, yuvFrameSize * sizeof(unsigned char));if(ifstr.gcount() != yuvFrameSize){cout << "Read file End or Failed " << endl;ifstr.close();delete []buffer;return -1;}memcpy(yuvFrame.data, buffer, yuvFrameSize);cvtColor(yuvFrame, rgbFrame, CV_YUV2BGR_I420);if(count == 0){Mat grayFrame;cvtColor(rgbFrame, grayFrame, CV_BGR2GRAY);equalizeHist(grayFrame,grayFrame);Mat tmpPaddingImg;Mat tmpOrgImg;grayFrame.copyTo(tmpOrgImg);// Get FFT2 Factorysint M = getOptimalDFTSize(tmpOrgImg.rows);int N = getOptimalDFTSize(tmpOrgImg.cols);copyMakeBorder(tmpOrgImg, tmpPaddingImg, 0, M - tmpOrgImg.rows, 0, N - tmpOrgImg.cols, BORDER_CONSTANT, Scalar(0));if(meanLogMag.empty()){cout << "run here " << endl;meanLogMag = Mat::zeros(Size(N,M), CV_32FC1);}// FFT2 TranslateMat planes[2];tmpPaddingImg.convertTo(tmpPaddingImg, CV_32F);planes[0] = tmpPaddingImg;planes[1] = Mat::zeros(tmpPaddingImg.size(), CV_32F);Mat tmpComplexImg;merge(planes, 2,  tmpComplexImg);dft(tmpComplexImg, tmpComplexImg);split(tmpComplexImg, planes);// compute phaseMat tmpPhaseImg;phase(planes[0], planes[1], tmpPhaseImg);// compute log abs MagnitudeMat tmpMagImg;magnitude(planes[0], planes[1], tmpMagImg);// compute sin & cosionMat tmpSin, tmpCosion;cv::divide(planes[0], tmpMagImg, tmpCosion); // Re partcv::divide(planes[1], tmpMagImg, tmpSin);    // Im PartMat tmpLogMagImg;cv::log(tmpMagImg, tmpLogMagImg);cv::add(tmpLogMagImg, meanLogMag, meanLogMag);}else{if(isMeansFlag == 0){int rowIter, colIter;for(rowIter = 0; rowIter < meanLogMag.rows; ++rowIter){for(colIter = 0; colIter < meanLogMag.cols; ++colIter){meanLogMag.at<float>(rowIter, colIter) = meanLogMag.at<float>(rowIter, colIter) * 1.0 / count;}}GaussianBlur(meanLogMag, meanLogMag, Size(5,5), 3);isMeansFlag = 1;}Mat grayFrame;cvtColor(rgbFrame, grayFrame, CV_BGR2GRAY);equalizeHist(grayFrame,grayFrame);Mat tmpPaddingImg;Mat tmpOrgImg;grayFrame.copyTo(tmpOrgImg);// Get FFT2 Factorysint M = getOptimalDFTSize(tmpOrgImg.rows);int N = getOptimalDFTSize(tmpOrgImg.cols);copyMakeBorder(tmpOrgImg, tmpPaddingImg, 0, M - tmpOrgImg.rows, 0, N - tmpOrgImg.cols, BORDER_CONSTANT, Scalar(0));// FFT2 TranslateMat planes[2];tmpPaddingImg.convertTo(tmpPaddingImg, CV_32F);planes[0] = tmpPaddingImg;planes[1] = Mat::zeros(tmpPaddingImg.size(), CV_32F);Mat tmpComplexImg;merge(planes, 2,  tmpComplexImg);dft(tmpComplexImg, tmpComplexImg);split(tmpComplexImg, planes);// compute phaseMat tmpPhaseImg;phase(planes[0], planes[1], tmpPhaseImg);// compute log abs MagnitudeMat tmpMagImg;magnitude(planes[0], planes[1], tmpMagImg);// compute sin & cosionMat tmpSin, tmpCosion;cv::divide(planes[0], tmpMagImg, tmpCosion); // Re partcv::divide(planes[1], tmpMagImg, tmpSin);    // Im PartMat tmpLogMagImg;cv::log(tmpMagImg, tmpLogMagImg);// Spectral ResidualMat tmpResidualImg;cv::subtract(tmpLogMagImg, meanLogMag, tmpResidualImg);// IFFT2 Translatecv::exp(tmpResidualImg, tmpResidualImg);Mat tmpRel, tmpIm;cv::multiply(tmpCosion, tmpResidualImg, tmpRel);cv::multiply(tmpSin, tmpResidualImg, tmpIm);planes[0] = tmpRel;planes[1] = tmpIm;merge(planes, 2, tmpComplexImg);Mat tmpSalientImg;dft(tmpComplexImg, tmpSalientImg, DFT_INVERSE);// Normalizesplit(tmpSalientImg, planes);magnitude(planes[0], planes[1], tmpMagImg);GaussianBlur(tmpMagImg, tmpMagImg, Size(7,7), 3);double minVal = 0, maxVal = 0;minMaxLoc(tmpMagImg, &minVal, &maxVal);double scale = 255./(maxVal - minVal);double shift = -minVal * scale;Mat salient;convertScaleAbs(tmpMagImg(Rect(0,0,tmpOrgImg.cols, tmpOrgImg.rows)), salient, scale, shift);imshow("Detect-map", salient);waitKey(25);}imshow("Org-map", rgbFrame);waitKey(25);count++;}
#elsecout << "Not Support !" << endl;return 0;
#endif
}

4. 测试效果



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

相关文章

基于深度学习的显著性检测用于遥感影像地物提取(U-2-NET)

GitHub地址链接&#xff1a;https://github.com/NathanUA/U-2-Net 这个显著性检测很好用&#xff0c;强烈推荐&#xff0c;建议二分类的任务都来试试&#xff0c;尤其对边缘细节要求比较高的任务。 下面的效果要不是第一张图预测有瑕疵&#xff0c;我都以为预测代码是把标签复制…

图像显著性目标检测

一、概述 1、定义 图像显著性检测(Saliency Detection,SD)&#xff0c; 指通过智能算法模拟人的视觉系统特点&#xff0c;预测人类的视觉凝视点和眼动&#xff0c;提取图像中的显著区域(即人类感兴趣的区域)&#xff0c;可以广泛用于目标识别、图像编辑以及图像检索等领域&am…

显著性检测——LC模型

1. 参考文献&#xff1a; Visual Attention Detection in Video Sequences Using Spatiotemporal Cues。 Yun Zhai and Mubarak Shah. Page 4-5 2. 模型实现 2.1 显著性检测公共头文件 #ifndef SALIENTCOMMON_H #define SALIENTCOMMON_H // std lib #include <iostream…

GrabCut算法、物体显著性检测

图割GraphCus算法。利用颜色、纹理等信息对GraphCut进行改进&#xff0c;形成效果更好的GrabCut算法。 对图像的目标物体和背景建立一个K维的全协方差高斯混合模型。 其中&#xff0c;单高斯模型的概率密度函数用公式表示为&#xff1a; 高斯混合模型可表示为n个单高斯模型的概…

显著性检测的评价指标代码

包括MAE、Pre、Rec、F-measure、Auc、CC、Nss MAE&#xff1a; 平均绝对误差MAE&#xff08;mean absolute error&#xff09;&#xff0c;范围[0,∞)&#xff0c;当预测值与真实值完全吻合时等于0&#xff0c;即完美模型&#xff1b;误差越大&#xff0c;该值越大。 Pre、Re…

2023年显著性检测论文及代码汇总

AAAI LeNo: Adversarial Robust Salient Object Detection Networks with Learnable Noise Abstacrt&#xff1a;目前很少有SOD模型对人类视觉注意力难以察觉的对抗性攻击具有鲁棒性。先前的鲁棒显著性ROSA对预分割的超像素进行重组&#xff0c;通过密集连接的条件随机场CRF对…

【显著性检测】Matlab实现Itti显著性检测

目录 理论知识代码步骤读取图像得到金字塔图像提取底层特征计算显著图显著图综合 运行结果展示 理论知识 显著性检测 是指按照人类的视觉注意机制&#xff0c;判断出图像中的显著区域&#xff0c;并为该区域分配较高的显著值&#xff0c;通常认为显著区域更有可能包含目标&…

Opencv之谱残差显著性检测

学习资料参考&#xff1a; 张平.《OpenCV算法精解&#xff1a;基于Python与C》.[Z].北京.电子工业出版社.2017. 前言 在使用谱残差进行显著性检测之前&#xff0c;我们需要理解两个概念&#xff0c;分别是幅度谱和相位谱。 幅度谱和相位谱是将图片进行傅里叶正向变换之后得到的…

显著性检测——GR模型

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

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

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

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

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

显著性检测后处理

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

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

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

显著性检测—学习笔记

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

显著性检测

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

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

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

https协议的接口测试

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

接口测试HTTP请求

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

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

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

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

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