Opencv之Unsharp Mask(USM)锐化

1.介绍

    USM技术是通过增强图像的高频部分的内容来提高视觉效果,用具体的公式表达即为:y(n,m)= x(n,m)+ λz(n,m) ,其中, x(n,m)为输入图像,y(n,m)为输出图像,而z(n,m)为校正信号,一般是通过对x进行高通滤波获取。λ是用于控制增强效果的的一个缩放因子。在传统的USM算法中,z(n,m)一般可以通过拉普拉斯锐化,但传统的USM算法一般效果不好。

    本文主要是介绍Photoshop的自适应USM锐化,其有三个控制参数:半径、数量、阈值。

    1)高斯模糊是低通滤波,原始图片 - 低通滤波之后的图片 = 高通结果

    2)自适应表现:如果原值和低通的差异的绝对值大于指定的阈值,才对该点进行锐化

2.代码

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
#include <math.h>

using namespace cv;
using namespace std;

void sharp(const Mat& src, Mat& dst, const int& Radius, const int& Threshold, const int& Amount) {
	int height = src.rows;
	int width = src.cols;
	GaussianBlur(src, dst, cv::Size(Radius, Radius), 2, 2);

	for (int h = 0; h < height; ++h) {
		for (int w = 0; w < width; ++w) {
			int bValue = src.at<Vec3b>(h, w)[0] - dst.at<Vec3b>(h, w)[0];
			int gValue = src.at<Vec3b>(h, w)[1] - dst.at<Vec3b>(h, w)[1];
			int rValue = src.at<Vec3b>(h, w)[2] - dst.at<Vec3b>(h, w)[2];
			if (abs(bValue) > Threshold) {
				bValue = src.at<Vec3b>(h, w)[0] + Amount * bValue / 100;
				if (bValue > 255)
					bValue = 255;
				else if (bValue < 0)
					bValue = 0;
				dst.at<Vec3b>(h, w)[0] = bValue;
			}
			if (abs(gValue) > Threshold) {
				gValue = src.at<Vec3b>(h, w)[1] + Amount * gValue / 100;
				if (gValue > 255)
					gValue = 255;
				else if (gValue < 0)
					gValue = 0;
				dst.at<Vec3b>(h, w)[1] = gValue;
			}
			if (abs(rValue) > Threshold) {
				rValue = src.at<Vec3b>(h, w)[2] + Amount * rValue / 100;
				if (rValue > 255)
					rValue = 255;
				else if (rValue < 0)
					rValue = 0;
				dst.at<Vec3b>(h, w)[2] = rValue;
			}
		}
	}
}

int main() {
	Mat src = imread("Lena.jpg");
	Mat dst = Mat(src.rows, src.cols, src.type());
	sharp(src, dst, 201, 0, 50);
	imshow("src", src);
	imshow("dst", dst);
	waitKey(0);
	return 0;
}

    效果图:

 

3.参考资料

    https://www.cnblogs.com/Imageshop/archive/2013/05/19/3086388.html

发布了138 篇原创文章 · 获赞 141 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/u013289254/article/details/102594043