def generate_image(self, num_digits=30, noise=None):
        if noise:
            a = np.array(np.random.random_integers(0, 64, (self._height, self._width)), dtype=np.uint8)
        else:
            a = np.zeros((self._height, self._width), dtype=np.uint8)

        im = Image.frombytes('L', (self._width, self._height), a.tobytes())
        canvas = ImageDraw(im)

        for i in range(num_digits):
            import random

            x = random.randint(0, self._width - self._char_size)
            y = random.randint(0, self._height - self._char_size)

            class_index = random.randint(0, self._num_classes - 1)
            ch = str(class_index)

            character_bitmap = self._factory.get_digit_image(ch)
            character_bitmap = character_bitmap.resize(
                (self._char_size, self._char_size)
            )

            canvas.bitmap((x, y), character_bitmap, fill=255)

        return im