Last active
May 3, 2025 10:47
-
-
Save SamratSahoo/cef04a39a4033f7bec0299a10701eb95 to your computer and use it in GitHub Desktop.
2D Convolution Implementation with NumPy
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
def convolve2D(image, kernel, padding=0, strides=1): | |
# Cross Correlation | |
kernel = np.flipud(np.fliplr(kernel)) | |
# Gather Shapes of Kernel + Image + Padding | |
xKernShape = kernel.shape[0] | |
yKernShape = kernel.shape[1] | |
xImgShape = image.shape[0] | |
yImgShape = image.shape[1] | |
# Shape of Output Convolution | |
xOutput = int(((xImgShape - xKernShape + 2 * padding) / strides) + 1) | |
yOutput = int(((yImgShape - yKernShape + 2 * padding) / strides) + 1) | |
output = np.zeros((xOutput, yOutput)) | |
# Apply Equal Padding to All Sides | |
if padding != 0: | |
imagePadded = np.zeros((image.shape[0] + padding*2, image.shape[1] + padding*2)) | |
imagePadded[int(padding):int(-1 * padding), int(padding):int(-1 * padding)] = image | |
print(imagePadded) | |
else: | |
imagePadded = image | |
# Iterate through image | |
for y in range(image.shape[1]): | |
# Exit Convolution | |
if y > image.shape[1] - yKernShape: | |
break | |
# Only Convolve if y has gone down by the specified Strides | |
if y % strides == 0: | |
for x in range(image.shape[0]): | |
# Go to next row once kernel is out of bounds | |
if x > image.shape[0] - xKernShape: | |
break | |
try: | |
# Only Convolve if x has moved by the specified Strides | |
if x % strides == 0: | |
output[x, y] = (kernel * imagePadded[x: x + xKernShape, y: y + yKernShape]).sum() | |
except: | |
break | |
return output |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment