медианный фильтр python + opencv, максимальный фильтр и минимальный фильтр

OpenCV

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.

медианный фильтр

Медианный фильтр легко сказать, 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)

image.png

Медианный фильтр будет принимать значения пикселей текущего пикселя и окружающих его соседних пикселей (всего имеется нечетное количество пикселей), сортировать эти значения пикселей, а затем использовать значение пикселя в середине в качестве значения пикселя текущий пиксель.

image.png

Установите для его окрестности размер 3 × 3 и отсортируйте значения пикселей в его окрестности 3 × 3 (допустим порядок возрастания и убывания).После сортировки в порядке возрастания значение последовательности равно:[66,78,90,91,93,94,95,97,101]. В этой последовательности значение в центральной позиции (также называемое центральной точкой или срединной точкой) равно «93», поэтому исходное значение пикселя 78 заменяется этим значением в качестве нового значения пикселя текущей точки, а обработка результат следующий.

image.png

макс мин фильтр

Принцип медианного фильтра упомянут выше, максимальный и минимальный фильтр заключается в замене медианы максимальным или минимальным значением.

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)

image.png

Видно, что фильтрация с максимальным значением может удалить темные пятна на изображении, а также увеличит светлые пятна (расширение); фильтрация с минимальным значением может удалить яркие пятна на изображении, а также увеличить темные пятна ( коррозия).