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
      )
  
      guide = [
          [161, 87, 93, 6],
          [91, 182, 97, 154],
          [70, 123, 109, 70],
          [119, 28, 60, 109],
      ]
      guide = (
          torch.tensor(guide, 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.ximgproc.jointBilateralFilter(
      #   guide.squeeze().numpy(),
      #   img.squeeze().numpy(),
      #   kernel_size,
      #   sigma_color,
      #   sigma_distance[0],
      # )
      expected = [
          [0.38221005, 0.5027215, 0.49131155, 0.8937083],
          [0.3976327, 0.55548316, 0.69680846, 0.65291953],
          [0.44903287, 0.65470666, 0.7295845, 0.5840189],
          [0.5867507, 0.3472942, 0.66494286, 0.81431836],
      ]
      expected = torch.tensor(
          expected, device=device, dtype=dtype
      ).view(1, 1, 4, 4)
  
      out = joint_bilateral_blur(
          img, guide, kernel_size, sigma_color, sigma_distance
      )
      self.assert_close(out, expected)
  
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 9 for calling the TestJointBilateralBlur obj's underlying member method code with example usage: obj.test_opencv_grayscale(device, dtype) without return types