【问题标题】:How to get clear image after low frequency suppression of image?图像低频抑制后如何获得清晰的图像?
【发布时间】:2011-09-10 15:19:18
【问题描述】:

我正在抑制离散余弦变换 (DCT) 域中图像中几个(不相等)块的低 DC 频率。之后进行逆 DCT 以取回仅保留高频部分的图像。

  cvConvertScale( img , img_32 ); //8bit to 32bit conversion 
cvMinMaxLoc( img_32, &Min, &Max ); 
cvScale( img_32 , img_32 , 1.0/Max ); //quantization for 32bit 

cvDCT( img_32 , img_dct , CV_DXT_FORWARD ); //DCT 
//display( img_dct, "DCT");

cvSet2D(img_dct, 0,  0, cvScalar(0)); //suppress constant background

//cvConvertScale( img_dct, img_dct, -1, 255 ); //invert colors

cvDCT( img_dct , img_out , CV_DXT_INVERSE ); //IDCT
//display(img_out, "IDCT");

目标是从图像中先前检测到的区域中识别和隔离高频元素。然而,在某些情况下,文本非常薄且微弱(低对比度)。在这些情况下,IDCT 产生的图像非常暗,以至于即使是高频部分也变得太微弱,无法进行进一步的分析。

有哪些操作可以让我们在背景抑制后从 IDCT 中获得更清晰的图像? CvEqualizeHist() 噪音太大。

编辑:

Whole picture 按照贝利撒留的要求上传到这里。低频抑制不是在整个图像上进行,而是在设置为围绕文本/低频部分的最小边界矩形的小 ROI 上进行。

【问题讨论】:

  • 将 DCT 系数 (0, 0) 设置为零不会消除任何噪音。它只会用一个常数减去整个图像的灰度级(这是原始图像的平均灰度级)。新图像将包含与原始图像一样多的高频噪声。
  • 在你截图的三个测试样本中,我认为一个简单的阈值应该能够将文本与背景分开。您可能想看看二进制阈值算法。
  • @Nick ODell:不,它们不是验证码。只是从非常混乱的低质量街景中检测到的印度文字。
  • @rwong - 主要目的不是最初消除噪音,而是首先尝试消除恒定的背景。我尝试了 Otsu 的阈值以及局部自适应,但它并没有真正奏效。你能给出任何你认为可能有用的具体参考吗?此外,如果您可以提供有助于解决高频噪声的代码/算法,同时抑制恒定背景(后来我已经这样做了),那就太好了。
  • 隔离高频的目标是什么?也许还有其他方法可以实现。

标签: image-processing opencv computer-vision


【解决方案1】:

根据您的示例图像,让我们从一种可能的策略开始隔离文本。

代码在 Mathematica 中。

(* Import your image*)
i1 = Import["http://i.stack.imgur.com/hYwx8.jpg"];
i = ImageData@i1;

(*Get the red channel*)
j = i[[All, All, 1]]
(*Perform the DCT*)
t = FourierDCT[j];
(*Define a high pass filter*)
truncate[data_, f_] :=
  Module[{i, j},
   {i, j} = Floor[Dimensions[data]/Sqrt[f]];
   PadRight[Take[data, -i, -j], Dimensions[data], 0.]
   ];

(*Apply the HP filter, and do the reverse DCT*)
k = Image[FourierDCT[truncate[t, 4], 3]] // ImageAdjust

(*Appy a Gradient Filter and a Dilation*)
l = Dilation[GradientFilter[k, 1] // ImageAdjust, 5]

(*Apply a MinFilter and Binarize*)
m = Binarize[MinFilter[l, 10], .045]

(*Perform a Dilation and delete small components to get a mask*)
mask = DeleteSmallComponents@Dilation[m, 10]

(*Finally apply the mask*)
ImageMultiply[mask, Image@i]

待续……

编辑

在 cmets 中回答问题:

GradientFilter 描述在此处的“更多信息”下:http://reference.wolfram.com/mathematica/ref/GradientFilter.html。

MinFilter 描述在此处的“更多信息”下:http://reference.wolfram.com/mathematica/ref/MinFilter.html

【讨论】:

  • 看起来就是这样。还有几个问题:Gradient Filter 和 OpenCV 中的 Morphology Gradient 函数一样吗?其次,什么是 MinFilter(抱歉,这些东西对我来说可能与 OpenCV 等价物略有不同)。
  • @AruniRC 抱歉,这里没有 OpenCV,但我用所用运算符的描述更新了帖子。
  • 谢谢,现在一切都清楚了。目的不是从整个图像中分离出高频部分,而是以某种方式“清理”我在一些简单的过滤器(如 Stroke Width 等)之后得到的区域。
【解决方案2】:

您可以通过在应用离散余弦变换之前或在 IDCT 之后应用简单的正幂律变换来提高对比度。这将把灰色的阴影拉得更远。试试这个:

cvPow(img, img_hicontrast, 1.75); // Adjust the exponent to your needs
cvConvertScale(img_highcontrast, img_32);

【讨论】:

  • 这看起来很有希望。对结果进行更多微调,但它可以工作。
  • 修正指数。或者尝试将 cvPow 放在逆 DCT 之后。
  • 将它放在逆 DCT 之后并没有太大的区别。我想这些值是如此之低,以至于即使电源也无法将它们分开太多。
【解决方案3】:

如果一个简单的阈值(+ 可能是一些形态开口)还不够,我建议尝试使用扩散滤波器:它可以平滑无边缘区域的噪声,但很好地保留边缘。之后,分割应该会变得更容易。

如果在您的频域过滤后边缘变得过于微弱,在过滤之前使用cvCanny() 的结果对其进行重绘会有很大帮助,特别是如果您设法找到正确的平滑级别,以便仅获得有用的边缘.

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多