我正在尝试使用KNN方法根据人脸照片将人们分类为种族。我在纯白色背景上有一个面部数据集[255,255,255]。
作为Feed输入,我使用的是颜色直方图的值。有人告诉我应该从直方图中删除背景颜色,以提高KNN的性能。
问题:当我从照片中创建一个忽略背景的蒙版时,直方图不会改变一点点。
问题:我对色彩理论不太了解,纯白色会对色彩直方图的形状产生影响吗?当我使用仅居中的常规遮罩(如下图所示)时,直方图会发生变化。
这是我从图片构建的面具,忽略了背景
用于测试蒙版应用正确性的简单蒙版
直方图计数的源图像
这是我从图片中得到的直方图,没有任何遮罩,也是我构造的遮罩,也忽略了白色。
这是我使用简单的蒙版从裁剪图片中获得的直方图。直方图变化,因此我想我的直方图计数方法是正确的。
直方图计数代码:
# loop over the image channels
for (chan, color) in zip(channels, colors):
# create a histogram for the current channel and
# concatenate the resulting histograms for each channel
hist_full = opencv.calcHist([chan], [0], mask, [bin_amount], [0, bin_amount])
# plot the histogram
plt.plot(hist_full, color=color)
plt.xlim([0, bin_amount])
plt.show()
创建面具的代码:
mask = np.zeros(image.shape[:2], np.uint8)
# simple mask option
# mask[75:175, 75:175] = 255
# create a mask to ignore white background in the histogram
for row in range(0, len(image)):
for col in range(0, len(image[0])):
if (image[row][col] != np.asarray(prop.background)).all():
try:
mask[row][col] = 255
except IndexError:
print(col)
答案 0 :(得分:3)
请参阅:http://docs.opencv.org/2.4/modules/imgproc/doc/histograms.html
重要部分:
Python:cv2.calcHist(images,channels,mask,histSize,ranges [,hist [,accumulate]])→hist
参数:...... ranges - 每个维度中直方图bin边界的dims数组的数组。当直方图是均匀的(均匀=真)时,则对于每个维度i,足以指定第0个直方图区间的下部(包括)边界L_0和上部(不包括)边界U _ {\ texttt {histSize} [ i] -1}表示最后一个直方图bin histSize [i] -1。
尝试更改代码的这一部分
hist_full = opencv.calcHist([chan], [0], mask, [bin_amount], [0, bin_amount])
如下
hist_full = opencv.calcHist([chan], [0], mask, [bin_amount], [0, 256])
您需要在图片中指定实际值的范围(不包括上边界)。 最有可能的是,现在您只计算值0-63并忽略直方图中的64-255。