计算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直方图,我们可以对图像的纹理信息进行分析和比较,从而在图像处理和图像识别等领域中发挥重要作用。