一个非锐化掩蔽器是如何工作的?

13

我最近一直在玩图像处理,想了解清晰度增强算法(unsharp mask algorithm)是如何工作的。我正在查看Gimp和它的实现源代码,但目前我仍然不清楚它到底是如何工作的。我需要在我的项目中实现它,但我希望真正理解我正在使用的算法。


有人成功复制了 Photoshop 的反锐化掩模吗? - Royi
5个回答

34

我之前也不太确定它是如何工作的,但我找到了几个非常好的页面来理解它。基本上像这样:

  1. 什么是图像锐化的相反效果?模糊的。我们知道如何使图像变模糊。复制原始图像并执行一些高斯模糊。这就是大多数USM对话框上的Radius滑块。

  2. 好吧,如果我们减去模糊度,我们应该会剩下高对比度部分!想想看:如果你模糊天空,它仍然看起来像天空。减去像素,你得到天空-天空= 0。如果你模糊可乐标志,你会得到一个模糊的可乐标志。将其减去,你就只剩下了边缘。所以执行差异运算。

  3. 那么是什么让事物看起来更清晰?对比度。再次复制原始图像并增加对比度。你增加对比度的量就是大多数USM对话框上的AmountIntensity滑块。

  4. 最后将所有的东西放在一起。此时你有三件事:

    1. 原始图像的高对比度版本
    2. 模糊图像与原始图像之间的差异(此图层大多为黑色)。此图层是unsharp mask
    3. 原始图像

    算法如下:查看来自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;
}

注意:我不是图像专家,但这是我从找到的页面中学到的。请自己阅读并确保您同意我的发现,但实现上述应该足够简单,所以试试吧!

参考资料


当然,非图形专家(比如我)会想到长而命令式的方法来完成这个任务。事实证明,也许一种类似于反高斯模糊卷积的方法可以解决问题(http://photo.net/bboard/q-and-a-fetch-msg.tcl?msg_id=000Qi5),尽管我不确定他们的卷积矩阵是否与我的描述相同(我的更接近维基百科上描述的电影过程)。另请参见:http://photo.net/bboard/q-and-a-fetch-msg?msg_id=001Mod - jasonmp85
请看这里:https://dev59.com/PmrXa4cB1Zd3GeqPA6Du#23322820 - Royi

10

关键在于空间频率的思想。高斯滤波器只通过空间频率,因此如果您执行以下操作:

2 *(原始图像)- (高斯滤波后的图像)

那么它在空间频率域中的效果是:

(所有频率的2倍)-(低频率)=(高频率的2倍)+(低频率的1倍)。

因此,在实际应用中,“去锐化掩蔽”会增强图像的高频组件---高斯滤波器大小的确切参数以及当图像相减时的权重决定了滤波器的确切属性。


1
看起来你对图像处理很有兴趣 - 你能帮助我们打开这个专门的小组吗:area51.stackexchange.com/proposals/66531/computer-vision/72084 只需投票给少于10个赞的问题即可。谢谢。 - Royi

5

“Unsharp”通常是通过检测边缘的卷积核实现的。将卷积操作的结果与原始图像相加,可以增加边缘对比度,从而产生更多“清晰度”的视觉效果。

具体使用的卷积核因人而异,也因应用而异。绝大部分都采用以下通用格式:

    -1 -1 -1
g = -1  8 -1
    -1 -1 -1

有些人不使用对角线,有时您会获得更高的权重,整个内核被缩放,有些人只是尝试不同的权重。最终它们都具有相同的效果,只是一个玩耍的问题,直到找到您喜欢的最终结果为止。

给定输入图像I,输出定义为: out = I + c(I * g),其中*是2D卷积运算符,c是一些比例常数,通常在0.5以上但小于1,以避免吹出任何比您需要的更多的通道。


4
Unsharp Mask通过使用高斯模糊滤镜生成图像的模糊版本,然后从原始图像中减去它(应用一些加权值),即可实现。
blurred_image = blur(input_image)
output_image = input_image - blurred_image * weight

2
考虑下面的代码,它接受一个输入图像IMG。
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接