我最近一直在玩图像处理,想了解清晰度增强算法(unsharp mask algorithm)是如何工作的。我正在查看Gimp和它的实现源代码,但目前我仍然不清楚它到底是如何工作的。我需要在我的项目中实现它,但我希望真正理解我正在使用的算法。
我最近一直在玩图像处理,想了解清晰度增强算法(unsharp mask algorithm)是如何工作的。我正在查看Gimp和它的实现源代码,但目前我仍然不清楚它到底是如何工作的。我需要在我的项目中实现它,但我希望真正理解我正在使用的算法。
我之前也不太确定它是如何工作的,但我找到了几个非常好的页面来理解它。基本上像这样:
什么是图像锐化的相反效果?模糊的。我们知道如何使图像变模糊。复制原始图像并执行一些高斯模糊。这就是大多数USM对话框上的Radius滑块。
好吧,如果我们减去模糊度,我们应该会剩下高对比度部分!想想看:如果你模糊天空,它仍然看起来像天空。减去像素,你得到天空-天空= 0。如果你模糊可乐标志,你会得到一个模糊的可乐标志。将其减去,你就只剩下了边缘。所以执行差异运算。
那么是什么让事物看起来更清晰?对比度。再次复制原始图像并增加对比度。你增加对比度的量就是大多数USM对话框上的Amount或Intensity滑块。
最后将所有的东西放在一起。此时你有三件事:
算法如下:查看来自unsahrp mask的像素,并找出其亮度(亮度)。如果亮度为100%,则使用来自高对比度图像的值。如果它是0%,则对于该像素使用来自原始图像的值。如果它介于两者之间,则使用一些加权混合两个像素的值。可选地,仅当像素的值更改超过某个特定量时才更改该值(这是大多数USM对话框上的Threshold滑块)。
将所有内容组合在一起,就可以得到您的图像!
下面是一些伪代码:
color[][] usm(color[][] original, int radius, int amountPercent, int threshold) {
// copy original for our return value
color[][] retval = copy(original);
// create the blurred copy
color[][] blurred = gaussianBlur(original, radius);
// subtract blurred from original, pixel-by-pixel to make unsharp mask
color[][] unsharpMask = difference(original, blurred);
color[][] highContrast = increaseContrast(original, amountPercent);
// assuming row-major ordering
for(int row = 0; row < original.length; row++) {
for(int col = 0; col < original[row].length; col++) {
color origColor = original[row][col];
color contrastColor = highContrast[row][col];
color difference = contrastColor - origColor;
float percent = luminanceAsPercent(unsharpMask[row][col]);
color delta = difference * percent;
if(abs(delta) > threshold)
retval[row][col] += delta;
}
}
return retval;
}
注意:我不是图像专家,但这是我从找到的页面中学到的。请自己阅读并确保您同意我的发现,但实现上述应该足够简单,所以试试吧!
关键在于空间频率的思想。高斯滤波器只通过低空间频率,因此如果您执行以下操作:
2 *(原始图像)- (高斯滤波后的图像)
那么它在空间频率域中的效果是:
(所有频率的2倍)-(低频率)=(高频率的2倍)+(低频率的1倍)。
因此,在实际应用中,“去锐化掩蔽”会增强图像的高频组件---高斯滤波器大小的确切参数以及当图像相减时的权重决定了滤波器的确切属性。
“Unsharp”通常是通过检测边缘的卷积核实现的。将卷积操作的结果与原始图像相加,可以增加边缘对比度,从而产生更多“清晰度”的视觉效果。
具体使用的卷积核因人而异,也因应用而异。绝大部分都采用以下通用格式:
-1 -1 -1
g = -1 8 -1
-1 -1 -1
有些人不使用对角线,有时您会获得更高的权重,整个内核被缩放,有些人只是尝试不同的权重。最终它们都具有相同的效果,只是一个玩耍的问题,直到找到您喜欢的最终结果为止。
给定输入图像I
,输出定义为:
out = I + c(I * g)
,其中*
是2D卷积运算符,c
是一些比例常数,通常在0.5
以上但小于1
,以避免吹出任何比您需要的更多的通道。
blurred_image = blur(input_image)
output_image = input_image - blurred_image * weight
IMGblur = blur(IMG) // get all the low frequency pixels
temp = IMG - IMGblur // all the low frequency pixels will be 0
IMGsharp = IMG + k(temp) // k is in [0.3,0.7]
// in this final result , all low frequency pixels of IMGsharp is same as IMG,
// but all high frequency signals of IMGsharp is (1+k)times higher than IMG
希望这能帮到您!
来自多伦多大学的Soon Chee Loong