Как я могу создать собственный фильтр полосовых фильтров?

В этот исследовательский документ, в разделе 4.1 (Предварительная обработка) дается уравнение полосового фильтра:

введите описание изображения здесь

Где

введите описание изображения здесь

Теперь я выполнил это следующим образом:

https://dotnetfiddle.net/ZhucE2

Но этот код ничего не производит.

Ответ 1

Вам нужно создать образ вашего ядра, а затем свернуть его с вашим изображением. fft используется для оптимизации свертки для больших изображений. Вы можете использовать функцию filter2D, чтобы сделать opencv делать все для вас.

Изображение ядра:
введите описание изображения здесь
Исходное изображение:
Исходное изображение
Применение свертки:
введите описание изображения здесь
Trhesholding:
введите описание изображения здесь

Смотрите код ниже:

import cv2
import math
import numpy as np

class Kernel(object):
    def H_Function(self, Dh, Dv, u, v, centerX, centerY, theta, n):
        return 1 / (1 + 0.414 * math.sqrt(math.pow(self.U_Star(u, centerX, centerY, theta) / Dh + self.V_Star(v, centerX, centerY, theta) / Dv, 2 * n)))

    def U_Star(self, u, centerX, centerY, theta):
        return math.cos(theta) * (u + self.Tx(centerX, theta)) + math.sin(theta) * (u + self.Ty(centerY, theta))

    def V_Star(self, u, centerX, centerY, theta):
        return (-math.sin(theta)) * (u + self.Tx(centerX, theta)) + math.cos(theta) * (u + self.Ty(centerY, theta))

    def Tx(self, center, theta):
        return center * math.cos(theta)

    def Ty(self, center, theta):
        return center * math.sin(theta)

K = Kernel()

size = 40, 40
kernel = np.zeros(size, dtype=np.float)
Dh=2
Dv=2
centerX = -size[0] / 2
centerY = -size[1] / 2
theta=0.9
n=4

for u in range(0, size[0]):
    for v in range(0, size[1]):
        kernel[u][v] = K.H_Function(Dh, Dv, u, v, centerX, centerY, theta, n) 
kernelNorm = np.copy(kernel)
cv2.normalize(kernel, kernel, 1.0, 0, cv2.NORM_L1)
cv2.normalize(kernelNorm, kernelNorm, 0, 255, cv2.NORM_MINMAX)
cv2.imwrite("kernel.jpg", kernelNorm)

imgSrc = cv2.imread('src.jpg',0)

convolved = cv2.filter2D(imgSrc,-1,kernel)
cv2.normalize(convolved, convolved, 0, 255, cv2.NORM_MINMAX)
cv2.imwrite("conv.jpg", convolved)
th, thresholded = cv2.threshold(convolved, 100, 255, cv2.THRESH_BINARY)
cv2.imwrite("thresh.jpg", thresholded)

Ответ 2

Нет необходимости хранить фильтр в массиве. Вы можете просто выполнить двойной цикл на компонентах u, v для значений, на которых был оценен FFT, вычислить ответ фильтра H (u, v) для каждой пары и умножить на соответствующий элемент массива. После обратного преобразования модифицированного массива вы получите отфильтрованное изображение.