显著性区域检测代码.docx_第1页
显著性区域检测代码.docx_第2页
显著性区域检测代码.docx_第3页
显著性区域检测代码.docx_第4页
显著性区域检测代码.docx_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/ Saliency.h#if !defined(_SALIENCY_H_INCLUDED_) #define _SALIENCY_H_INCLUDED_ #include #include using namespace std; class Saliency public: Saliency(); virtual Saliency(); public: void GetSaliencyMap( const vector& inputimg,/INPUT: ARGB buffer in row-major order const int& width, const int& height, vector& salmap,/OUTPUT: Floating point buffer in row-major order const bool& normalizeflag = true);/false if normalization is not needed private: void RGB2LAB( const vector& ubuff, vector& lvec, vector& avec, vector& bvec); void GaussianSmooth( const vector& inputImg, const int& width, const int& height, const vector& kernel, vector& smoothImg); /= / Normalize /= void Normalize( const vector& input, const int& width, const int& height, vector& output, const int& normrange = 255) double maxval(0); double minval(DBL_MAX); int i(0); for( int y = 0; y height; y+ ) for( int x = 0; x width; x+ ) if( maxval inputi ) minval = inputi; i+; double range = maxval-minval; if( 0 = range ) range = 1; int i(0); output.clear(); output.resize(width*height); for( int y = 0; y height; y+ ) for( int x = 0; x width; x+ ) outputi = (normrange*(inputi-minval)/range); i+; ; #endif / !defined(_SALIENCY_H_INCLUDED_) / Saliency.cpp: implementation of the Saliency class. / / /= / Copyright (c) 2009 Radhakrishna Achanta EPFL /= #include StdAfx.h #include Saliency.h #include / / Construction/Destruction / Saliency:Saliency() Saliency:Saliency() /= / RGB2LAB /= void Saliency:RGB2LAB( const vector& ubuff, vector& lvec, vector& avec, vector& bvec) int sz = int(ubuff.size(); lvec.resize(sz); avec.resize(sz); bvec.resize(sz); for( int j = 0; j 16) & 0xFF; int g = (ubuffj 8) & 0xFF; int b = (ubuffj ) & 0xFF; double xval = 0.412453 * r + 0.357580 * g + 0.180423 * b; double yval = 0.212671 * r + 0.715160 * g + 0.072169 * b; double zVal = 0.019334 * r + 0.119193 * g + 0.950227 * b; xval /= (255.0 * 0.950456); yval /= 255.0; zVal /= (255.0 * 1.088754); double fX, fY, fZ; double lval, aval, bval; if (yval 0.008856) fY = pow(yval, 1.0 / 3.0); lval = 116.0 * fY - 16.0; else fY = 7.787 * yval + 16.0 / 116.0; lval = 903.3 * yval; if (xval 0.008856) fX = pow(xval, 1.0 / 3.0); else fX = 7.787 * xval + 16.0 / 116.0; if (zVal 0.008856) fZ = pow(zVal, 1.0 / 3.0); else fZ = 7.787 * zVal + 16.0 / 116.0; aval = 500.0 * (fX - fY)+128.0; bval = 200.0 * (fY - fZ)+128.0; lvecj = lval; avecj = aval; bvecj = bval; /= / GaussianSmooth / / Blur an image with a separable binomial kernel passed in. /= void Saliency:GaussianSmooth( const vector& inputImg, const int& width, const int& height, const vector& kernel, vector& smoothImg) int center = int(kernel.size()/2; int sz = width*height; smoothImg.clear(); smoothImg.resize(sz); vector tempim(sz); int rows = height; int cols = width; /- / Blur in the x direction. /- int index(0); for( int r = 0; r rows; r+ ) for( int c = 0; c cols; c+ ) double kernelsum(0); double sum(0); for( int cc = (-center); cc = 0) & (c+cc) cols) sum += inputImgr*cols+(c+cc) * kernelcenter+cc; kernelsum += kernelcenter+cc; tempimindex = sum/kernelsum; index+; /- / Blur in the y direction. /- int index = 0; for( int r = 0; r rows; r+ ) for( int c = 0; c cols; c+ ) double kernelsum(0); double sum(0); for( int rr = (-center); rr = 0) & (r+rr) rows) sum += tempim(r+rr)*cols+c * kernelcenter+rr; kernelsum += kernelcenter+rr; smoothImgindex = sum/kernelsum; index+; /= / GetSaliencyMap / / Outputs a saliency map with a value assigned per pixel. The values are / normalized in the interval 0,255 if normflag is set true (default value). /= void Saliency:GetSaliencyMap( const vector& inputimg, const int& width, const int& height, vector& salmap, const bool& normflag) int sz = width*height; salmap.clear(); salmap.resize(sz); vector lvec(0), avec(0), bvec(0); RGB2LAB(inputimg, lvec, avec, bvec); /- / Obtain Lab average values /- double avgl(0), avga(0), avgb(0); for( int i = 0; i sz; i+ ) avgl += lveci; avga += aveci; avgb += bveci; avgl /= sz; avga /= sz; avgb /= sz; vector slvec(0), savec(0), sbvec(0); /- / The kernel can be 1 2 1 or 1 4 6 4 1 as needed. / The code below show usage of 1 2 1 kernel. /- vector kernel(0); kernel.push_back(1.0); kernel.push_back(2.0); kernel.push_back(1.0); GaussianSmooth(lvec, width, height, kernel, slvec); GaussianSmooth(avec, width, height, kernel, savec); GaussianSmooth(bvec, width, height, kernel, sbvec); for( int i = 0; i sz; i+ ) salmapi = (slveci-avgl)*(slveci-avgl) + (saveci-avga)*(saveci-avga) + (sbveci-avgb)*(sbveci-avgb); if( true = normflag ) vector normalized(0); Normalize(salmap, width, height, normalized); swap(salmap, normalized); / SaliencyMapDlg.cpp : 实现?文?件t/#include stdafx.h#include SaliencyMap.h#include SaliencyMapDlg.h#include afxdialogex.h#include opencv2opencv.hpp #include Saliency.h#ifdef _DEBUG#define new DEBUG_NEW#endif/ 用?于应|用?程序“关?于”菜?单项?的? CAboutDlg 对?话框class CAboutDlg : public CDialogExpublic:CAboutDlg();/ 对?话框数y据Yenum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持?/ 实现?protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialogEx(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()/ CSaliencyMapDlg 对?话框CSaliencyMapDlg:CSaliencyMapDlg(CWnd* pParent /*=NULL*/): CDialogEx(CSaliencyMapDlg:IDD, pParent)m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CSaliencyMapDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CSaliencyMapDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUT_OPEN, &CSaliencyMapDlg:OnBnClickedButOpen)END_MESSAGE_MAP()/ CSaliencyMapDlg 消?息处|理程序BOOL CSaliencyMapDlg:OnInitDialog()CDialogEx:OnInitDialog();/ 将?“关?于.”菜?单项?添加到?系统3菜?单中D。/ IDM_ABOUTBOX 必?须?在系统3命令?范?围内。ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ 设置?此?对?话框的?图?标。当应|用?程序主窗口不?是?对?话框时,?框架将?自?动/ 执行D此?操作SetIcon(m_hIcon, TRUE);/ 设置?大图?标SetIcon(m_hIcon, FALSE);/ 设置?小?图?标/ TODO: 在此?添加额?外a的?初?始?化代码?return TRUE; / 除y非?将?焦1点?设置?到?控?件t,?否?则返回? TRUEvoid CSaliencyMapDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialogEx:OnSysCommand(nID, lParam);/ 如?果?向对?话框添加最?小?化按钮,?则需要a下?面?的?代码?/ 来绘?制?该?图?标。对?于使1用?文?档/视图?模型的? MFC 应|用?程序,?/ 这a将?由框架自?动完成。void CSaliencyMapDlg:OnPaint()if (IsIconic()CPaintDC dc(this); / 用?于绘?制?的?设备?上?下?文?SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc(), 0);/ 使1图?标在工作区?矩?形?中D居中Dint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ 绘?制?图?标dc.DrawIcon(x, y, m_hIcon);elseCDialogEx:OnPaint();/当用?户拖?动最?小?化窗口时系统3调用?此?函数y取?得?光a标/显?示?。HCURSOR CSaliencyMapDlg:OnQueryDragIcon()return static_cast(m_hIcon);/*/src IPL_DEPTH_8U/dst IPL_DEPTH_64F*/傅里?叶?正y变?换?void fft2(IplImage *src, IplImage *dst) /实部?、虚部? IplImage *image_Re = 0, *image_Im = 0, *Fourier = 0; / int i, j; image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); /实部? /Imaginary part image_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); /虚部? /2 channels (image_Re, image_Im) Fourier = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 2); / Real part conversion from u8 to 64f (double) cvConvertScale(src, image_Re, 1, 0); / Imaginary part (zeros) cvZero(image_Im); / Join real and imaginary parts and stock them in Fourier image cvMerge(image_Re, image_Im, 0, 0, Fourier); / Application of the forward Fourier transform cvDFT(Fourier, dst, CV_DXT_FORWARD); cvReleaseImage(&image_Re); cvReleaseImage(&image_Im); cvReleaseImage(&Fourier);void CSaliencyMapDlg:OnBnClickedButOpen() IplImage *src, *ImageRe, *ImageIm, *Fourier, *Inverse, *LogAmplitude, *Sine, *Cosine; IplImage *Saliency, *Residual; IplImage *tmp1, *tmp2, *tmp3; double minNum = 0, maxNum = 0, scale, shift; int i, j, nRow, nCol; CString Path;CFileDialog dlg(true,_T(*.bmp),NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,_T(image file(*.bmp;*.jpg)|*.bmp;*.jpg|All Files(*.*)|*.*|),NULL);dlg.m_ofn.lpstrTitle=_T(open Image);if(dlg.DoModal()!=IDOK)return ;Path = dlg.GetPathName();Path.Replace(_T(/),_T(/);src = cvLoadImage(CT2CA) Path,0); Fourier = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 2); Inverse = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 2); ImageRe = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); ImageIm = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); LogAmplitude = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); Sine = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); Cosine = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); Residual = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); Saliency = cvCreateImage(cvGetSize(src), src-depth, src-nChannels); tmp1 = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); tmp2 = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); tmp3 = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); nRow = src-height; nCol = src-width; /归一?化一?下? scale = 1.0/255.0; cvConvertScale(src, tmp1, scale, 0); /傅里?叶?变?换?,?得?到?的?Fourier有D两?个?通道,?一?个?是?实部?,?一?个?是?虚部? fft2(tmp1, Fourier); /将?傅里?叶?谱的?实部?和虚部?存?放?到?对?应|的?图?像?中D去。 cvSplit(Fourier, ImageRe, ImageIm, 0, 0); /计?算?傅里?叶?振?幅谱,?实部?和虚部?平?方?和再开a方?,?得?到?振?幅谱存?到?tmp3中D cvPow( ImageRe, tmp1, 2.0); cvPow( ImageIm, tmp2, 2.0); cvAdd( tmp1, tmp2, tmp3); cvPow( tmp3, tmp3, 0.5 ); /计?算?正y弦谱和余弦谱和自?然?对?数y谱 cvLog( tmp3, LogAmplitude ); cvDiv(ImageIm, tmp3, Sine); cvDiv(ImageRe, tmp3, Cosine); /对?LogAmplitude做?3*3均值滤?波 cvSmooth(LogAmplitude, tmp3, CV_BLUR, 3, 3); /计?算?出?剩余普? cvSub(LogAmplitude, tmp3, Residual); /*/ /* 对?exp(Residual+i*Phase)作傅里?叶?反变?换? 由欧拉-公?式?:o exp(r+i*) = exp(r)*(cos() + i*sin() = exp(r)*cos() + i*exp(r)*sin() 其?中D是?相位?。 而?sin() = ImageIm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论