You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
6.0 KiB
C++
157 lines
6.0 KiB
C++
#include <cv.h>
|
|
#include <highgui.h>
|
|
#include <omp.h>
|
|
#include <emmintrin.h>
|
|
#include <opencv2/opencv.hpp>
|
|
#include <opencv2/core/core_c.h>
|
|
#include <opencv2/highgui/highgui_c.h>
|
|
#include <opencv2/imgproc/imgproc_c.h>
|
|
#include <iostream>
|
|
#include <opencv2/videoio.hpp>
|
|
|
|
#define CLIP(x) ((x)<(0)?0:((x)>(255)?(255):(x)))
|
|
#define CLIP_Z(x) ((x)<(0)?0:((x)>(1.0f)?(1.0f):(x)))
|
|
#define CLIP_TRS(x) ((x)<(0.1f)?0.1f:((x)>(1.0f)?(1.0f):(x)))
|
|
#define POINT Point2f
|
|
|
|
using namespace std;
|
|
using namespace cv;
|
|
|
|
class dehazing
|
|
{
|
|
public:
|
|
dehazing();
|
|
dehazing(int nW, int nH, bool bPrevFlag, bool bPosFlag);
|
|
dehazing(int nW, int nH, int nTBlockSize, bool bPrevFlag, bool bPosFlag, float fL1, float fL2, int nGBlock);
|
|
~dehazing(void);
|
|
|
|
void HazeRemoval(IplImage* imInput, IplImage* imOutput, int nFrame);
|
|
void ImageHazeRemoval(IplImage* imInput, IplImage* imOutput);
|
|
void LambdaSetting(float fLambdaLoss, float fLambdaTemp);
|
|
void DecisionUse(bool bChoice);
|
|
void TransBlockSize(int nBlockSize);
|
|
void FilterBlockSize(int nBlockSize);
|
|
void AirlightSerachRange(Point2f pointTopLeft, Point2f pointBottomRight);
|
|
void SetFilterStepSize(int nStepsize);
|
|
void PreviousFlag(bool bPrevFlag);
|
|
void FilterSigma(float nSigma);
|
|
bool Decision(IplImage* imInput, IplImage* imOutput, int nThreshold);
|
|
|
|
int* GetAirlight();
|
|
int* GetYImg();
|
|
float* GetTransmission();
|
|
|
|
private:
|
|
|
|
//320*240 size
|
|
float* m_pfSmallY; //Y image
|
|
float* m_pfSmallPk_p; //(Y image) - (mean of Y image)
|
|
float* m_pfSmallNormPk; //Normalize된 Y image
|
|
float* m_pfSmallInteg; //Gaussian weight가 적용된 transmission 결과
|
|
float* m_pfSmallDenom; //Gaussian weight가 저장된 행렬
|
|
|
|
int* m_pnSmallYImg; //입력 영상의 Y채널
|
|
|
|
int* m_pnSmallRImg; //입력 영상의 R채널
|
|
int* m_pnSmallGImg; //입력 영상의 G채널
|
|
int* m_pnSmallBImg; //입력 영상의 B채널
|
|
|
|
float* m_pfSmallTransP; //이전 프레임의 transmission 영상
|
|
float* m_pfSmallTrans; //초기 transmission 영상
|
|
float* m_pfSmallTransR; //정련된 transmission 영상
|
|
int* m_pnSmallYImgP; //이전 프레임의 Y채널
|
|
|
|
int* m_pnSmallRImgP; //이전 프레임의 Y채널
|
|
int* m_pnSmallGImgP; //이전 프레임의 Y채널
|
|
int* m_pnSmallBImgP; //이전 프레임의 Y채널
|
|
|
|
//Original size
|
|
float* m_pfY; //Y image
|
|
float* m_pfPk_p; //(Y image) - (mean of Y image)
|
|
float* m_pfNormPk; //Normalize된 Y image
|
|
float* m_pfInteg; //Gaussian weight가 적용된 transmission 결과
|
|
float* m_pfDenom; //Gaussian weight가 저장된 행렬
|
|
|
|
int* m_pnYImg; //입력 영상의 Y채널
|
|
int* m_pnYImgP; //입력 영상의 Y채널
|
|
|
|
int* m_pnRImg; //입력 영상의 Y채널
|
|
int* m_pnGImg; //입력 영상의 Y채널
|
|
int* m_pnBImg; //입력 영상의 Y채널
|
|
|
|
int* m_pnRImgP; //입력 영상의 Y채널
|
|
int* m_pnGImgP; //입력 영상의 Y채널
|
|
int* m_pnBImgP; //입력 영상의 Y채널
|
|
|
|
float* m_pfTransmission; //초기 transmission
|
|
float* m_pfTransmissionP; //초기 transmission
|
|
float* m_pfTransmissionR; //정련된 transmission 영상
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int m_nStepSize; //Guided filter의 step size;
|
|
float* m_pfGuidedLUT; //Guided filter 내의 gaussian weight를 위한 LUT
|
|
float m_fGSigma; //Guided filter 내의 gaussian weight에 대한 sigma
|
|
|
|
int m_anAirlight[3]; // atmospheric light value
|
|
uchar m_pucGammaLUT[256]; //감마 보정을 위한 LUT
|
|
float m_pfExpLUT[256]; //Transmission 계산시, 픽셀 차이에 대한 weight용 LUT
|
|
|
|
int m_nAirlight; //안개값(grey)
|
|
|
|
bool m_bPreviousFlag; //이전 프레임 이용 여부
|
|
float m_fLambda1; //Loss cost
|
|
float m_fLambda2; //Temporal cost
|
|
|
|
int m_nWid; //너비
|
|
int m_nHei; //높이
|
|
|
|
int m_nTBlockSize; // Block size for transmission estimation
|
|
int m_nGBlockSize; // Block size for guided filter
|
|
|
|
//Airlight search range
|
|
int m_nTopLeftX;
|
|
int m_nTopLeftY;
|
|
int m_nBottomRightX;
|
|
int m_nBottomRightY;
|
|
|
|
bool m_bPostFlag; // Flag for post processing(deblocking)
|
|
// function.cpp
|
|
|
|
void DownsampleImage();
|
|
void DownsampleImageColor();
|
|
void UpsampleTransmission();
|
|
void MakeExpLUT();
|
|
void GuideLUTMaker();
|
|
void GammaLUTMaker(float fParameter);
|
|
void IplImageToInt(IplImage* imInput);
|
|
void IplImageToIntColor(IplImage* imInput);
|
|
void IplImageToIntYUV(IplImage* imInput);
|
|
|
|
// dehazing.cpp
|
|
void AirlightEstimation(IplImage* imInput);
|
|
void RestoreImage(IplImage* imInput, IplImage* imOutput);
|
|
void PostProcessing(IplImage* imInput, IplImage* imOutput);
|
|
|
|
// TransmissionRefinement.cpp
|
|
void TransmissionEstimation(int *pnImageY, float *pfTransmission, int *pnImageYP, float *pfTransmissionP, int nFrame, int nWid, int nHei);
|
|
void TransmissionEstimationColor(int *pnImageR, int *pnImageG, int *pnImageB, float *pfTransmission,int *pnImageRP, int *pnImageGP, int *pnImageBP, float *pfTransmissionP,int nFrame, int nWid, int nHei);
|
|
|
|
float NFTrsEstimation(int *pnImageY, int nStartX, int nStartY, int nWid, int nHei);
|
|
float NFTrsEstimationP(int *pnImageY, int *pnImageYP, float *pfTransmissionP, int nStartX, int nStartY, int nWid, int nHei);
|
|
|
|
float NFTrsEstimationColor(int *pnImageR, int *pnImageG, int *pnImageB, int nStartX, int nStartY, int nWid, int nHei);
|
|
float NFTrsEstimationPColor(int *pnImageR, int *pnImageG, int *pnImageB, int *pnImageRP, int *pnImageGP, int *pnImageBP, float *pfTransmissionP, int nStartX, int nStartY, int nWid, int nHei);
|
|
|
|
// guided filter.cpp
|
|
void CalcAcoeff(float* pfSigma, float* pfCov, float* pfA1, float* pfA2, float* pfA3, int nIdx);
|
|
void BoxFilter(float* pfInArray, int nR, int nWid, int nHei, float*& fOutArray);
|
|
void BoxFilter(float* pfInArray1, float* pfInArray2, float* pfInArray3, int nR, int m_nWid, int m_nHei, float*& pfOutArray1, float*& pfOutArray2, float*& pfOutArray3);
|
|
|
|
void GuidedFilterY(int nW, int nH, float fEps);
|
|
void GuidedFilter(int nW, int nH, float fEps);
|
|
void GuidedFilterShiftableWindow(float fEps);
|
|
|
|
void FastGuidedFilterS();
|
|
void FastGuidedFilter();
|
|
|
|
}; |