2011-06-08 85 views
6

我在Dicrete余弦变换(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"); 

enter image description here enter image description here enter image description here

的目的是识别和隔离元件,其是存在于从图像中先前曾检测到的区域的高频率。然而,在几种情况下,文字非常薄弱(低对比度)。在这些情况下,IDCT提供的图像太暗以至于即使高频部分变得太弱以至于不能进一步分析工作。

有什么操作让我们可以在背景抑制后从IDCT获得更清晰的图像? CvEqualizeHist()给出了太多的噪音。

编辑:

Whole picture这里上传的贝利萨留问道。低频抑制不是在整个图像上进行,而是在文本/低频部分周围设置为最小边界矩形的小ROI上进行。

+1

那些是验证码? – 2011-06-08 07:04:47

+1

将DCT系数'(0,0)'设置为零不会消除任何噪音。它将只用一个常量(这是原始图像的平均灰度级)减去整个图像的灰度级。新图像将包含与原始图像一样多的高频噪声。 – rwong 2011-06-08 07:10:50

+2

在截图中的三个测试样本中,我认为一个简单的阈值应该能够将文本与背景分开。你可能想看看二进制阈值算法。 – rwong 2011-06-08 07:15:29

回答

4

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

该代码在Mathematica中。

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

(*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 

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

(*Finally apply the mask*) 
ImageMultiply[mask, [email protected]] 

enter image description here

待续...

编辑

回答问题中评论:

GradientFilter描述是在这里“更多的信息”:http://reference.wolfram.com/mathematica/ref/GradientFilter.html

MinFilter介绍下 “更多信息” 在这里:http://reference.wolfram.com/mathematica/ref/MinFilter.html

+0

看起来像这样。还有几个问题:Gradient Filter与OpenCV中的形态学渐变函数相同吗?其次,什么是MinFilter(对不起,这些东西可能会略微区别OpenCV等价物)。 – AruniRC 2011-06-13 05:29:21

+0

@AruniRC对不起,没有OpenCV在这里,但我更新了与使用的操作符的描述文章。 – 2011-06-13 12:02:09

+0

谢谢,现在的东西很清楚。目的不是要将整个图像中的高频部分隔离起来,而是要“清理”我在几个简单过滤器(如“笔画宽度”)后获得的区域。 – AruniRC 2011-06-13 17:46:45

3

通过在应用离散余弦变换之前或在IDCT之后应用简单的正幂律变换,可以提高对比度。这将使灰色的阴影分开。试试这个:

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

这看起来很有希望。一些更好的结果,但它可以工作。 – AruniRC 2011-06-09 06:25:50

+0

指数修补匠。或者在逆DCT之后尝试放置cvPow。 – susmits 2011-06-09 07:31:04

+0

在反DCT之后放置它并没有太大的区别。我认为这些价值如此之低,以至于即便是权力也没有把他们分开。 – AruniRC 2011-06-10 00:52:32

3

如果一个简单的阈值(+也许有些形态开)是不够的,我会建议使用扩散过滤器尝试:它平滑无边缘区域的噪点,但保留的边缘非常好。之后,分割应该变得更容易。

如果在频域过滤后边缘变得太暗,在过滤之前用cvCanny()的结果覆盖它们可能会有很大帮助,特别是如果您设法找到合适的平滑级别,则只能获得有用的边缘。