-
- Notifications
You must be signed in to change notification settings - Fork 48.9k
feat: add basic image filtering filter.py #7155
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from 1 commit
Commits
Show all changes
3 commits Select commit Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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,211 @@ | ||
import cv2 | ||
import numpy as np | ||
| ||
| ||
class Filter: | ||
def __int__(self, image): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
self.image = image | ||
| ||
def image_read(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Read the image | ||
:return: The image as numpy array | ||
""" | ||
return cv2.imread(self.image, 0) | ||
| ||
def get_identity_kernel(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Apply identity kernel | ||
:return: array with the value of the middle element | ||
is 1 and all the other elements are 0 | ||
""" | ||
return np.array([[0, 0, 0], [0, 1, 0], [0, 0, 0]]) | ||
| ||
def get_blur_kernel(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Kernel for box blur filter | ||
:return: unity matrix which is divided by 9 | ||
""" | ||
return np.array( | ||
[ | ||
[0.1111111, 0.1111111, 0.1111111], | ||
[0.1111111, 0.1111111, 0.1111111], | ||
[0.1111111, 0.1111111, 0.1111111], | ||
] | ||
) | ||
| ||
def get_sharp_kernel(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Apply kernel for sharpening | ||
:return: sharpening filter array | ||
""" | ||
return np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]) | ||
| ||
def get_emboss_kernel(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Apply kernel for embossing | ||
:return: embossing filter array | ||
""" | ||
return np.array([[-1, 0, 0], [0, 0, 0], [0, 0, 1]]) | ||
| ||
def image_shape(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Get the Image Shape | ||
:return: The number of rows and columns of the Image | ||
""" | ||
image = cv2.imread(self.image, 0) | ||
rows, columns = image.shape | ||
return rows, columns | ||
| ||
def get_new_image(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Convolve mask over the image | ||
:return: New Image as numpy array | ||
""" | ||
rows, columns = self.image_shape() | ||
return np.zeros([rows, columns]) | ||
| ||
def average_mask(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Averaging filter Mask | ||
:return: mask with 3×3 dim | ||
""" | ||
return (np.ones([3, 3], dtype=int)) / 9 | ||
| ||
def get_ready(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Read the image, Get the Image Shape, Convolve mask over the image | ||
:return: row, columns , image and new image | ||
""" | ||
image = self.image_read() | ||
rows, columns = self.image_shape() | ||
new_image = self.get_new_image() | ||
| ||
return rows, columns, image, new_image | ||
| ||
def set_up_filter(self, kernel): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
kernel is used for specifying the kernel operation | ||
:param kernel: choose the kernel we want to apply | ||
:return: the image after applying the filter with the chosen kernel | ||
""" | ||
image = self.image_read() | ||
kernel = kernel | ||
filter_image = cv2.filter2D(src=image, ddepth=-1, kernel=kernel) | ||
return filter_image | ||
| ||
def average(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Low Pass Spatial Domain Filtering to handel the blurring effect | ||
:return: image after applying the Average filter | ||
""" | ||
rows, columns, image, new_image = self.get_ready() | ||
mask = self.average_mask() | ||
for i in range(1, rows - 1): | ||
for j in range(1, columns - 1): | ||
temp = ( | ||
image[i - 1, j - 1] * mask[0, 0] | ||
+ image[i - 1, j] * mask[0, 1] | ||
+ image[i - 1, j + 1] * mask[0, 2] | ||
+ image[i, j - 1] * mask[1, 0] | ||
+ image[i, j] * mask[1, 1] | ||
+ image[i, j + 1] * mask[1, 2] | ||
+ image[i + 1, j - 1] * mask[2, 0] | ||
+ image[i + 1, j] * mask[2, 1] | ||
+ image[i + 1, j + 1] * mask[2, 2] | ||
) | ||
| ||
new_image[i, j] = temp | ||
return new_image.astype(np.uint8) | ||
| ||
def median(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Traverse the image find the median of the pixels and | ||
replace the center pixel by median filter | ||
:return: image after applying the median filter | ||
""" | ||
rows, columns, image, new_image = self.get_ready() | ||
for i in range(1, rows - 1): | ||
for j in range(1, columns - 1): | ||
temp = [ | ||
image[i - 1, j - 1], | ||
image[i - 1, j], | ||
image[i - 1, j + 1], | ||
image[i, j - 1], | ||
image[i, j], | ||
image[i, j + 1], | ||
image[i + 1, j - 1], | ||
image[i + 1, j], | ||
image[i + 1, j + 1], | ||
] | ||
| ||
temp = sorted(temp) | ||
new_image[i, j] = temp[4] | ||
return new_image.astype(np.uint8) | ||
| ||
def filter_2d(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Use Identity Kernel with 2D filter | ||
:return: Filtered image with Identity Kernel | ||
""" | ||
kernel = self.get_identity_kernel() | ||
return self.set_up_filter(kernel) | ||
| ||
def blur_filter(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Use Kernel Blur with 2D filter | ||
:return: Blur Filtered image with Blur Kernel | ||
""" | ||
kernel = self.get_blur_kernel() | ||
return self.set_up_filter(kernel) | ||
| ||
def gaussian_blur(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Applying Gaussian Blur Filter using Gaussian Blur method | ||
:return: Gaussian Blur filtered image | ||
""" | ||
image = self.image_read() | ||
gaussian_blur_filter_image = cv2.GaussianBlur( | ||
src=image, ksize=(3, 3), sigmaX=0, sigmaY=0 | ||
) | ||
return gaussian_blur_filter_image | ||
| ||
def median_blur(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Applying median Blur Filter using median Blur method | ||
:return: Median Blur filtered image | ||
""" | ||
image = self.image_read() | ||
median_blur_filtered_image = cv2.medianBlur(src=image, ksize=9) | ||
return median_blur_filtered_image | ||
| ||
def sharp_filter(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Use Sharp kernel with 2D filter | ||
:return: Sharpened image with sharp Kernel | ||
""" | ||
kernel = self.get_sharp_kernel() | ||
return self.set_up_filter(kernel) | ||
| ||
def emboss_filter(self): | ||
Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved Mouiad-JRA marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
""" | ||
Use Emboss kernel with 2D filter | ||
:return: Embossed image with emboss Kernel | ||
""" | ||
kernel = self.get_emboss_kernel() | ||
return self.set_up_filter(kernel) | ||
| ||
| ||
# Main Function | ||
if __name__ == "__main__": | ||
| ||
filter_object = Filter() | ||
filter_object.image = "path/image-name.png" | ||
cv2.imwrite("average.tif", filter_object.average()) | ||
cv2.imwrite("median.tif", filter_object.median()) | ||
cv2.imwrite("filter_2d.tif", filter_object.filter_2d()) | ||
cv2.imwrite("blur_filter.tif", filter_object.blur_filter()) | ||
cv2.imwrite("gaussian_blur.tif", filter_object.gaussian_blur()) | ||
cv2.imwrite("median_blur.tif", filter_object.median_blur()) | ||
cv2.imwrite("sharp_filter.tif", filter_object.sharp_filter()) | ||
cv2.imwrite("emboss_filter.tif", filter_object.emboss_filter()) |
Add this suggestion to a batch that can be applied as a single commit. This suggestion is invalid because no changes were made to the code. Suggestions cannot be applied while the pull request is closed. Suggestions cannot be applied while viewing a subset of changes. Only one suggestion per line can be applied in a batch. Add this suggestion to a batch that can be applied as a single commit. Applying suggestions on deleted lines is not supported. You must change the existing code in this line in order to create a valid suggestion. Outdated suggestions cannot be applied. This suggestion has been applied or marked resolved. Suggestions cannot be applied from pending reviews. Suggestions cannot be applied on multi-line comments. Suggestions cannot be applied while the pull request is queued to merge. Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.