Skip to content

Instantly share code, notes, and snippets.

@nelsondspy
Last active April 1, 2016 22:55
Show Gist options
  • Save nelsondspy/26b9ae4422d008bf7b74 to your computer and use it in GitHub Desktop.
Save nelsondspy/26b9ae4422d008bf7b74 to your computer and use it in GitHub Desktop.
pseudomediana para vecindad de 5 elementos en cruz. omisión de bordes.
function imgresult = pseudo_mediana( img )
%pseudo_mediana filtro pseudo mediana
%Autor Nelson Duranhona 20140911 YYYYMMDD
%Solo funciona para 5 elementos de vencidad
[ M ,N ] = size(img);
imgresult = uint8(zeros(M,N)); %imagen resultante
MSK.D_VERT = 1; % cant. de elem a tomar horizontalmente como vencidad
MSK.D_HOR = 1 ; % cant. de elem a tomar verticalmente como vencidad
%evita procesar los bordes
M = M - MSK.D_VERT;
N = N - MSK.D_HOR;
INI_F = 1 + MSK.D_VERT;
INI_C = 1 + MSK.D_HOR;
%Minimo y Maximo de tres elementos para evitar reservar mas vectores
%en O(M*N) al realizar el calculo principal
%Porque no sencillamente max([a,b,c]) o min[a,b,c]?
%[a,b,c] crea vectores de 3 elementos y en total se crearian 6 vec. solo
%para hallar maximos y minimos
MIN_3 = @(A,B,C) min(min(A,B),C);
MAX_3 = @(A,B,C) max(max(A,B),C);
for i = INI_F : M
for j = INI_C : N
%obtiene la vecindad con los parametros de la mascara
ve = imvencidad( img, [i , j], MSK.D_VERT , MSK.D_HOR );
%Forma la cruz, cerando los puntos que no pertenecen a la cruz
ve(1,1)=0 ; ve(3,3)=0 ; ve(3,1)=0; ve(1,3)=0;
% reduce a una dimension y ordena los valores
ve_ord = sort(reshape( ve , 1, []) );
%omite los 4 primeros elementos 0s ,dejando solo los de la cruz
a=ve_ord(5); b=ve_ord(6); c=ve_ord(7); d=ve_ord(8); e = ve_ord(9);
%aplica la definicion de pseudomediana , para 5 elementos
psmed =(1/2 * MAX_3( MIN_3(a,b,c), MIN_3(b,c,d), MIN_3(c,d,e) ))+...
(1/2 * MIN_3(MAX_3(a,b,c),MAX_3(b,c,d),MAX_3(c,d,e )));
imgresult(i, j) = psmed ;
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment