Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.
медианный фильтр
Медианный фильтр легко сказать, opencv поставляется с функциями, которые можно использовать напрямую. В OpenCV функция, реализующая медианную фильтрацию,cv2.medianBlur(src, ksize)
- источник: местоположение изображения
- kszie: размер ядра свертки
import cv2 as cv
img = cv.imread('d:/Desktop/1.jpg') # 我的桌面上有个1.jpg
res = cv.medianBlur(img, 5)
cv.imshow("original", img)
cv.imshow("result", res)
cv.waitKey(0)
Медианный фильтр будет принимать значения пикселей текущего пикселя и окружающих его соседних пикселей (всего имеется нечетное количество пикселей), сортировать эти значения пикселей, а затем использовать значение пикселя в середине в качестве значения пикселя текущий пиксель.
Установите для его окрестности размер 3 × 3 и отсортируйте значения пикселей в его окрестности 3 × 3 (допустим порядок возрастания и убывания).После сортировки в порядке возрастания значение последовательности равно:
[66,78,90,91,93,94,95,97,101]
. В этой последовательности значение в центральной позиции (также называемое центральной точкой или срединной точкой) равно «93», поэтому исходное значение пикселя 78 заменяется этим значением в качестве нового значения пикселя текущей точки, а обработка результат следующий.
макс мин фильтр
Принцип медианного фильтра упомянут выше, максимальный и минимальный фильтр заключается в замене медианы максимальным или минимальным значением.
Opencv не имеет собственных максимальных и минимальных фильтров, поэтому вам нужно написать его самостоятельно.Код для определения функции выглядит следующим образом:
def original(i, j, k, ksize, img):
# 找到矩阵坐标
x1 = y1 = -ksize // 2
x2 = y2 = ksize + x1
temp = np.zeros(ksize * ksize)
count = 0
# 处理图像
for m in range(x1, x2):
for n in range(y1, y2):
if i + m < 0 or i + m > img.shape[0] - 1 or j + n < 0 or j + n > img.shape[1] - 1:
temp[count] = img[i, j, k]
else:
temp[count] = img[i + m, j + n, k]
count += 1
return temp
# 自定义最大值滤波器最小值滤波器
def max_min_functin(ksize, img, flag):
img0 = copy.copy(img)
for i in range(0, img.shape[0]):
for j in range(2, img.shape[1]):
for k in range(img.shape[2]):
temp = original(i, j, k, ksize, img0)
if flag == 0: # 设置flag参数,如果是0就检测最大值,如果是1就检测最小值。
img[i, j, k] = np.max(temp)
elif flag == 1:
img[i, j, k] = np.min(temp)
return img
Уведомление, приведенный выше код относительно прост в написании и может принимать только случай, когда ядро свертки представляет собой квадратную матрицу.
Сделайте это в действии:
import cv2 as cv
import numpy as np
import copy
def original(i, j, k, ksize, img):
# 找到矩阵坐标
x1 = y1 = -ksize // 2
x2 = y2 = ksize + x1
temp = np.zeros(ksize * ksize)
count = 0
# 处理图像
for m in range(x1, x2):
for n in range(y1, y2):
if i + m < 0 or i + m > img.shape[0] - 1 or j + n < 0 or j + n > img.shape[1] - 1:
temp[count] = img[i, j, k]
else:
temp[count] = img[i + m, j + n, k]
count += 1
return temp
# 自定义最大值滤波器最小值滤波器
def max_min_functin(ksize, img, flag):
img0 = copy.copy(img)
for i in range(0, img.shape[0]):
for j in range(2, img.shape[1]):
for k in range(img.shape[2]):
temp = original(i, j, k, ksize, img0)
if flag == 0:
img[i, j, k] = np.max(temp)
elif flag == 1:
img[i, j, k] = np.min(temp)
return img
img = cv.imread('d:/Desktop/1.png')
min_img = max_min_functin(3, copy.copy(img),1)
max_img = max_min_functin(3, copy.copy(img),0)
cv.imshow("original", img)
cv.imshow("min_img", min_img)
cv.imshow("max_img", max_img)
cv.waitKey(0)
Видно, что фильтрация с максимальным значением может удалить темные пятна на изображении, а также увеличит светлые пятна (расширение); фильтрация с минимальным значением может удалить яркие пятна на изображении, а также увеличить темные пятна ( коррозия).