def Gabor_process(img): # get shape H, W, _ = img.shape # gray scale gray = BGR2GRAY(img).astype(np.float32) # define angle As = [0, 45, 90, 135] # prepare pyplot plt.subplots_adjust(left=0, right=1, top=1, bottom=0, hspace=0, wspace=0.2) out = np.zeros([H, W], dtype=np.float32) # each angle for i, A in enumerate(As): # gabor filtering _out = Gabor_filtering(gray, K_size=11, Sigma=1.5, Gamma=1.2, Lambda=3, angle=A) # add gabor filtered image out += _out # scale normalization out = out / out.max() * 255 out = out.astype(np.uint8) return out
时间: 2024-02-03 20:02:53 浏览: 17
这是一个使用 Gabor 滤波器对图像进行处理的函数。具体来说,输入参数为图像,输出为处理后的图像。函数首先获取输入图像的尺寸和灰度图像,接着定义了一组 Gabor 滤波器的角度,并准备好 pyplot(可能是用于可视化的工具包)。
在处理过程中,函数针对每个角度,应用了 Gabor 滤波器对灰度图像进行滤波,并将每个角度的滤波结果相加。最后,对结果进行了归一化和类型转换,输出处理后的图像。
相关问题
import os import cv2 import numpy as np def gabor_kernel(ksize, sigma, gamma, lamda, alpha, psi): """ reference https://en.wikipedia.org/wiki/Gabor_filter """ sigma_x = sigma sigma_y = sigma / gamma ymax = xmax = ksize // 2 # 9//2 xmin, ymin = -xmax, -ymax # print("xmin, ymin,xmin, ymin",xmin, ymin,ymax ,xmax) # X(第一个参数,横轴)的每一列一样, Y(第二个参数,纵轴)的每一行都一样 (y, x) = np.meshgrid(np.arange(ymin, ymax + 1), np.arange(xmin, xmax + 1)) # 生成网格点坐标矩阵 # print("y\n",y) # print("x\n",x) x_alpha = x * np.cos(alpha) + y * np.sin(alpha) y_alpha = -x * np.sin(alpha) + y * np.cos(alpha) print("x_alpha[0][0]", x_alpha[0][0], y_alpha[0][0]) exponent = np.exp(-.5 * (x_alpha ** 2 / sigma_x ** 2 + y_alpha ** 2 / sigma_y ** 2)) # print(exponent[0][0]) # print(x[0],y[0]) kernel = exponent * np.cos(2 * np.pi / lamda * x_alpha + psi) print(kernel) # print(kernel[0][0]) return kernel def gabor_filter(gray_img, ksize, sigma, gamma, lamda, psi): filters = [] for alpha in np.arange(0, np.pi, np.pi / 4): print("alpha", alpha) kern = gabor_kernel(ksize=ksize, sigma=sigma, gamma=gamma, lamda=lamda, alpha=alpha, psi=psi) filters.append(kern) gabor_img = np.zeros(gray_img.shape, dtype=np.uint8) i = 0 for kern in filters: fimg = cv2.filter2D(gray_img, ddepth=cv2.CV_8U, kernel=kern) gabor_img = cv2.max(gabor_img, fimg) i += 1 p = 1.25 gabor_img = (gabor_img - np.min(gabor_img, axis=None)) ** p _max = np.max(gabor_img, axis=None) gabor_img = gabor_img / _max print(gabor_img) gabor_img = gabor_img * 255 return gabor_img.astype(dtype=np.uint8) def main(): dir_path = '7/' files = os.listdir(dir_path) for i in files: print(i) img = cv2.imread(dir_path + "/" + i) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gabor_img = gabor_filter(img_gray, ksize=9, sigma=1, gamma=0.5, lamda=5, psi=-np.pi / 2) Img_Name = "5/gabor/" + str(i) cv2.imwrite(Img_Name, gabor_img) main()
这段代码定义了一个函数,用于生成一个Gabor滤波器核(Gabor kernel)。其中,使用了Python中的三个模块,分别是os、cv2和numpy。函数的输入参数为ksize、sigma、gamma、lamda、alpha和psi,分别表示核的大小、标准差、长宽比、波长、方向以及相位偏移。函数的实现采用了Gabor滤波器的数学公式,使用了numpy中的数组操作,最终生成了一个Gabor核。
import cv2 import numpy as np import matplotlib.pyplot as plt def build_filters(): filters = [] ksize = 9 for theta in np.arange(0, np.pi, np.pi / 8): for sigma in range(1, 6): for frequency in (0.1, 0.2): kernel = cv2.getGaborKernel((ksize, ksize), sigma, theta, frequency, 0.5, 0, ktype=cv2.CV_32F) kernel /= 1.5 * kernel.sum() filters.append(kernel) return filters def process(img, filters): features = np.zeros((img.shape[0], img.shape[1], len(filters)), dtype=np.float32) for i, kernel in enumerate(filters): filtered = cv2.filter2D(img, cv2.CV_8UC3, kernel) features[:, :, i] = filtered return features # 读取图像并转为灰度图 img = cv2.imread('lena.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 构建gabor滤波器组 filters = build_filters() # 对图像进行gabor特征提取 features = process(gray, filters) # 显示gabor滤波后的特征图像 fig, axes = plt.subplots(nrows=5, ncols=8, figsize=(16, 10)) for i, ax in enumerate(axes.flat): ax.imshow(features[:, :, i], cmap='gray') ax.set_xticks([]) ax.set_yticks([]) plt.show()用矩阵将这段代码中特征提取后的图像表示出来
很抱歉,我无法将图像在这里直接显示出来。但是,你可以将代码复制到你的本地环境中运行,然后查看生成的图像。在这段代码中,使用了OpenCV库和NumPy库构建了Gabor滤波器组,然后对图像进行Gabor特征提取,并使用Matplotlib库将每个滤波器返回的特征图像显示出来。features是一个三维数组,其中第一维和第二维表示图像的高度和宽度,第三维是每个滤波器返回的特征图像。所以你可以使用features[:, :, i]来获取第i个特征图像的矩阵表示。