我最近一直在进行图像处理,我想知道不清晰的蒙版算法是如何工作的。我正在查看Gimp的源代码及其实现,但是到目前为止,我仍然对它的实际工作方式还一无所知。我需要为我正在研究的项目实现它,但是我想真正了解我正在使用的算法。

最佳答案

我也不确定它是如何工作的,但是遇到了一些非常好的页面以了解它。基本上是这样的:

  • 锐化的图像有什么反面?一个模糊的。我们知道如何模糊图像。复制原始图像并执行一些高斯模糊处理。这是大多数USM对话框上的“半径”滑块。
  • 好吧,如果我们减去模糊度,我们应该留有高对比度的部分!想想看:如果模糊天空,它看起来仍然像天空。减去像素,您将获得天空-sky =0。如果使可乐徽标模糊,则会得到模糊的可乐徽标。减去它,剩下的就是边缘。
  • 也是如此
  • 那么,什么使事情看起来更清晰?对比。再次复制原始图像并增加对比度。在大多数USM对话框中,增加对比度的量是“数量”或“强度”滑块。
  • 最后将所有内容放在一起。此时,您有三件事:
  • 原始图像的高对比度版本
  • 模糊图像与原始图像的差异(此层大多数为黑色)。这层是不清晰的蒙版
  • 原始

  • 该算法如下:从不清晰的蒙版中查看一个像素,然后找出其亮度(亮度)。如果亮度为100%,请使用高对比度图像中的值作为该像素。如果为0%,则使用原始图像中的值作为该像素。如果介于两者之间,请使用一些权重将两个像素的值混合。 (可选)仅在像素值变化超过一定量时才更改像素值(这是大多数USM对话框中的“阈值”滑块)。
    放在一起,您就拥有了自己的形象!

    这是一些伪代码:
    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;
    }
    

    注意:我不是图形专家,但是这是我从发现的页面中学到的东西。自己阅读它们并确保您同意我的发现,但是实现以上操作应该足够简单,因此请尝试一下!

    引用
  • Sharpening Using an Unsharp Mask
  • Understanding the Digital Unsharp Mask
  • 3.7 Unsharp Mask
  • Unsharp masking
  • 10-08 09:27