图像增强:多尺度的图像细节提升(multi-scale detail boosting)实现方法


图像增强:多尺度的图像细节提升(multi-scale detail boosting)实现方法

       看到一篇博客介绍基于多尺度的图像的细节提升算法,其参考论文《Dark image enhancement based onpairwise target contrast and multi-scale detail boosting》,下图是该论文的核心算法过程。然后自己在Matlab和OpenCV实现了该算法,最终实现的效果还是不错的,可以增强图像的细节部分。
       论文的核心算法过程:




  论文的核心思想类似于Retinex,使用了三个尺度的高斯模糊,再和原图做减法,获得不同程度的细节信息,然后通过一定的组合方式把这些细节信息融合到原图中,从而得到加强原图信息的能力:请参考这一篇博客介绍:http://www.cnblogs.com/Imageshop/p/7895008.html,该博客给出了SSE的实现过程。
     算法实现很容易,下面,我给出本人的OpenCV和Matlab实现方法:
     OpenCV实现方法:
#include     
#include     
#include     
using namespace std;
using namespace cv;

cv::Mat multiScaleSharpen(cv::Mat Src, int Radius)
{
	int rows = Src.rows;
	int cols = Src.cols;
	int cha = Src.channels();
	cv::Mat B1, B2, B3;
	GaussianBlur(Src, B1, Size(Radius, Radius), 1.0, 1.0);//高斯模糊
	GaussianBlur(Src, B2, Size(Radius*2-1, Radius*2-1), 2.0, 2.0);
	GaussianBlur(Src, B3, Size(Radius*4-1, Radius*4-1), 4.0, 4.0);

	double w1 = 0.5;
	double w2 = 0.5;
	double w3 = 0.25;

	cv::Mat dest = cv::Mat::zeros(Src.size(), Src.type());
	for (size_t i = 0; i < rows; i++)
	{
		uchar* src_ptr = Src.ptr(i);
		uchar* dest_ptr = dest.ptr(i);
		uchar* B1_ptr = B1.ptr(i);
		uchar* B2_ptr = B2.ptr(i);
		uchar* B3_ptr = B3.ptr(i);
		for (size_t j = 0; j < cols; j++)
		{
			for (size_t c = 0; c < cha; c++)
			{
				int  D1 = src_ptr[3*j+c] - B1_ptr[3 * j + c];
				int  D2 = B1_ptr[3 * j + c] - B2_ptr[3 * j + c];
				int  D3 = B2_ptr[3 * j + c] - B3_ptr[3 * j + c];
				int  sign = (D1 > 0) ? 1 : -1;
				dest_ptr[3 * j + c] = saturate_cast((1 - w1*sign)*D1 - w2*D2 + w3*D3 + src_ptr[3 * j + c]);
			}
		}
	}
	return dest;
}

int main(int argc)
{
	Mat src = imread("image\\test.jpg");
	cv::imshow("src", src);
	cvWaitKey(100);

	cv::Mat dest=multiScaleSharpen(src,5);
	cv::imshow("dest", dest);

	cvWaitKey(0);
	return 0;
}

     Matlab实现方法:

function [ dest ] = multiScaleSharpen( src, Radius)
%%
sigma1 = 1.0;
sigma2 = 2.0;
sigma3 = 4.0;
H1 = fspecial('gaussian', [Radius,Radius], sigma1);
H2 = fspecial('gaussian', [Radius*2-1,Radius*2-1], sigma2);
H3 = fspecial('gaussian', [Radius*4-1,Radius*4-1], sigma3);
B1= imfilter(src, H1, 'replicate');
B2= imfilter(src, H2, 'replicate');
B3= imfilter(src, H3, 'replicate');
% figure;imshow(B3), title('B3');

D1=src-B1;
D2=B1-B2;
D3=B2-B3;
%%
w1=0.5;
w2=0.5;
w3=0.25;
dest=(1-w1.*sign(D1)).*D1+w2*D2+w3*D3+src;
% figure;imshow(dest), title('dest');
end

     Matlab调用方法:

src=imread('image\test.jpg');
figure;imshow(src), title('原图');
Radius=5;
[ dest ] = multiScaleSharpen( src, Radius);
figure;imshow(dest), title('dest');
效果图: