我正在抑制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");
目的是识别和隔离图像中先前检测到的区域中存在于高频中的元素。然而,在一些情况下,文本非常薄且微弱(低对比度)。在这些情况下,IDCT生成的图像非常暗,甚至高频部分也变得太微弱,无法进一步分析工作。
有什么操作可以让我们在背景抑制后从IDCT获得更清晰的图像? CvEqualizeHist()
会产生太多噪音。
修改
belisarius问道,Whole picture上传了这里。低频抑制不是在整个图像上进行,而是在设置为文本/低频部分周围最小边界矩形的小ROI上进行。
答案 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
(*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]
继续......
修改
在评论中回答问题:
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()
的结果重写它们会有很大帮助,特别是如果你设法找到正确的平滑级别,只能得到有用的边缘。