5 Best Ways to Change the Contrast and Brightness of an Image Using OpenCV in Python

πŸ’‘ Problem Formulation: You have an image in your Python application, and you wish to adjust its brightness and contrast for better clarity or aesthetic purposes. The input is an image, and the desired output is a new image where the contrast and brightness have been modified according to your specifications. This article will guide you through various methods to accomplish this using the OpenCV library in Python.

Method 1: Directly Adjusting Pixel Values

One straightforward approach to altering the contrast and brightness of an image is by directly manipulating its pixel values. In OpenCV and Python, this is done by iterating over each pixel and applying the transformation new_image = alpha * original_image + beta. Here, alpha is the factor that controls contrast, and beta is the value that adjusts brightness.

Here’s an example:

import cv2
import numpy as np

# Load the image
image = cv2.imread('input.jpg')
alpha = 1.5 # Contrast control
beta = 50   # Brightness control

adjusted = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)
cv2.imwrite('adjusted.jpg', adjusted)

Output: This will save a new image ‘adjusted.jpg’ with increased contrast and brightness.

This code snippet first imports the required libraries, loads an image from disk, and then applies the contrast and brightness transformations using the convertScaleAbs function, which scales, calculates absolute values, and converts the result to 8-bit. The resultant image is then saved to disk. Although this method is simple and effective, it may not be suitable for real-time applications due to its potentially high computational cost.

Method 2: Using the addWeighted Function

The addWeighted function provided by OpenCV is an efficient way to change the contrast and brightness of an image as it performs the operation dst(i)=saturate(src1(i)βˆ—alpha+src2(i)βˆ—beta+gamma). For brightness and contrast adjustment, src1 is the original image, src2 is a zero array, alpha stands for contrast control, and gamma for brightness.

Here’s an example:

import cv2
import numpy as np

# Load the image
image = cv2.imread('input.jpg')
alpha = 2.0 # Contrast control (1.0-3.0)
gamma = 50  # Brightness control (0-100)

adjusted = cv2.addWeighted(image, alpha, np.zeros(image.shape, image.dtype), 0, gamma)
cv2.imwrite('adjusted.jpg', adjusted)

Output: A new image ‘adjusted.jpg’ with modified contrast and brightness is saved.

This code snippet employs cv2.addWeighted to adjust the image’s contrast and brightness efficiently by merging the scaled original image with a zero array. The result is an image with enhanced contrast and brightness, written to the file system. This method is faster than the first one, making it more suitable for real-time processing.

Method 3: Histogram Equalization for Contrast Adjustment

Another method to adjust the contrast is using histogram equalization, which redistributes the image’s intensity values to span a wider range. This can be particularly useful in enhancing the contrast of images. OpenCV provides the equalizeHist function for this purpose. Note that brightness is not directly affected by this method.

Here’s an example:

import cv2

# Convert to grayscale
gray_image = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)
# Apply histogram equalization
equalized_image = cv2.equalizeHist(gray_image)
cv2.imwrite('equalized.jpg', equalized_image)

Output: A grayscale image ‘equalized.jpg’ with enhanced contrast is saved.

This code loads the image in grayscale mode and applies the equalizeHist function to equalize its histogram, thereby improving the contrast of the image. Although this method is effective for contrast enhancement, it is limited to grayscale images and does not address brightness adjustment.

Method 4: Adaptive Histogram Equalization (CLAHE)

Contrast Limited Adaptive Histogram Equalization (CLAHE) is an advanced form of histogram equalization which segments the image into tiles and applies histogram equalization to each one. This avoids the issue of over-amplifying noise which can occur in regular histogram equalization and results in better contrast across localized regions of the image.

Here’s an example:

import cv2

# Convert to grayscale
gray_image = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)
# Create a CLAHE object
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
# Apply CLAHE
equalized_clahe_image = clahe.apply(gray_image)
cv2.imwrite('clahe_equalized.jpg', equalized_clahe_image)

Output: An image ‘clahe_equalized.jpg’ with localized contrast enhancement is saved.

By creating a CLAHE object with specified parameters and applying it to a grayscale image, this method allows for more specific contrast adjustments than global histogram equalization. However, as with the regular histogram equalization, it is limited to grayscale images and does not adjust brightness.

Bonus One-Liner Method 5: Lambda Function with convertScaleAbs

For a quick one-liner contrast and brightness adjustment, the convertScaleAbs function can be used with a lambda function. This method is simple and concise but offers less flexibility than the preceding methods.

Here’s an example:

import cv2

# Load the image
image = cv2.imread('input.jpg')
# One-liner to adjust contrast (1.5) and brightness (50)
cv2.imwrite('quick_adjusted.jpg', cv2.convertScaleAbs(image, alpha=1.5, beta=50))

Output: A quickly adjusted image ‘quick_adjusted.jpg’ is saved with the specified contrast and brightness.

This one-liner code effectively readjusts the contrast and brightness of an image using Python’s lambda capabilities in conjunction with OpenCV’s convertScaleAbs function. It’s a shorthand for the process described in Method 1.

Summary/Discussion

  • Method 1: Direct Pixel Adjustment. Iterative and flexible. May be slower for large images.
  • Method 2: addWeighted Function. Fast and efficient. Works well for real-time applications.
  • Method 3: Histogram Equalization. Excellent for contrast enhancement. Does not change brightness and limited to grayscale images.
  • Method 4: CLAHE. Provides localized contrast enhancement. Limited to grayscale and no brightness adjustment.
  • Method 5: Lambda with convertScaleAbs. Quick and efficient. Less customizable than other methods.