图像锐化算法sharpen

基本概念

图像锐化是使图像边缘更加清晰的一种图像处理方法。常用的做法是提取图像的高频分量,将其叠加到原图上。
图像高频分量的提取有两种做法:一种是用高通滤波器得到高频分量;另一种是用低通滤波器得到低频,然后用原图减去低频得到高频。
直接提取高频的方法有sobel算法、laplcian算子,sobel算子是图像的一阶导数,提取的是梯度信息,分水平和垂直两种,常常用来做边缘检测、方向判别,sobel算子在斜坡处不为0,因此会产生较粗的边缘。laplcian算子是图像的二阶导,在图像开始变化和结束变化的地方值不为0,渐变时结果为0,因此laplacian比sobel算子更适合做sharpen。
除了直接提取高频的方法外,我们也可以先提取低频,原图减去低频得到高频。这种方法称为非锐化掩模(unsharpen mask),我们常使用低通滤波器(高斯、双边)对图像进行滤波,这种方法滤波器很好控制(包括大小和强弱),从而可以控制高频分量的强弱。

钝化蒙版

先根据用户指定的钝化度对图像进行高斯模糊处理,再对高斯模糊处理结果与原图像进行钝化处理。 钝化度用来改变像素间的对比度强弱,钝化度,取值(0~100),钝化值越小,钝化的部分就越窄,仅仅会影响边缘像素; 钝化值越大,钝化的范围越宽,效果更明显。

// degree:钝化度,取值(0~100)
// 钝化度用来改变像素间的对比度强弱,钝化值越小,钝化的部分就越窄,仅仅会影响边缘像素
// 钝化值越大,钝化的范围越宽,效果更明显
Mat UnsharpMask(Mat src, int degree) {
    
    
	int row = src.rows;
	int col = src.cols;
	if (degree < 1) degree = 1;
	if (degree > 100) degree = 100;
	Mat dst(row, col, CV_8UC3);
	src.copyTo(src);
	int border = 1;
	for (int i = 0; i < degree; i++) {
    
    
		GaussianBlur(dst, dst, Size(3, 3), 1.0);
	}
	for (int i = 0; i < row; i++) {
    
    
		for (int j = 0; j < col; j++) {
    
    
			for (int k = 0; k < 3; k++) {
    
    
				int sum = 2 * src.at<Vec3b>(i, j)[k] - dst.at<Vec3b>(i, j)[k];
				if (sum > 255) sum = 255;
				else if (sum < 0) sum = 0;
				dst.at<Vec3b>(i, j)[k] = sum;
			}
		}
	}
	return dst;
}

参考资料

猜你喜欢

转载自blog.csdn.net/webzhuce/article/details/115281719