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

Работать с, если вы можете внести свой вклад, было бы замечательно.

Другие вопросы по тегам