Hi, I'm Ramu. This time, we will implement a motion filter, which is a filter that adds movement to the image.
A smoothing filter is a filter that smoothes an image. By applying this filter, you can make the entire image look blurry. Especially with this motion filter, fluid blurring is possible.
This filter replaces the pixel of interest with the diagonal mean of the surrounding pixels. For example, a 3x3 or 5x5 motion filter looks like this:
Assuming that the pixel of interest is the center, the sum of the products of the peripheral pixels and the corresponding filter values should be substituted for the pixel of interest. For a 3 × 3 filter, $ I (x_0, y_0) × \ frac {1} {3} + I (x_1, y_1) × \ frac {1} {3} + I (x_2, y_2) × \ frac { Substitute the value of 1} {3} $ for the pixel of interest. Now, the average value of the diagonal lines of the peripheral pixels is assigned to the pixel of interest.
Also, as in the previous time, since the edge part of the image cannot be filtered, 0 padding processing using 0 is performed for pixels that do not exist.
motionFilter.py
import numpy as np
import cv2
import matplotlib.pyplot as plt
def motionFilter(img,k):
w,h,c = img.shape
size = k // 2
#0 padding process
_img = np.zeros((w+2*size,h+2*size,c), dtype=np.uint8)
_img[size:size+w,size:size+h] = img.copy().astype(np.uint8)
dst = _img.copy()
#Create filter
ker = np.zeros((k,k), dtype=np.float)
for i in range(-1*size,k-size):
ker[i+size,i+size] = 1/k
#Filtering process
for x in range(w):
for y in range(h):
for z in range(c):
dst[x+size,y+size,z] = np.sum(ker*_img[x:x+k,y:y+k,z])
dst = dst[size:size+w,size:size+h].astype(np.uint8)
return dst
#Image reading
img = cv2.imread('image.jpg')
#Motion filter
#Second argument: Filter size
img = motionFilter(img,21)
#Save image
cv2.imwrite('result.jpg', img)
#Image display
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
The image on the left is the input image, and the image on the right is the output image. The output image looks blurry, and you can see that smoothing has been performed. Also, unlike other smoothing filters, it flows in the diagonal direction of the filter.
If you have any questions, please feel free to contact us. imori_imori's Github has the official answer, so please check that as well. .. Also, since python is a beginner, please kindly point out any mistakes.
Recommended Posts