code: def test_multiplicative_noise_grayscale(image):
      m = 0.5
      aug = A.MultiplicativeNoise(m, p=1)
      result = aug(image=image)["image"]
      image = F.clip(
          image * m, image.dtype, F.MAX_VALUES_BY_DTYPE[image.dtype]
      )
      assert np.allclose(image, result)
  
      aug = A.MultiplicativeNoise(elementwise=True, p=1)
      params = aug.get_params_dependent_on_targets({"image": image})
      mul = params["multiplier"]
      assert mul.shape == image.shape
      result = aug.apply(image, mul)
      dtype = image.dtype
      image = image.astype(np.float32) * mul
      image = F.clip(image, dtype, F.MAX_VALUES_BY_DTYPE[dtype])
      assert np.allclose(image, result)
  
imports: import random
  from functools import partial
  import cv2
  import numpy
  import pytest
  import albumentations
  import albumentations.augmentations.functional
  import albumentations.augmentations.geometric.functional
  from albumentations.augmentations.blur.functional import gaussian_blur
  from .utils import get_dual_transforms, get_image_only_transforms, get_transforms
label_desc: Use image node_id 26 for calling a global function with example usage: test_multiplicative_noise_grayscale(image) without return types