-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmedianfilter_improved.py
60 lines (41 loc) · 1.9 KB
/
medianfilter_improved.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import numpy as np
import sys
from part import Part
def median_filter_improved(part, mask_size, copy_border=1):
img = part.img
row, column = img.shape
final_image = np.zeros((row, column), dtype=np.uint8)
# handle borders
margin_size = int((mask_size - 1) / 2) # assuming square mask
# 1) zero border
new_img = np.zeros((row + 2*margin_size, column + 2*margin_size), dtype=np.uint8)
new_img[margin_size : -margin_size, margin_size : -margin_size] = img
if copy_border:
# 2) copy border
# First left and right columns, then upper and lower rows.
# a) left column
for left_column in range(margin_size):
column2copy = img[:,0]
new_img[margin_size:-margin_size,left_column] = column2copy
# b) left column
for right_column in range(-1,-margin_size-1,-1):
column2copy = img[:,-1]
new_img[margin_size:-margin_size,right_column] = column2copy #BU İKİSİ TEK FOR'A İNER DÜŞÜNMEK LAZIM
# c) upper row
for upper_row in range(margin_size):
row2copy = new_img[margin_size,:]
new_img[upper_row,:] = row2copy
# d) lower row
for lower_row in range(-1,-margin_size-1,-1):
row2copy = new_img[-margin_size-1,:]
new_img[lower_row,:] = row2copy
# now, we can start median filtering
for i in range(row):
for j in range(column):
scope = new_img[i:i + mask_size, j: j + mask_size].flatten()
scope.sort()
final_image[i][j] = scope[(mask_size**2)//2] # median
progress = i * j / (row * column) * 100
sys.stdout.write("\r{0:.2f} %".format(progress))
sys.stdout.flush()
return Part(final_image, part.index)