导入依赖
import cv2
import numpy as np
最大滤波
def max_filter(image,filter_size):
empty_image = np.full((image.shape[0] + (filter_size // 2) * 2, image.shape[1] + (filter_size // 2) * 2), -1)
empty_image[(filter_size // 2):empty_image.shape[0] - (filter_size // 2),
(filter_size // 2):empty_image.shape[1] - (filter_size // 2)] = image.copy()
result = np.full((image.shape[0], image.shape[1]), -1)
for h in range(filter_size // 2, empty_image.shape[0]-filter_size // 2):
for w in range(filter_size // 2, empty_image.shape[1]-filter_size // 2):
filter = empty_image[h - (filter_size // 2):h + (filter_size // 2) + 1,
w - (filter_size // 2):w + (filter_size // 2) + 1]
result[h-filter_size // 2, w-filter_size // 2] = np.amax(filter)
return result
最小滤波
def min_filter(image,filter_size):
empty_image = np.full((image.shape[0] + (filter_size // 2) * 2, image.shape[1] + (filter_size // 2) * 2), 400)
empty_image[(filter_size // 2):empty_image.shape[0] - (filter_size // 2),
(filter_size // 2):empty_image.shape[1] - (filter_size // 2)] = image.copy()
result = np.full((image.shape[0], image.shape[1]), 400)
for h in range(filter_size // 2, empty_image.shape[0]-filter_size // 2):
for w in range(filter_size // 2, empty_image.shape[1]-filter_size // 2):
filter = empty_image[h - (filter_size // 2):h + (filter_size // 2) + 1,
w - (filter_size // 2):w + (filter_size // 2) + 1]
result[h-filter_size // 2, w-filter_size // 2] = np.amin(filter)
return result
合并结果
def remove_shadow(image_path):
image = cv2.imread(image_path, 0)
max_result=max_filter(image,30)
min_result=min_filter(max_result,30)
result=image-min_result
result=cv2.normalize(result, None, 0, 255, norm_type=cv2.NORM_MINMAX)
return result
测试:
if __name__=="__main__":
result=remove_shadow('Test.jpg')
cv2.imwrite("./out1.jpg", result)