今天读了何凯明博士的《Single Image Haze Removal Using Dark Channel Prior》,用opencv实现了一遍。
其中,暗通道及T(x)采用腐蚀erode算法。
具体代码如下:
class hazeOutProcesser
{
public:
hazeOutProcesser(const Mat& srcImg)
{
this->srcImg = srcImg.clone();
}
hazeOutProcesser(){}
void getDarkChannel(const Mat& src, Mat& dst)
{
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
// erode(src, dst, element);
morphologyEx(src, dst, MORPH_ERODE, element);
// Mat temp = dst.clone();
// bilateralFilter(temp, dst, 25, 25*2, 25/2);
cvtColor(dst, dst, COLOR_BGR2GRAY);
}
std::pair<Mat, Mat> getAtmosphere(const Mat& sortedIndex,
const Mat& srcImg,
double rate = 0.001)
{
long n_pixel = srcImg.rows * srcImg.cols;
long n_search = n_pixel * rate;
Mat srcImgVector = srcImg.reshape(1, n_pixel).clone(); //1channel, 3rows(b, g, r)
//(n_pixel, 3)
cout << srcImgVector.rows << ", " << srcImgVector.cols << endl;
Mat accumulator = Mat::zeros(1, 3, CV_32FC1); //[(32f)0, (32f)0, (32f)0]
for(int i = 0; i < n_search; ++i) {
int index = sortedIndex.at<int>(i);
Mat t