显著性检测- HC模型

这篇博客介绍了Global Contrast based Salient Region detection论文,并详细阐述了使用OpenCV实现的HC显著性检测模型,包括模型头文件、实现代码和测试效果展示。
摘要由CSDN通过智能技术生成

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 Model
    Mat 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 Color
    m_compressColorImg = Mat::zeros(rgbImg.size(), CV_8UC3);
    for(channelIter = 0; channelIter < 3; ++channelIter)
    {
        for(rowIter = 0; rowIter < H; ++rowIter)
        {
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值