11.均值滤波:
import cv2
import numpy as np
#Mean filter
def mean_filter(img,K_size=3):
if len(img.shape) == 3:
H,W,C = img.shape
else:
H,W,C = np.expand_dims(img,axis=-1)
H,W,C = img.shape
#zero padding
pad = K_size//2
out = np.zeros((H+pad*2,W+pad*2,C),dtype=np.float)
out[pad:pad+H,pad:pad+W] = img.copy().astype(np.float)
tmp = out.copy()
#filter
for y in range(H):
for x in range(W):
for c in range(C):
out[y+pad,x+pad,c] = np.mean(tmp[y:y+K_size,x:x+K_size,c])
out = out[pad:pad+H,pad:pad+W].astype(np.uint8)
return out
img = cv2.imread('full.jpg')
out = mean_filter(img)
cv2.imshow('11',out)
cv2.waitKey(0)
12.Motion Filter:
import numpy as np
import cv2
#Motion filter
def motion_filter(img,K_size=3):
H,W,C = img.shape
#kernel
K = np.diag([1]*K_size).astype(np.float)
K /= K_size
#zero padding
pad = K_size//2
out = np.zeros((H+pad*2,W+pad*2,C),dtype=np.float)
out[pad:pad+H,pad:pad+W] = img.copy().astype(np.float)
tmp = out.copy()
#filter
for y in range(H):
for x in range(W):
for c in range(C):
out[pad+y,pad+x,c] = np.sum(K*tmp[y:K_size+y,x:K_size+x,c])
out = out[pad:pad+H,pad:pad+W].astype(np.uint8)
return out
img = cv2.imread('full.jpg')
out= motion_filter(img)
cv2.imshow('11',out)
cv2.waitKey(0)
13.MAX-MIN滤波器:
import numpy as np
import cv2
#Gray scale
def BGR2GRAY(img):
b = img[:,:,0].copy()
g = img[:,:,1].copy()
r = img[:,:,2].copy()
out = 0.2126*r + 0.7152*g+0.0722*b
out = out.astype(np.uint8)
return out
#max-min filter
def max_min_filter(img,K_size=3):
H,W = img.shape
#zero padding
pad = int(K_size)
out = np.zeros((H+2*pad,W+2*pad),dtype=np.float)
out[pad:pad+H,pad:pad+W] = gray.copy().astype(np.float)
tmp = out.copy()
#filtering
for y in range(H):
for x in range(W):
out[pad+y,pad+x] = np.max(tmp[y:y+K_size,x:x+K_size])-np.min(tmp[y:y+K_size,x:x+K_size])
out = out[pad:pad+H,pad:pad+W].astype(np.uint8)
return out
img = cv2.imread('test.jpg')
gray = BGR2GRAY(img)
out = max_min_filter(gray)
cv2.imshow('11',out)
cv2.waitKey(0)
14.差分滤波器 (Difffferential Filter):
def BGR2GRAY(img):
b = img[:,:,0].copy()
g = img[:,:,1].copy()
r = img[:,:,2].copy()
out = 0.2126*r + 0.7152*g+0.0722*b
out = out.astype(np.uint8)
return out
def differential_filter(gray,K_size = 3):
H,W = gray.shape
#zero padding
pad = K_size//2
out = np.zeros((H+2*pad,W+2*pad),dtype=np.float)
out[pad:pad+H,pad:pad+W] = gray.copy().astype(np.uint8)
tmp = out.copy()
out_v = out.copy()
out_h = out.copy()
filter_v = np.array(([[0 ,-1, 0],[0 ,1 ,0],[0 ,0 ,0]]),dtype=np.float)
filter_h= np.array(([[0 ,0 ,0],[-1, 1, 0],[0, 0, 0]]),dtype=np.float)
#filter
for y in range(H):
for x in range(W):
out_v[y+pad,x+pad] = np.sum(filter_v*(tmp[y:y+K_size,x:x+K_size]))
out_h[y+pad,x+pad] = np.sum((filter_h*tmp[y:y+K_size,x:x+K_size]))
out_v = np.clip(out_v, 0, 255)
out_h = np.clip(out_h, 0, 255)
out_v = out_v[pad:pad+H,pad:pad+W].astype(np.uint8)
out_h = out_h[pad:pad+H,pad:pad+W].astype(np.uint8)
return out_v,out_h
img = cv2.imread('test.jpg')
gray = BGR2GRAY(img)
out_v,out_h = differential_filter(gray)
cv2.imshow('11',out_v)
cv2.imshow('22',out_h)
cv2.waitKey(0)