DCT фильтр изображения в Matlab
Я использовал приведенную ниже функцию для фильтрации изображения. По сути, он устанавливает коэффициенты DCT равными 0, за исключением левого верхнего элемента 8x8, что означает, что он отфильтровывает всю высокочастотную часть и оставляет только низкочастотную часть.
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);
После обработки изображение выглядит так:Мне нужна функция удаления деталей на изображении (например, узоры на свитере, тени на штанах), которые, кажется, работают нормально. Однако функция также делает изображение очень размытым. Как я могу удалить детали, а также сохранить четкую структуру региона? Например, область свитер / брюки будет более однородной цветной областью, чем раньше.
1 ответ
Вы в основном применили "Local Low Pass Filter".
Неудивительно, что в результате получился "нечеткий" внешний вид: вы удалили данные с высокой частотой, которую мы обычно интерпретируем как детали и "резкость".
Что вы действительно должны сделать, это удалить высокочастотные детали, сохраняя при этом большие края в такте.
Хороший способ сделать это - использовать что-то вроде анизотропной диффузии.
Используя оптимизированные параметры, вы сможете добиться того, что вам нужно.
В целом эти методы называются абстракциями изображений.
Вот отличный открытый исходный код для расширенной анизотропной диффузии:
https://github.com/RoyiAvital/Fast-Anisotropic-Curvature-Preserving-Smoothing
Работать с, если вы можете внести свой вклад, было бы замечательно.