Image processing is a branch of computer vision that uses various algorithms to manipulate and analyze digital images. It involves the use of mathematical or statistical operations to modify images for many applications, including and not limited to medical and satellite imagery and digital photography. This article explores the fundamentals of image processing and some of the techniques used in this field.
This article was published as a part of the Data Science Blogathon.
Digital images are broadly made up of pixels, which are tiny boxes representing the color and brightness values at that point in the image. Image processing involves handling these pixels in a desired manner to achieve what is required for the image. Most of the common operations performed on a digital image include filtering, enhancement, restoration, etc.
Filtering is a process of eliminating unwanted noise from an image. It is done by applying a filter that adjusts the image’s pixel values. Based on the type of filter, they can be used for a wide range of applications. They can be designed to remove specific types of noise, such as Gaussian noise, salt-and-pepper noise, or speckle noise. The filters that help in removing the above-mentioned noises include the median filter, the mean filter, and the Gaussian filter.
Enhancement is one process that can improve the quality of an image. It is done by modifying the brightness or contrast of the image. These techniques may be simple, like adjusting the brightness and contrast using a histogram, or more complex, like using algorithms to enhance the edges and textures in an image.
Source: Mathworks.com
Restoration is the process of recovering an image that some noise or other artifacts may degrade. The techniques involve using mathematical methods to estimate the original image from the corrupted version. It is done using techniques such as deconvolution, which is used to get the original image from a blurred version, or denoising, which is used to remove noise from an image.
Source: Mathworks.com
Image preprocessing is quite useful to improve the quality of images and thus boost them for analysis and further processing. Some powerful image preprocessing techniques include noise reduction, contrast enhancement, image resizing, color correction, segmentation, feature extraction, etc. It is an essential step in image analysis that helps enhance the data in images and reduce clutter. As technology continues to advance, image processing will likely become even more important in our daily lives.
Image preprocessing is a vital step when working with image data. The best results can be obtained when preprocessing of images is done according to the application involved. It is used in various domains, as listed below:
The choice of techniques depends on the nature of the image and the application. Here are a few techniques to improve image quality and suitability:
Here are a few image processing techniques that involve grayscaling, thresholding, noise reduction with median and gaussian filters, histogram visualization before and after thresholding, and canny edge detection applied on a sample image.
# Sample downloaded image
import cv2
import matplotlib.pyplot as plt
pic1 = plt.imread('download.jpg')
plt.imshow(pic1)
Source: Dreamstime
#Converting the sample image to grayscale
img = cv2.cvtColor(pic1, cv2.COLOR_BGR2GRAY)
plt.imshow(img,cmap='gray')
Thresholding: Binary threshold output contains only two colors, black and white. It maps all values greater than the threshold to white and less than that to black.
#Thresholding: try playing with the threshold value (144 here) to see the changes
ret, thresh1 = cv2.threshold(img, 140, 255, cv2.THRESH_BINARY)
plt.imshow(thresh1,cmap='gray')
Noise Reduction: It is generally done with filtering according to the nature of the noise. Here, as we don’t know about the nature of noise that may be present, we try applying median and gaussian filters.
#Median filter
img = cv2.cvtColor(pic1, cv2.COLOR_BGR2GRAY)
median = cv2.medianBlur(img,5)
plt.figure(figsize=(16, 16))
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Noisy Image')
plt.subplot(122),
plt.imshow(median,cmap = 'gray')
plt.title('Median filter')
plt.show()
gaussian_blur1 = cv2.GaussianBlur(img,(5,5),2,cv2.BORDER_DEFAULT)
gaussian_blur2 = cv2.GaussianBlur(img,(5,5),7,cv2.BORDER_DEFAULT)
plt.figure(figsize=(20, 20))
plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
plt.title('Noisy Image')
plt.subplot(1,3,2),
plt.imshow(gaussian_blur1,cmap = 'gray')
plt.title('smoothing with Gaussian sigma=2')
plt.subplot(1,3,3),
plt.imshow(gaussian_blur2,cmap = 'gray')
plt.title('smoothing with Gaussian sigma=7')
Otsu’s Thresholding: Here, we don’t specify the threshold value for mapping values to black and white. It uses a histogram to estimate what threshold would work best for the given image and thus is more useful.
#Otsu's thresholding before and after Gaussian filtering
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
plt.imshow(th2,cmap='gray')
plt.imshow(th3,cmap='gray')
Histogram is a visual representation of the number of pixels of each image’s intensity value. The changes in histograms before and after applying thresholding on original and filtered images are shown below.
plt.figure(figsize=(16,16))
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# Otsu's thresholding
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Otsu's thresholding after Gaussian filtering
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# plot all the images and their histograms
images = [img, 0, th1,
img, 0, th2,
blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
'Original Noisy Image','Histogram',"Otsu's Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in range(3):
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()
Canny Edge Detection: It is basically used for edge detection and is built on the Sobel filter. It essentially works upon calculating the image intensity gradient at each pixel of the image, as the gradient is maximum when the color changes quickly in the case of edges.
#Hough Line Transform
dst = cv2.Canny(img, 50, 200, None, 3)
lines = cv2.HoughLines(dst, 1, np.pi / 180, 150, None, 0, 0)
# Draw the lines
if lines is not None:
for i in range(0, len(lines)):
rho = lines[i][0][0]
theta = lines[i][0][1]
a = math.cos(theta)
b = math.sin(theta)
x0 = a * rho
y0 = b * rho
pt1 = (int(x0 + 1000*(-b)), int(y0 + 1000*(a)))
pt2 = (int(x0 - 1000*(-b)), int(y0 - 1000*(a)))
cv2.line(cdst, pt1, pt2, (0,0,255), 3, cv2.LINE_AA)
cdst = cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR)
plt.imshow(cdst)
This article guides you toward the first few steps of image processing. It summarizes some applications that are used in image processing. It is intended to make you familiar with some techniques used in the field and their applications. A few takeaways from the article include:
Explore https://docs.opencv.org for more beautiful techniques to make your life easier for image processing.
The media shown in this article is not owned by Analytics Vidhya and is used at the Author’s discretion.