fname="something.tif" #INSERT HERE THE FILE NAME OF YOUR GEOTIFF (32 floating point)
from math import *
import gdal
from gdalconst import *
dataset=gdal.Open(fname,GA_ReadOnly)
t=dataset.ReadAsArray()
cm=dataset.RasterXSize
cn=dataset.RasterYSize
cs=abs(dataset.GetGeoTransform()[1])
cx=dataset.GetGeoTransform()[3]
cy=dataset.GetGeoTransform()[0]
ujt=[]
for i in range (4,len(t)-4,+3):
    st=[]
    for j in range(4, len(t[i])-4,+3):
        kisebb=0
        a1=(t[i-4][j-4]+t[i-4][j-3]+t[i-4][j-2]+t[i-3][j-4]+t[i-3][j-3]+t[i-3][j-3]+t[i-2][j-4]+t[i-2][j-3]+t[i-2][j-2])/9
        a2=(t[i-4][j-1]+t[i-4][j]+t[i-4][j+1]+t[i-3][j-1]+t[i-3][j]+t[i-3][j+1]+t[i-2][j-1]+t[i-2][j]+t[i-2][j+1])/9
        a8=(t[i+4][j-1]+t[i+4][j]+t[i+4][j+1]+t[i+3][j-1]+t[i+3][j]+t[i+3][j+1]+t[i+2][j-1]+t[i+2][j]+t[i+2][j+1])/9
        a3=(t[i-4][j+4]+t[i-4][j+3]+t[i-4][j+2]+t[i-3][j+4]+t[i-3][j+3]+t[i-3][j+3]+t[i-2][j+4]+t[i-2][j+3]+t[i-2][j+2])/9
        a9=(t[i+4][j+4]+t[i+4][j+3]+t[i+4][j+2]+t[i+3][j+4]+t[i+3][j+3]+t[i+3][j+3]+t[i+2][j+4]+t[i+2][j+3]+t[i+2][j+2])/9
        a4=(t[i-1][j-4]+t[i-1][j-3]+t[i-1][j-2]+t[i][j-4]+t[i][j-3]+t[i][j-2]+t[i+1][j-4]+t[i+1][j-3]+t[i+1][j-2])/9
        a7=(t[i+4][j+4]+t[i+4][j+3]+t[i+4][j+2]+t[i+3][j+4]+t[i+3][j+3]+t[i+3][j+3]+t[i+2][j+4]+t[i+2][j+3]+t[i+2][j+2])/9
        a6=(t[i-1][j+4]+t[i-1][j+3]+t[i-1][j+2]+t[i][j+4]+t[i][j+3]+t[i][j+2]+t[i+1][j+4]+t[i+1][j+3]+t[i+1][j+2])/9
        a5=(t[i-1][j-1]+t[i-1][j]+t[i-1][j+1]+t[i][j-1]+t[i][j]+t[i][j+1]+t[i+1][j-1]+t[i+1][j]+t[i+1][j+1])/9
        if a5<(a1):
            kisebb+=1
        if a5<(a2):
             kisebb+=1        
        if a5<(a3):
             kisebb+=1
        if a5<(a4):
             kisebb+=1
        if a5<(a6):
             kisebb+=1
        if a5<(a7):
             kisebb+=1
        if a5<(a8):
             kisebb+=1
        if a5<(a9):
             kisebb+=1

        blokk=[t[i-1][j-1],t[i-1][j],t[i-1][j+1],t[i][j-1],t[i][j],t[i][j+1],t[i+1][j-1],t[i+1][j],t[i+1][j+1]]
        blokk.sort()
        
        st.append(blokk[kisebb])
    ujt.append(st)            
        
        

fn=open("something.asc",'w')  #INSERT HERE THE OUTPUT FILE NAME
fn.write('ncols '+str(-2+cm/3)+'\n'+'nrows '+str(-2+cn/3)+'\n'+'xllcorner '+str(cy+3*cs)+'\n'+'yllcorner '+str((cx+3*cs)-cn*cs)+'\n'+'cellsize '+str(cs*3)+'\n')
for k in range (0,len(ujt)):
    for l in range (0,len(ujt[k])):
        fn.write(str(ujt[k][l])+' ')
    fn.write('\n')
fn.close() 
