低频抑制图像后如何获得清晰的图像?

时间:2011-06-08 06:54:17

标签: image-processing opencv computer-vision

我正在抑制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()会产生太多噪音。

修改

belisarius问道,

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

3 个答案:

答案 0 :(得分:4)

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

代码在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

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 = DeleteSmallComponents@Dilation[m, 10]

enter image description here

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

enter image description here

继续......

修改

在评论中回答问题:

GradientFilter说明位于“更多信息”下:http://reference.wolfram.com/mathematica/ref/GradientFilter.html

MinFilter说明位于“更多信息”下:http://reference.wolfram.com/mathematica/ref/MinFilter.html

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

如果在频域过滤后边缘变得太暗,在过滤之前使用cvCanny()的结果重写它们会有很大帮助,特别是如果你设法找到正确的平滑级别,只能得到有用的边缘。