我是深度学习领域的新手,在确定两个图像是否具有统一的颜色和纹理时遇到问题。例如,我有一个
主图像-
现在,关于该图像,我需要确定以下图像是否具有均匀的纹理和颜色分布-
图片1-
图片2-
图片3-
我需要开发一种算法,该算法将使用主图像评估这3张图像。由于图像1的颜色,该算法应该批准图像1,而由于图像2的颜色和纹理均匀性,该算法应拒绝图像2。
我针对此问题的方法是直接分析图像以进行纹理检测。我发现在所有纹理识别方法中,“本地二进制模式”方法都不错(但我不确定)。我在python中将它的skimage实现与opencv一起使用,发现该方法有效。
from skimage import feature
import numpy as np
import cv2
import matplotlib.pyplot as plt
class LocalBinaryPatterns:
def __init__(self, numPoints, radius):
# store the number of points and radius
self.numPoints = numPoints
self.radius = radius
def describe(self, image, eps=1e-7):
# compute the Local Binary Pattern representation
# of the image, and then use the LBP representation
# to build the histogram of patterns
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))
# normalize the histogram
hist = hist.astype("float")
hist /= (hist.sum() + eps)
# return the histogram of Local Binary Patterns
return hist
desc = 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('Feature Vectors')
plt.show()
检测到特征并制作特征向量直方图。我使用matplotlib绘制了直方图,并清楚地发现图像1和图像2的纹理特征几乎与主图像相似。并且图像3的纹理特征不匹配。
然后,我开始分析图像的颜色。我使用opencv作为-
绘制了颜色直方图import cv2
from matplotlib import pyplot as plt
def 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吗?请指出正确的方向。我也遇到过LBCNN,他们可以解决问题吗?还有什么其他更好的方法。
非常感谢您的帮助
答案 0 :(得分:1)
CNN擅长捕获数据集的基本特征和分布。但是他们需要大量(数十万个示例)来学习和提取这些功能,这是非常昂贵的任务。同样对于高分辨率图像,将需要更多参数来提取这些特征,从而进一步需要更多数据。
如果您的数据集很大,则可以使用CNN,它可以捕获微小的信息,例如这些精细的纹理。否则,这些经典方法(您执行过的一种方法)也可以很好地工作。
还有一种名为transfer-learning
的方法,其中我们使用预先训练的模型(在相似的数据集上进行训练)并在small data-set
上进行微调。如果可以找到任何这样的模型,那可以是另一个选择。