欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Opencv之Unsharp Mask(USM)锐化

程序员文章站 2022-05-30 08:36:02
...

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;
}

    效果图:

Opencv之Unsharp Mask(USM)锐化

 

3.参考资料

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