code: def test_opencv_grayscale(self, device, dtype):
      img = [
          [95, 130, 108, 228],
          [98, 142, 187, 166],
          [114, 166, 190, 141],
          [150, 83, 174, 216],
      ]
      img = (
          torch.tensor(img, device=device, dtype=dtype).view(1, 1, 4, 4)
          / 255
      )
  
      kernel_size = 5
      sigma_color = 0.1
      sigma_distance = (0.5, 0.5)
  
      # Expected output generated with OpenCV:
      # import cv2
      # expected = cv2.bilateralFilter(img[0, 0].numpy(), 5, 0.1, 0.5)
      expected = [
          [0.38708255, 0.5060622, 0.43372786, 0.8876763],
          [0.39813757, 0.55695623, 0.72320986, 0.6593296],
          [0.4527661, 0.6484203, 0.7295754, 0.5705908],
          [0.5774919, 0.32919288, 0.6949335, 0.83184093],
      ]
      expected = torch.tensor(
          expected, device=device, dtype=dtype
      ).view(1, 1, 4, 4)
  
      out = bilateral_blur(
          img, kernel_size, sigma_color, sigma_distance
      )
      self.assert_close(out, expected, rtol=1e-2, atol=1e-2)
  
imports: import pytest
  import torch
  from kornia.filters import BilateralBlur, JointBilateralBlur, bilateral_blur, joint_bilateral_blur
  from kornia.testing import BaseTester, tensor_to_gradcheck_var
label_desc: Use image node_id 8 for calling the TestBilateralBlur obj's underlying member method code with example usage: obj.test_opencv_grayscale(device, dtype) without return types