5

Tôi đang sử dụng hàm local_binary_pattern trong gói hình ảnh scikit. Tôi muốn tính toán xoay bất biến LBP thống nhất 8 người hàng xóm trong bán kính 1. Đây là mã Python tôi:Tại sao hàm local_binary_pattern trong scikit-image cung cấp cùng một giá trị cho các mẫu khác nhau

import numpy as np 
from skimage.feature import local_binary_pattern 

image = np.array([[150, 137, 137, 146, 146, 148], 
        [145, 144, 144, 144, 142, 144], 
        [149, 144, 144, 143, 153, 147], 
        [145, 144, 147, 150, 145, 150], 
        [146, 146, 139, 148, 144, 148], 
        [129, 139, 142, 150, 146, 140]]).astype(np.uint8) 

lbp = local_binary_pattern(image, 8, 1, "uniform") 

print "image =" 
print image 
print "lbp =" 
print lbp 

Và đây là sản phẩm

image = 
[[150 137 137 146 146 148] 
[145 144 144 144 142 144] 
[149 144 144 143 153 147] 
[145 144 147 150 145 150] 
[146 146 139 148 144 148] 
[129 139 142 150 146 140]] 
lbp = 
[[ 0. 5. 5. 1. 9. 0.] 
[ 9. 6. 9. 9. 8. 9.] 
[ 0. 8. 6. 8. 0. 3.] 
[ 9. 7. 1. 0. 7. 0.] 
[ 1. 1. 8. 9. 7. 1.] 
[ 3. 4. 9. 0. 2. 3.]] 

gì confuses me là một số giá trị tương tự trong lbp không tương ứng với cùng một mẫu đồng nhất. Ví dụ, lbp[1,1]lbp[2,2] đều 6. Nhưng LBP của image[1,1]

1 0 0 
1 x 1 
1 1 1 

LBP của image[2,2]

1 1 1 
1 x 0 
1 1 1 

nơi dựa trên các giá trị trong lbp, tôi giả sử các local_binary_pattern chức năng sử dụng 'hơn hoặc bằng 'để so sánh với hàng xóm.

LBP của image[1,1]image[2,2] đều đồng đều. Nhưng làm thế nào có thể image[1,1]image[2,2] có cùng giá trị LBP?

Trả lời

3

LBP bất biến quay không sử dụng giá trị pixel của hàng xóm trực tiếp, mà là giá trị nội suy trên một vòng tròn (đối với phép bất biến quay). Xem https://github.com/scikit-image/scikit-image/blob/master/skimage/feature/_texture.pyx#L156

Cũng xem giấy LBP gốc http://vision.stanford.edu/teaching/cs231b_spring1415/papers/lbp.pdf, đề cập đến "Giá trị màu xám của hàng xóm không rơi chính xác ở giữa pixel được ước tính bằng nội suy."

+0

Cảm ơn rất nhiều cho câu trả lời của bạn. Nhưng theo hình 1 trong bài báo, không nên 8 người hàng xóm trong bán kính 1 là 8 điểm ảnh lân cận? – Peter

+0

Các vị trí của các điểm bán kính 1 thực sự rơi vào bên trong 8 hàng xóm, nhưng không phải ở trung tâm của các điểm ảnh cho các hàng xóm chéo, do đó cần phải nội suy. –

+0

Ah, tôi hiểu rồi. Rất cảm ơn cho câu trả lời của bạn! – Peter

3

Để cải thiện độ bền khi xoay vòng mô tả LBP, vùng lân cận hình vuông được thay thế bằng hình tròn. Trong một khu vực hình tròn được tạo thành bởi 8 điểm ảnh, bốn hàng xóm trên các đường chéo không trùng với các trung tâm pixel. Các giá trị cường độ của những người hàng xóm thường được tính toán thông qua nội suy song tuyến. Hình dưới đây giải thích lý do tại sao trong hình ảnh mẫu của bạn một số mẫu LBP khác với mẫu LBP 8,1.

square and circular neighbourhoods

w_cen = (1-1/np.sqrt(2))**2 # Weights 
w_diag = (1/np.sqrt(2))**2 
w_orto = (1-1/np.sqrt(2))*(1/np.sqrt(2)) 

def bilinear_interpoplation(i_cen, i_diag, i_hor, i_ver): 
    return i_cen*w_cen + i_diag*w_diag + i_hor*w_orto + i_ver*w_orto 

def circular_neighbourhood(x): 
    [I7, I6, I5] = x[0, :] 
    [I0, Ic, I4] = x[1, :] 
    [I1, I2, I3] = x[2, :] 
    I7i = bilinear_interpolation(Ic, I7, I0, I6) 
    I5i = bilinear_interpolation(Ic, I5, I4, I6) 
    I3i = bilinear_interpolation(Ic, I3, I4, I2) 
    I1i = bilinear_interpolation(Ic, I1, I0, I2) 
    interpolated = np.array([[I7i, I6, I5i], 
          [ I0, Ic, I4], 
          [I1i, I2, I3i]]) 
    return interpolated 

def binary_pattern(x): 
    return np.where(x >= x[1, 1], 1, 0) 

def display_lbps(patch): 
    interpolated = circular_neighbourhood(patch) 
    print('Patch =') 
    print(patch) 
    print('LBP of patch =') 
    print(binary_pattern(patch)) 
    print('Interpolated patch =') 
    print(interpolated) 
    print('LBP of interpolated patch =') 
    print(binary_pattern(interpolated)) 

display_lbps(image[0:3, 0:3]) 
display_lbps(image[1:4, 1:4]) 
Các vấn đề liên quan