El algoritmo de efecto de pintura al óleo tiene dos parámetros, uno es el radio de filtro r y el otro es el número de bit de cuantificación q.
Principio de algoritmo:
1. Primero divida 0-255 en intervalos q de acuerdo con el número de bits de cuantificación;
2. Luego obtenga los píxeles dentro del radio de acuerdo con el radio del filtro r;
3. Cuente la cantidad de veces que aparecen los píxeles en el intervalo y encuentre el intervalo con la mayor cantidad de veces;
4. El valor promedio de todos los píxeles en el intervalo de tiempos máximos de cálculo se puede asignar al píxel filtrado actual.
El código matlab es el siguiente:
limpiar todo; cierra todo; clc; r = 1 ; % 滤波 半径 q = 8 ; % 量化 位数 img = imread ( ' lena.jpg ' ); [m, n] = tamaño (img); imshow (img) imgn = ceros (m + 2 * r + 1 , n + 2 * r + 1 ); imgn (r + 1 : m + r, r + 1 : n + r) = img; imgn ( 1 : r, r + 1 : n + r) = flipud (img ( 1 : r, 1: n));% expande el borde superior imgn ( 1 : m + r, n + r + 1 : n + 2 * r + 1 ) = fliplr (imgn ( 1 : m + r, n: n + r));% expande el derecho Límite imgn (m + r + 1 : m + 2 * r + 1 , r + 1 : n + 2 * r + 1 ) = flipud (imgn (m: m + r, r + 1 : n + 2 * r + 1 ));% Expandir el borde inferior imgn ( 1 : m + 2 * r + 1 , 1 : r) = fliplr (imgn ( 1 : m + 2 * r +1 , r + 1 : 2 * r)); % 扩展 左边界 re = imgn; para i = r + 1 : m + r para j = r + 1 : n + r w = imgn (ir: i + r, jr: j + r); W = w (:); cubos = celda (q + 1 , 1 ); bucketind = ceros (q + 1 , 1 ); para k = 1 : longitud (W) ind = suelo (W (k) * q / 255) + 1 ; cubos {ind} = [cubos {ind}; W (k)]; bucketind (ind) = bucketind (ind) + 1 ; end [~, ind] = max (bucketind); % 得到 cubos 中 数 最多 的 序号 re (i, j) = media (cubos {ind}); figura final final ; imshow (re (r + 1 : m + r, r + 1 : n + r), []);
Imagen original:
El resultado: