计算LBP直方图并比较的Python代码

LBP(Local Binary Patterns)是一种用于图像纹理分析的特征描述符。LBP特征描述符以局部纹理模式为基础,通过对图像中每个像素与其邻域像素的比较,将每个像素点映射为一个二进制数值。然后,通过统计这些二进制数值的频率,可以得到LBP直方图。LBP直方图是一种用于表示图像纹理信息的特征向量。

下面是计算LBP直方图并比较的Python代码示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt

def calculate_lbp_histogram(image):
    # 将图像转换为灰度图像
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 获取图像的高度和宽度
    height, width = gray_image.shape
    
    # 初始化LBP直方图
    lbp_histogram = np.zeros(256, dtype=np.float32)
    
    # 遍历图像中的每个像素
    for i in range(1, height-1):
        for j in range(1, width-1):
            # 获取像素的8个邻域像素值
            neighbors = [
                gray_image[i-1, j-1], gray_image[i-1, j], gray_image[i-1, j+1],
                gray_image[i, j-1], gray_image[i, j+1],
                gray_image[i+1, j-1], gray_image[i+1, j], gray_image[i+1, j+1]
            ]
            
            # 将邻域像素与中心像素进行比较,生成二进制数值
            binary_value = 0
            center_pixel = gray_image[i, j]
            for k, neighbor in enumerate(neighbors):
                if neighbor >= center_pixel:
                    binary_value += 2 ** k
            
            # 更新LBP直方图
            lbp_histogram[binary_value] += 1
    
    # 归一化LBP直方图
    lbp_histogram /= np.sum(lbp_histogram)
    
    return lbp_histogram

# 加载图像
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')

# 计算LBP直方图
histogram1 = calculate_lbp_histogram(image1)
histogram2 = calculate_lbp_histogram(image2)

# 计算两个直方图的相似度
similarity = cv2.compareHist(histogram1, histogram2, cv2.HISTCMP_CORREL)

# 输出相似度结果
print("Similarity:", similarity)

# 绘制直方图
plt.figure()
plt.subplot(1, 2, 1)
plt.plot(histogram1)
plt.title('Histogram 1')
plt.subplot(1, 2, 2)
plt.plot(histogram2)
plt.title('Histogram 2')
plt.show()

以上代码首先定义了一个calculate_lbp_histogram函数,用于计算LBP直方图。该函数接受一个图像作为输入,并返回一个256维的LBP直方图。在函数内部,首先将图像转换为灰度图像,然后遍历图像中的每个像素,并计算其邻域像素与中心像素的比较结果,生成一个二进制数值。最后,根据二进制数值更新LBP直方图。

接下来,加载两个图像,并调用calculate_lbp_histogram函数计算它们的LBP直方图。然后,使用OpenCV的compareHist函数计算两个直方图的相似度。最后,绘制出两个直方图的曲线。

通过比较两个直方图的相似度,我们可以得出图像之间的纹理相似度。相似度的取值范围在0到1之间,数值越接近1表示图像的纹理越相似。

以上就是计算LBP直方图并比较的Python代码示例。通过计算LBP直方图,我们可以对图像的纹理信息进行分析和比较,从而在图像处理和图像识别等领域中发挥重要作用。