-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
21a4646
commit c690d4d
Showing
2 changed files
with
150 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |