图像颜色和纹理的均匀性

我是深度学习领域的新手,遇到一个问题:如何判断两张图像的颜色和纹理是否均匀。例如,我有一张

主图像 –

主图像

现在,基于这张图像,我需要判断以下图像的纹理和颜色分布是否均匀 –

图像1 –

图片1号

图像2 –

图片2号

图像3 –

图片3号

我需要开发一个算法来评估这三张图像与主图像的对比。该算法应通过图像1,并拒绝图像2(因为颜色差异)和图像3(因为颜色和纹理均匀性差异)。

我对这个问题的方法是直接分析图像以检测纹理。我发现局部二值模式(Local Binary Patterns)方法在所有纹理识别方法中表现良好(但我不确定)。我使用了Python中skimage的实现结合OpenCV,发现该方法有效。

from skimage import featureimport numpy as npimport cv2import matplotlib.pyplot as pltclass LocalBinaryPatterns:    def __init__(self, numPoints, radius):        # 存储点的数量和半径        self.numPoints = numPoints        self.radius = radius    def describe(self, image, eps=1e-7):        # 计算图像的局部二值模式表示        # 然后使用LBP表示构建模式的直方图        lbp = feature.local_binary_pattern(image, self.numPoints,            self.radius, method="uniform")        (hist, _) = np.histogram(lbp.ravel(),            bins=np.arange(0, self.numPoints + 3),            range=(0, self.numPoints + 2))        # 归一化直方图        hist = hist.astype("float")        hist /= (hist.sum() + eps)        # 返回局部二值模式的直方图        return histdesc = LocalBinaryPatterns(24, 8)image = cv2.imread("main.png")gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)hist = desc.describe(gray)plt.plot(hist,'b-')plt.ylabel('特征向量')plt.show()

它检测了特征并生成特征向量的直方图。我使用matplotlib绘制了直方图,并清楚地发现图像1和图像2的纹理特征与主图像几乎相同。而图像3的纹理特征不匹配。

然后我开始分析图像的颜色。我使用OpenCV绘制了颜色直方图,如下所示 –

import cv2from matplotlib import pyplot as pltdef draw_image_histogram(image, channels, color='k'):    hist = cv2.calcHist([image], channels, None, [256], [0, 256])    plt.plot(hist, color=color)    plt.xlim([0, 256])def show_color_histogram(image):    for i, col in enumerate(['b', 'g', 'r']):        draw_image_histogram(image, [i], color=col)    plt.show()show_color_histogram(cv2.imread("test1.jpg"))

我发现图像1的颜色直方图与主图像匹配。而图像2和3的颜色直方图不匹配。通过这种方式,我确定图像1是匹配的,而图像2和3不匹配。

但是,这是一种相当简单的处理方法,我不知道它会匹配多少误报。此外,我不知道这种方法是否是最佳的。

我还希望使用像CNN这样的单一且强大的算法来完成这个任务(但计算成本不应过高)。但我对CNN没有经验。所以我应该用主图像训练一个CNN吗?请指导我正确的方向。我还了解到LBCNNs,它们能解决这个问题吗?还有哪些更好的方法?

非常感谢您的帮助


回答:

CNN擅长捕捉数据集的底层特征和分布。但它们需要大量(数十万个示例)数据来学习和提取这些特征,这是一个非常昂贵的任务。对于高分辨率图像,还需要更多的参数来提取这些特征,这进一步要求更多的数据。

如果你有大量数据集,可以选择使用CNN,它可以捕捉到这些细微的纹理信息。否则,这些经典方法(你已经使用的方法)也同样有效。

还有一种方法称为迁移学习,我们使用在类似数据集上训练过的预训练模型,并在我们的小数据集上进行微调。如果你能找到这样的模型,这也可以是一个选择。

Related Posts

为什么我们在K-means聚类方法中使用kmeans.fit函数?

我在一个视频中使用K-means聚类技术,但我不明白为…

如何获取Keras中ImageDataGenerator的.flow_from_directory函数扫描的类名?

我想制作一个用户友好的GUI图像分类器,用户只需指向数…

如何查看每个词的tf-idf得分

我试图了解文档中每个词的tf-idf得分。然而,它只返…

如何修复 ‘ValueError: Found input variables with inconsistent numbers of samples: [32979, 21602]’?

我在制作一个用于情感分析的逻辑回归模型时遇到了这个问题…

如何向神经网络输入两个不同大小的输入?

我想向神经网络输入两个数据集。第一个数据集(元素)具有…

逻辑回归与机器学习有何关联

我们正在开会讨论聘请一位我们信任的顾问来做机器学习。一…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注