Apply object mask to LBP calculation
我看到许多文章将lbp应用于基于纹理的图像分类。我只是想知道关于此技术的三件事,我无法从Google找到明确的答案:
- 该算法如何为周围没有足够邻居像素的图像的边界像素计算lbp。
- 如果我们有八个相邻像素,则中心像素将具有256个图案(如果使用均匀,则为59个)。但是如果我们增加邻居像素的大小(例如8或10),那么图案的数量也会增加,对吗?在这种情况下,它对直方图计算有何影响?
- 我们如何仅计算对象的lbp。特别是,如果要比较图像中的对象,则只需计算对象的lbp和直方图。我已经尝试通过将opencv直方图(支持mask和numpy直方图不支持mask)到lbp输出来实现这个想法,但是它不起作用。关于如何根据掩码过滤lbp数组的任何想法,然后我们都可以找到直方图。
谢谢。
- 边界像素通常会被丢弃(先看看最早提出LBP的研究小组开发的Matlab实现)。在其他实现中(例如,参见Python的scikit-learn),添加了黑色边框。
- P像素的局部邻域会生成2P-bin直方图。如果设置P = 10,则特征向量将具有1024个分量。
- 此玩具示例向您展示了如何从LBP直方图计算中过滤出不需要的图像区域:
1
2
3
4
5
6
7
8
9import numpy as np
from skimage.feature.texture import local_binary_patternP, R = 8, 1
dim = 2**P
img = np.asarray([[5, 5, 5, 5], [5, 99, 100, 5], [5, 5, 5, 5]]], dtype=np.uint8)
mask = img > 5
codes = local_binary_pattern(img, P, R)
hist, _ = np.histogram(codes[mask], bins=np.arange(dim+1), range=(0, dim))演示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32In [97]: img
Out[97]:
array([[ 5, 5, 5, 5],
[ 5, 99, 100, 5],
[ 5, 5, 5, 5]], dtype=uint8)In [98]: codes
Out[98]:
array([[ 193., 241., 241., 112.],
[ 199., 1., 0., 124.],
[ 7., 31., 31., 28.]])In [99]: mask
Out[99]:
array([[False, False, False, False],
[False, True, True, False],
[False, False, False, False]], dtype=bool)In [100]: hist
Out[100]:
array([1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0], dtype=int32)
EDIT
这是一个更现实的示例,如您在注释中所要求的:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import numpy as np
from skimage import io from skimage.feature.texture import local_binary_pattern import matplotlib.pyplot as pltP = 8 R = 1 dim = 2**P h_bins = np.arange(dim+1) h_range = (0, dim)img = io.imread(‘https://i.stack.imgur.com/6ESoP.png’) mask = (img > 0) codes = local_binary_pattern(img, P, R) h_img, _ = np.histogram(codes.ravel(), bins=h_bins, range=h_range) h_masked, _ = np.histogram(codes[mask], bins=h_bins, range=h_range) h_img = h_img/h_img.sum(dtype=np.float) h_masked = h_masked/h_masked.sum(dtype=np.float) f, [[ax0, ax1], [ax2, ax3]] = plt.subplots(2, 2) |
- 嗨,Tonechas。感谢您的明确答复。在第3部分中,演示中的遮罩是布尔类型,而实际上,我们根据图像创建的对象遮罩是整数。它们之间有什么大区别吗?我的意思是,在放入numpy直方图函数之前,是否必须将对象掩码转换为boonlean值?
- 如果可能,您是否有任何类似的真实图像演示。感谢Conchas插槽。
- 掩码值可以是整数或布尔值
- 非常感谢Tonechas。
转载请注明:XAMPP中文组官网 » python教程:将对象掩码应用于LBP计算