Python script to generate dotted text from any image

In the digital age, manipulating images and creating artistic effects has become a common practice. One intriguing effect is the generation of dotted text from an image. This process involves converting the pixels of an image into a pattern of dots, creating an interesting visual representation of the original content.

In this tutorial, we will explore how to create a Python script that can generate dotted text from any given image using PIL, NumPy, and Matplotlib libraries.

Understanding Dotted Text

Dotted text is a technique where the pixels of an image are replaced with dots of varying sizes or densities, forming the shapes and contours of the original content. This effect creates a unique halftone?like pattern that adds an artistic touch to images.

The process involves converting the image to grayscale, analyzing pixel intensities, and placing dots strategically based on these values. Darker areas receive larger or denser dots, while lighter areas get smaller or fewer dots.

Required Libraries

We'll use the following Python libraries ?

  • PIL (Pillow) ? For image loading and manipulation

  • NumPy ? For efficient array operations

  • Matplotlib ? For visualization and display

Install the required libraries ?

pip install Pillow numpy matplotlib

Complete Implementation

Here's a complete script that generates dotted text from any image ?

from PIL import Image, ImageDraw
import numpy as np
import matplotlib.pyplot as plt

def generate_dotted_text(image_path, dot_size=3, spacing=8):
    # Load and convert image to grayscale
    image = Image.open(image_path).convert("L")
    image_array = np.array(image)
    
    # Get image dimensions
    height, width = image_array.shape
    
    # Create new image for dotted output
    dotted_image = Image.new("L", (width, height), 255)
    draw = ImageDraw.Draw(dotted_image)
    
    # Generate dots based on pixel intensity
    for y in range(0, height, spacing):
        for x in range(0, width, spacing):
            if y < height and x < width:
                # Get pixel intensity (0=black, 255=white)
                pixel_value = image_array[y, x]
                
                # Calculate dot radius based on darkness
                # Darker pixels get larger dots
                radius = int((255 - pixel_value) / 255 * dot_size)
                
                if radius > 0:
                    # Draw circle (dot)
                    draw.ellipse([
                        x - radius, y - radius,
                        x + radius, y + radius
                    ], fill=0)
    
    return image, dotted_image

# Example usage with a sample text image
def create_sample_text():
    # Create a simple text image for demonstration
    img = Image.new('L', (300, 100), 255)
    draw = ImageDraw.Draw(img)
    draw.text((50, 30), "PYTHON", fill=0)
    img.save("sample_text.png")
    return "sample_text.png"

# Generate sample and create dotted version
sample_path = create_sample_text()
original, dotted = generate_dotted_text(sample_path, dot_size=4, spacing=6)

# Display results
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
axes[0].imshow(original, cmap="gray")
axes[0].set_title("Original Image")
axes[0].axis("off")
axes[1].imshow(dotted, cmap="gray")
axes[1].set_title("Dotted Text")
axes[1].axis("off")
plt.tight_layout()
plt.show()

# Save the dotted image
dotted.save("dotted_output.png")
print("Dotted text saved as 'dotted_output.png'")

How It Works

The script works by following these key steps ?

  1. Image Loading ? Load the input image and convert to grayscale

  2. Pixel Sampling ? Sample pixels at regular intervals based on the spacing parameter

  3. Intensity Mapping ? Convert pixel intensity to dot size (darker pixels = larger dots)

  4. Dot Placement ? Draw circles at sampled positions with calculated radius

Customization Options

You can customize the dotted text effect by adjusting these parameters ?

# Experiment with different parameters
def generate_custom_dotted_text():
    sample_path = create_sample_text()
    
    # Fine dots with close spacing
    fine_dots = generate_dotted_text(sample_path, dot_size=2, spacing=4)
    
    # Large dots with wide spacing
    coarse_dots = generate_dotted_text(sample_path, dot_size=6, spacing=12)
    
    # Display comparison
    fig, axes = plt.subplots(1, 3, figsize=(15, 5))
    
    axes[0].imshow(fine_dots[0], cmap="gray")
    axes[0].set_title("Original")
    axes[0].axis("off")
    
    axes[1].imshow(fine_dots[1], cmap="gray")
    axes[1].set_title("Fine Dots")
    axes[1].axis("off")
    
    axes[2].imshow(coarse_dots[1], cmap="gray")
    axes[2].set_title("Coarse Dots")
    axes[2].axis("off")
    
    plt.tight_layout()
    plt.show()

generate_custom_dotted_text()

Parameters

Parameter Description Effect
dot_size Maximum radius of dots Larger values create bolder dots
spacing Distance between dot centers Smaller values create denser patterns

Conclusion

This Python script demonstrates how to convert any image into dotted text using PIL, NumPy, and Matplotlib. By adjusting dot size and spacing parameters, you can create various artistic effects ranging from fine halftone patterns to bold dotted representations.

Updated on: 2026-03-27T12:08:02+05:30

699 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements