Skip to content

Commit

Permalink
spatial filters
Browse files Browse the repository at this point in the history
  • Loading branch information
bunlusarac committed Dec 21, 2022
1 parent 21a4646 commit c690d4d
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 0 deletions.
57 changes: 57 additions & 0 deletions hi-pass.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
def clamp_pixel_value(value):
if value < 0:
return 0
elif value > 255:
return 255
else:
return value

def LaplacianFilter(img, mask=None):
assert (img is not None), "The image is not loaded"

width, height = img.shape
padded_width = (width//3) * 3
padded_height = (height//3) * 3
new_img = img.copy()

assert (new_img is not None), "Memory not enough to allocate storage for new image"

laplacian_mask = None

if mask == "variant":
laplacian_mask = [[1, 1, 1], [1, -8, 1], [1, 1, 1]]
elif mask == "sobelx":
laplacian_mask = [[-1, -2, -1], [0, 0, 0], [1, 2, 1]]
elif mask == "sobely":
laplacian_mask = [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]
else:
laplacian_mask = [[0, 1, 0], [1, -4, 1], [0, 1, 0]]

for i in range(1, padded_width-1):
for j in range(1, padded_height-1):
sum = 0

for k in range(i-1, i+2):
for w in range(j-1, j+2):
sum += img[k][w] * laplacian_mask[k-i][w-j]

new_img[i][j] = clamp_pixel_value(sum)

return new_img

def LaplacianEnhance(img, filter):
assert (img is not None), "The image is not loaded"
assert (filter is not None), "The filter is not loaded"

img_width, img_height = img.shape
filter_width, filter_height = filter.shape

assert (img_width == filter_width and img_height == filter_height, "Image and filter sizes are not matching")

new_img = img.copy()

for i in range(img_width):
for j in range(img_height):
new_img[i][j] = img[i][j] - filter[i][j]

return new_img
93 changes: 93 additions & 0 deletions low-pass.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
def MinFilter(img, nbhd_size):
assert (nbhd_size % 2 != 0), "The neighbourhood size must not be even"
assert (img is not None), "The image is not loaded"

width, height = img.shape
padded_width = (width//nbhd_size) * nbhd_size
padded_height = (height//nbhd_size) * nbhd_size
new_img = img.copy()

assert (new_img is not None), "Memory not enough to allocate storage for new image"

for i in range(((nbhd_size-1)//2), padded_width-((nbhd_size-1)//2)):
for j in range(((nbhd_size-1)//2), padded_height-((nbhd_size-1)//2)):
min = 255

for k in range(i-((nbhd_size-1)//2), i+((nbhd_size-1)//2)+1):
for w in range(j-((nbhd_size-1)//2), j+((nbhd_size-1)//2)+1):
if img[k][w] < min:
min = img[k][w]

new_img[i][j] = min

return new_img

def MaxFilter(img, nbhd_size):
assert (nbhd_size % 2 != 0), "The neighbourhood size must not be even"
assert (img is not None), "The image is not loaded"

width, height = img.shape
padded_width = (width//nbhd_size) * nbhd_size
padded_height = (height//nbhd_size) * nbhd_size
new_img = img.copy()

assert (new_img is not None), "Memory not enough to allocate storage for new image"

for i in range(((nbhd_size-1)//2), padded_width-((nbhd_size-1)//2)):
for j in range(((nbhd_size-1)//2), padded_height-((nbhd_size-1)//2)):
max = 0

for k in range(i-((nbhd_size-1)//2), i+((nbhd_size-1)//2)+1):
for w in range(j-((nbhd_size-1)//2), j+((nbhd_size-1)//2)+1):
if img[k][w] > max:
max = img[k][w]

new_img[i][j] = max

return new_img

def MeanFilter(img, nbhd_size):
assert (nbhd_size % 2 != 0), "The neighbourhood size must not be even"
assert (img is not None), "The image is not loaded"

width, height = img.shape
padded_width = (width//nbhd_size) * nbhd_size
padded_height = (height//nbhd_size) * nbhd_size
new_img = img.copy()

assert (new_img is not None), "Memory not enough to allocate storage for new image"

for i in range(((nbhd_size-1)//2), padded_width-((nbhd_size-1)//2)):
for j in range(((nbhd_size-1)//2), padded_height-((nbhd_size-1)//2)):
sum = 0

for k in range(i-((nbhd_size-1)//2), i+((nbhd_size-1)//2)+1):
for w in range(j-((nbhd_size-1)//2), j+((nbhd_size-1)//2)+1):
sum += img[k][w]

new_img[i][j] = sum/(nbhd_size**2 - 1)

return new_img

def MedianFilter(img, nbhd_size):
assert (nbhd_size % 2 != 0), "The neighbourhood size must not be even"
assert (img is not None), "The image is not loaded"

width, height = img.shape
padded_width = (width//nbhd_size) * nbhd_size
padded_height = (height//nbhd_size) * nbhd_size
new_img = img.copy()

assert (new_img is not None), "Memory not enough to allocate storage for new image"

for i in range(((nbhd_size-1)//2), padded_width-((nbhd_size-1)//2)):
for j in range(((nbhd_size-1)//2), padded_height-((nbhd_size-1)//2)):
vals = []

for k in range(i-((nbhd_size-1)//2), i+((nbhd_size-1)//2)+1):
for w in range(j-((nbhd_size-1)//2), j+((nbhd_size-1)//2)+1):
vals.append(img[k][w])

new_img[i][j] = vals[len(vals)//2]

return new_img

0 comments on commit c690d4d

Please sign in to comment.