2014-11-07 134 views
0

我使用下面的函数来过滤图像。基本上它将DCT的系数设置为0,除了左上角的8x8元素,这意味着它滤除所有高频部分并仅离开低频部分。Matlab中的DCT滤波器图像

function I_out = em_DCT_filter(I_in,N) 

I_trim = double(I_in)-128; 

MYDCT=dctmtx(N); 
dct = @(block_struct)MYDCT*block_struct.data*MYDCT'; 
B=blockproc(I_trim,[N,N],dct); 

mask = zeros(N,N); 
mask(1:N/4,1:N/4)= 1; 

AnselmMask = @(block_struct)block_struct.data.*mask; 
BMask=blockproc(B,[N N],AnselmMask); 

InverseDct = @(block_struct)MYDCT'*block_struct.data*MYDCT; 
BReversedl = blockproc(BMask,[N N],InverseDct); 

I_out= uint8(BReversedl+128); 

处理后,图像看起来是这样的: before filterafter filter 我需要的功能,消除了图像中的细节(在毛衣例如图案,裤子上的阴影),这似乎工作的罚款。但是,该功能也会使图像非常模糊。我如何删除细节,并保持区域结构清晰?例如,毛衣/裤子区域将比以前更均匀的着色区域。

+0

你必须使用DCT吗?为什么不能用空间滤波来模糊图像? – rayryeng 2014-11-07 07:13:37

回答

1

你基本上应用了“局部低通滤波器”。
难怪“模糊”看起来就是结果,你在高频率中删除了我们通常认为是细节和“清晰度”的数据。

你真的应该做的是去除高频细节,但保持大的边缘。
一个好的方法是使用像各向异性扩散。
通过使用优化的参数,您将能够实现您所追求的外观。通常这些方法被称为图像抽象。

下面是先进的各向异性扩散有很大的开放源代码:

https://github.com/RoyiAvital/Fast-Anisotropic-Curvature-Preserving-Smoothing

工作着,如果你能做出贡献,这将是惊人的。