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;
}
效果图:
3.参考资料
https://www.cnblogs.com/Imageshop/archive/2013/05/19/3086388.html