M. Sc (Information Technology) PSIT2P4 Image Processing
Sr.No. | Name | README |
---|---|---|
Prac1A Prac1B |
1A. Upsampling and downsampling on Image/speech Signal. 1B. Fast Fourier Transform to compute DFT. |
Prac1A Prac1B |
Prac2 | 2. Write program to perform Convolution and correlation of gray scale image. | Prac2 |
Prac3 | 3. Write program to perform the DFT of 4x4 Gray Scale Image. | Prac3 |
Prac4A Prac4B Prac4C Prac4D |
4A. Log and Power-law transformations 4B. Contrast adjustments 4C. Histogram equalization 4D. Thresholding, and halftoning operations |
Prac4A Prac4B Prac4C Prac4D |
Prac5 | 5. Write a program to apply various enhancements on images using image derivatives by implementing Gradient and Laplacian operations. | Prac5 |
Prac6 | 6. Write a program to apply various image enhancement using image derivatives by implementing smoothing, sharpening, and unsharp masking filters for generating suitable images for specific application requirements. | Prac6 |
Prac7 | 7. Write a program to Apply edge detection techniques such as Sobel and Canny to extract meaningful information from the given image samples. | Prac7 |
Prac8 | 8. Write the program to implement various morphological image processing techniques.(EROSION & DIALATION , OPENING & CLOSING) |
Prac8 |
Prac9 | 9. Image Segmentation. | Prac9 |
1A. Upsampling and downsampling on Image/speech Signal.
CODE
# Downsampling
import os
os.sys.path
import cv2
import matplotlib.pyplot as plt
import numpy as np
img1 = cv2.imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/nativeplace.jpg', 0)
[m, n] = img1.shape
print('Original Image Shape:', m, n)
print('Original Image:')
plt.imshow(img1, cmap="gray")
f = 4
img2 = np.zeros((m//f, n//f), dtype=int)
for i in range(0, m, f):
for j in range(0, n, f):
try:
img2[i//f][j//f] = img1[i][j]
except IndexError:
pass
[a, b] = img2.shape
print('Down Sampled Image Shape:', a, b)
print("-----------------------")
print('Down Sampled Image:')
plt.imshow(img2, cmap="gray")
# Upsampling
img3 = np.zeros((m, n), dtype=int)
for i in range(0, m-1, f):
for j in range(0, n-1, f):
try:
img3[i, j] = img2[i//f][j//f]
except IndexError:
pass
for i in range(1, m-(f-1), f):
for j in range(0, n-(f-1)):
img3[i:i+(f-1), j] = img3[i-1, j]
for i in range(0, m-1):
for j in range(1, n-1, f):
img3[i, j:j+(f-1)] = img3[i, j-1]
[c, d] = img3.shape
print('Original Image Shape:', m, n)
print("-----------------------")
print('Down Sampled Image Shape:', a, b)
print("-----------------------")
print('UP Sampled Image Shape:', c, d)
print("-----------------------")
print('Up Sampled Image:')
plt.imshow(img3, cmap="gray")
1B. Fast Fourier Transform to compute DFT.
CODE
import os
os.sys.path
import cv2
import matplotlib.pyplot as plt
import numpy as np
# scipy.stats.signaltonoise() was deprecated in scipy 0.16.0 and removed in 1.0.0.
import numpy as np
def signaltonoise(a, axis=0, ddof=0):
a = np.asanyarray(a)
m = a.mean(axis)
sd = a.std(axis=axis, ddof=ddof)
return np.where(sd == 0, 0, m/sd)
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
im = np.array(Image.open('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/elephant.jpg').convert('L'))
freq = np.fft.fft2(im)
im1 = np.fft.ifft2(freq).real
snr = signaltonoise(im1, axis=None)
print('SNR for the image obtained after reconstruction = ' + str(snr))
assert(np.allclose(im, im1))
plt.figure(figsize=(20, 10))
plt.subplot(121), plt.imshow(im, cmap='gray'), plt.axis('off')
plt.title('Original Image', size=20)
plt.subplot(122), plt.imshow(im1, cmap='gray'), plt.axis('off')
plt.title('Image Obtained after Reconstruction', size=20)
plt.show()
- Write program to perform Convolution and correlation of gray scale image.
CODE
# Import libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/nativeplace.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
fig, ax = plt.subplots(1, figsize=(12,8))
plt.imshow(image)
abc=np.ones((3,3))
kernel = np.ones((3, 3), np.float32) / 9
img = cv2.filter2D(image, -1, kernel)
fig, ax = plt.subplots(1,2,figsize=(10,6))
ax[0].imshow(image)
ax[1].imshow(img)
#Sharpning
kernel = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]])
img = cv2.filter2D(image, -1, kernel)
fig, ax = plt.subplots(1,2,figsize=(10,6))
ax[0].imshow(image)
ax[1].imshow(img)
- Write program to perform the DFT of 4x4 Gray Scale Image.
CODE
#importing packages
import numpy as np
import cv2
from matplotlib import pyplot as plt
#getting the input image and convert to grayscale
img = cv2.imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/Dog.jpg', 0)
# Transform the image to improve the speed in the Fourier transform calculation
rows, cols = img.shape
optimalRows = cv2.getOptimalDFTSize(rows)
optimalCols = cv2.getOptimalDFTSize(cols)
optimalImg = np.zeros((optimalRows, optimalCols))
optimalImg[:rows, :cols] = img
# Calculate the discrete Fourier transform
dft = cv2.dft(np.float32(optimalImg), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# output of CV2.dft() function will be 3-D numpy array, for 2-D Output, 2D DFT as two-part complex and real part.
f_complex = dft_shift[:, :, 0] + 1j * dft_shift[:, :, 1]
f_abs = np.abs(f_complex) + 1 # lie between 1 and 1e6
f_bounded = 20 * np.log(f_abs)
f_img = 255 * f_bounded / np.max(f_bounded)
f_img = f_img.astype(np.uint8)
# Reconstruct the image using the inverse Fourier transform
i_shift = np.fft.ifftshift(dft_shift)
result = cv2.idft(i_shift)
result = cv2.magnitude(result[:, :, 0], result[:, :, 1])
# #Displaying input image, grayscale image, DFT of the Input Image
images = [optimalImg, f_img, result]
imageTitles = ['Input image', ' DFT ', 'Reconstructed image']
for i in range(len(images)):
plt.subplot(1, 3, i + 1)
plt.imshow(images[i], cmap='gray')
plt.title(imageTitles[i])
plt.xticks([])
plt.yticks([])
plt.show()
# for hold the Display until key press
cv2.waitKey()
cv2.destroyAllWindows()
4A. Log and Power-law transformations
CODE
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Open the image.
img = cv2.imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/sample.jpg')
# Apply log transform.
c = 255/(np.log(1 + np.max(img)))
log_transformed = c * np.log(1 + img)
# Specify the data type.
log_transformed = np.array(log_transformed, dtype = np.uint8)
# Save the output.
cv2.imwrite('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/log_transformed.jpg', log_transformed)
plt.imshow(img)
plt.show()
plt.imshow(log_transformed)
plt.show()
import cv2
import numpy as np
# Open the image.
img = cv2.imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/sample.jpg')
plt.imshow(img)
plt.show()
# Trying 4 gamma values.
for gamma in [0.1, 0.5, 1.2, 2.2,5]:
# Apply gamma correction.
gamma_corrected = np.array(255*(img / 255) ** gamma, dtype = 'uint8')
# Save edited images.
cv2.imwrite('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/gamma_transformed'+str(gamma)+'.jpg', gamma_corrected)
plt.imshow(gamma_corrected)
plt.show()
4B. Contrast adjustments
CODE
import numpy as np
from skimage.io import imread
from skimage.color import rgb2gray
from skimage import data, img_as_float, img_as_ubyte, exposure, io, color
from PIL import Image, ImageEnhance, ImageFilter
from scipy import ndimage, misc
import matplotlib.pyplot as pylab
import cv2
def plot_image(image, title=""):
pylab.title(title, size=10)
pylab.imshow(image)
pylab.axis('off')
def plot_hist(r,g,b,title=""):
r,g,b=img_as_ubyte(r),img_as_ubyte(g),img_as_ubyte(b)
pylab.hist(np.array(r).ravel(),bins=256, range=(0,256),color='r',alpha=0.3)
pylab.hist(np.array(g).ravel(),bins=256, range=(0,256),color='g',alpha=0.3)
pylab.hist(np.array(b).ravel(),bins=256, range=(0,256),color='b',alpha=0.3)
pylab.xlabel('Pixel Values', size=20)
pylab.ylabel('Frequency',size=20)
pylab.title(title,size=10)
im=Image.open('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/Dog.jpg')
im_r,im_g,im_b=im.split()
pylab.style.use('ggplot')
pylab.figure(figsize=(15,5))
pylab.subplot(121)
plot_image(im)
pylab.subplot(122)
plot_hist(im_r,im_g,im_b)
pylab.show()
def contrast(c):
return 0 if c<50 else (255 if c>150 else int((255*c-22950)/48))
imc=im.point(contrast)
im_rc,im_gc,im_bc=imc.split()
pylab.style.use('ggplot')
pylab.figure(figsize=(15,5))
pylab.subplot(121)
plot_image(imc)
pylab.subplot(122)
plot_hist(im_rc,im_gc,im_bc)
pylab.yscale('log')
pylab.show()
4C. Histogram equalization
CODE
#Histogram equalization
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/Dog.jpg',0)
hist = cv2.calcHist([img],[0],None,[256],[0,256])
eq = cv2.equalizeHist(img)
cdf = hist.cumsum()
cdfnmhist = cdf * hist.max()/ cdf.max()
histeq = cv2.calcHist([eq],[0],None,[256],[0,256])
cdfeq = histeq.cumsum()
cdfnmhisteq = cdfeq * histeq.max()/ cdf.max()
plt.subplot(221), plt.imshow(img,'gray')
plt.subplot(222), plt.plot(hist), plt.plot(cdfnmhist)
plt.subplot(223), plt.imshow(eq,'gray')
plt.subplot(224), plt.plot(histeq), plt.plot(cdfnmhisteq)
plt.xlim([0,256])
4D. Thresholding, and halftoning operations
CODE
#4D. Thresholding, and halftoning operations
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/sunflower.jpg',0)
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
ret,thresh2 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV)
ret,thresh3 = cv.threshold(img,127,255,cv.THRESH_TRUNC)
ret,thresh4 = cv.threshold(img,127,255,cv.THRESH_TOZERO)
ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray',vmin=0,vmax=255)
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
5.Write a program to apply various enhancements on images using image derivatives by implementing Gradient and Laplacian operations.
CODE
import numpy as np
from scipy import signal, misc, ndimage
from skimage import filters, feature, img_as_float
from skimage.io import imread
from skimage.color import rgb2gray
from PIL import Image, ImageFilter
import matplotlib.pylab as pylab
from skimage.transform import rescale
def plot_image(image, title=""):
pylab.title(title, size=20),
pylab.imshow(image)
pylab.axis('off')
def plot_hist(r,g,b,title=""):
r,g,b=img_as_ubyte(r),img_as_ubyte(g),img_as_ubyte(b)
pylab.hist(np.array(r).ravel(),bins=256, range=(0,256),color='r',alpha=0.3)
pylab.hist(np.array(g).ravel(),bins=256, range=(0,256),color='g',alpha=0.3)
pylab.hist(np.array(b).ravel(),bins=256, range=(0,256),color='b',alpha=0.3)
pylab.xlabel('Pixel Values', size=20)
pylab.ylabel('Frequency',size=20)
pylab.title(title,size=10)
ker_x=[[-1,1]]
ker_y=[[-1],[1]]
im=rgb2gray(imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/sunflower.jpg'))
im_x=signal.convolve2d(im,ker_x,mode='same')
im_y=signal.convolve2d(im,ker_y,mode='same')
im_mag=np.sqrt(im_x**2+im_y**2)
im_dir=np.arctan(im_y/im_x)
pylab.gray()
pylab.figure(figsize=(30,20))
pylab.subplot(231)
plot_image(im,'Original')
pylab.subplot(232)
plot_image(im_x,'Gradian_x')
pylab.subplot(233)
plot_image(im_y,'Grad+y')
pylab.subplot(234)
plot_image(im_mag,'||grad||')
pylab.subplot(235)
plot_image(im_dir, r'$\theta$')
pylab.subplot(236)
pylab.plot(range(im.shape[1]), im[0,:], 'b-', label=r'$f(x,y)|_{x=0}$', linewidth=5)
pylab.plot(range(im.shape[1]), im_x[0,:], 'r-', label=r'$grad_x (f(x,y))|_{x=0}$')
pylab.title(r'$grad_x (f(x,y))|_{x=0}$',size=30)
pylab.legend(prop={'size':20})
pylab.show()
#LAPLACIAN
ker_laplacian=[[0,-1,0],
[-1,4,-1],
[0,-1,0]]
im=rgb2gray(imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/sunflower.jpg'))
im1=np.clip(signal.convolve2d(im, ker_laplacian, mode='same'),0,1)
pylab.gray()
pylab.figure(figsize=(20,10))
pylab.subplot(121)
plot_image(im, 'Original')
pylab.subplot(122)
plot_image(im1,'laplacian Convolved')
pylab.show()
6.Write a program to apply various image enhancement using image derivatives by implementing smoothing, sharpening, and unsharp masking filters for generating suitable images for specific application requirements.
CODE
import numpy as np
from scipy import signal, misc, ndimage
from skimage import filters, feature, img_as_float
from skimage.io import imread
from skimage.color import rgb2gray
from PIL import Image, ImageFilter
import matplotlib.pylab as pylab
from skimage.transform import rescale
def plot_hist(r,g,b,title=""):
r,g,b=img_as_ubyte(r),img_as_ubyte(g),img_as_ubyte(b)
pylab.hist(np.array(r).ravel(),bins=256, range=(0,256),color='r',alpha=0.3)
pylab.hist(np.array(g).ravel(),bins=256, range=(0,256),color='g',alpha=0.3)
pylab.hist(np.array(b).ravel(),bins=256, range=(0,256),color='b',alpha=0.3)
pylab.xlabel('Pixel Values', size=20)
pylab.ylabel('Frequency',size=20)
pylab.title(title,size=10)
def plot_image(image, title=""):
pylab.title(title, size=10)
pylab.imshow(image)
pylab.axis('off')
# sharpening of images
from skimage.filters import laplace
im=rgb2gray(imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/sunflower.jpg'))
im1=np.clip(laplace(im)+im,0,1)
pylab.figure(figsize=(10,15))
pylab.subplot(121), plot_image(im, 'Original Image')
pylab.subplot(122), plot_image(im1,'Sharpened Image')
pylab.tight_layout()
pylab.show()
7.Write a program to Apply edge detection techniques such as Sobel and Canny to extract meaningful information from the given image samples.
CODE
import numpy as np
from scipy import signal, misc, ndimage
from skimage import filters, feature, img_as_float
from skimage.io import imread
from skimage.color import rgb2gray
from PIL import Image, ImageFilter
import matplotlib.pylab as pylab
from skimage.transform import rescale
def plot_image(image, title=""):
pylab.title(title, size=10)
pylab.imshow(image)
pylab.axis('off')
def plot_hist(r,g,b,title=""):
r,g,b=img_as_ubyte(r),img_as_ubyte(g),img_as_ubyte(b)
pylab.hist(np.array(r).ravel(),bins=256, range=(0,256),color='r',alpha=0.3)
pylab.hist(np.array(g).ravel(),bins=256, range=(0,256),color='g',alpha=0.3)
pylab.hist(np.array(b).ravel(),bins=256, range=(0,256),color='b',alpha=0.3)
pylab.xlabel('Pixel Values', size=20)
pylab.ylabel('Frequency',size=20)
pylab.title(title,size=10)
# Edge Detectors with scikit-image-Prewitt, roberts, sobel, scharr, laplace
im=Image.open('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/sunflower.jpg').convert('L')
im = img_as_float(im) # convert to floating point dtype
pylab.gray()
pylab.figure(figsize=(15,15))
pylab.subplot(3,2,1), plot_image(im,'Original Image')
edges=filters.roberts(im)
pylab.subplot(3,2,2), plot_image(edges,'Roberts')
edges=filters.scharr(im)
pylab.subplot(3,2,3), plot_image(edges,'Scharr')
edges=filters.sobel(im)
pylab.subplot(3,2,4), plot_image(edges,'Sobel')
edges=filters.prewitt(im)
pylab.subplot(3,2,5), plot_image(edges,'Prewitt')
edges=np.clip(filters.laplace(im), 0,1)
pylab.subplot(3,2,6), plot_image(edges,'Laplace')
pylab.subplots_adjust(wspace=0.1,hspace=0.1)
pylab.show()
#SOBEL
im = Image.open('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/sunflower.jpg').convert('L')
im_array = np.array(im)
pylab.gray()
pylab.figure(figsize=(15,15))
pylab.subplot(2,2,1), plot_image(im,'Original')
pylab.subplot(2,2,2)
edges_x=filters.sobel_h(im_array)
plot_image(np.clip(edges_x,0,1),'sobel_x')
pylab.subplot(2,2,3)
edges_y=filters.sobel_v(im_array)
plot_image(np.clip(edges_y,0,1),'Sobel_y')
pylab.subplot(2,2,4)
edges=filters.sobel(im_array)
plot_image(np.clip(edges,0,1),'Sobel')
pylab.subplots_adjust(wspace=0.1,hspace=0.1)
pylab.show()
#CANNY
import matplotlib.pyplot as plt
from scipy import ndimage as ndi
from skimage.util import random_noise
from skimage import feature
# Generate noisy image of a square
image = np.zeros((128, 128), dtype=float)
image[32:-32, 32:-32] = 1
image = ndi.rotate(image, 15, mode='constant')
image = ndi.gaussian_filter(image, 4)
image = random_noise(image, mode='speckle', mean=0.05)
# Compute the Canny filter for two values of sigma
edges1 = feature.canny(image)
edges2 = feature.canny(image, sigma=3)
# display results
fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(8, 3))
ax[0].imshow(image, cmap='gray')
ax[0].set_title('noisy image', fontsize=10)
ax[1].imshow(edges1, cmap='gray')
ax[1].set_title(r'Canny filter, $\sigma=1$', fontsize=10)
ax[2].imshow(edges2, cmap='gray')
ax[2].set_title(r'Canny filter, $\sigma=3$', fontsize=10)
for a in ax:
a.axis('off')
fig.tight_layout()
plt.show()
- Write the program to implement various morphological image processing techniques.
(EROSION & DIALATION , OPENING & CLOSING)
CODE
import cv2
import numpy as np
from matplotlib import pyplot as plt
# For colab
# from google.colab.patches import cv2_imshow
%matplotlib inline
from matplotlib import pyplot as plt
img = cv2.imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/411525.jpg', 0)
ret, bw_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# converting to its binary form
bw = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
kernel = np.ones((5, 5), np.uint8)
img_erosion = cv2.erode(img, kernel,iterations=1)
img_dilation = cv2.dilate(img, kernel,iterations=1)
plt.figure(figsize=(5,5))
plt.imshow(img,cmap="gray")
plt.axis('off')
plt.title("ORIGINAL IMAGE")
plt.show()
plt.figure(figsize=(5,5))
plt.imshow(img_erosion,)
plt.axis('off')
plt.title("EROSION")
plt.show()
plt.figure(figsize=(5,5))
plt.imshow(img_dilation,cmap="gray")
plt.axis('off')
plt.title("DILATION")
plt.show()
cv2.waitKey(0)
#Image opening and closing
from skimage.morphology import binary_opening, binary_closing, binary_erosion, binary_dilation, disk
from skimage.color import rgb2gray
from skimage.io import imread
from PIL import Image, ImageFilter
import matplotlib.pylab as pylab
from skimage.transform import rescale
import numpy as np
from scipy import signal, misc, ndimage
from skimage import filters, feature, img_as_float
def plot_image(image, title=""):
pylab.title(title, size=10)
pylab.imshow(image)
pylab.axis('off')
im = rgb2gray(imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/circles1.jpg'))
im[im <= 0.5] = 0
im[im > 0.5] = 1
pylab.gray()
pylab.figure(figsize=(20,10))
pylab.subplot(1,3,1), plot_image(im, 'original')
im1 = binary_opening(im, disk(6))
pylab.subplot(1,3,2), plot_image(im1, 'opening with disk size ' + str(10))
im1 = binary_closing(im, disk(6))
pylab.subplot(1,3,3), plot_image(im1, 'closing with disk size ' + str(6))
pylab.show()
- Image Segmentation.
CODE
#Loading original image
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('F:/GitHub/Practical_BscIT_MscIT_Ninad/MscIT/Semester 2/ImageProcessing/Dataset/Original_img_segmentation.png')
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.figure(figsize=(8,8))
plt.imshow(img,cmap="gray")
plt.axis('off')
plt.title("Original Image")
plt.show()
#Converting to gray scale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.figure(figsize=(8,8))
plt.imshow(gray,cmap="gray")
plt.axis('off')
plt.title("GrayScale Image")
plt.show()
#Converting to binary inverted image
ret, thresh = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY_INV +cv2.THRESH_OTSU)
plt.figure(figsize=(8,8))
plt.imshow(thresh,cmap="gray")
plt.axis('off')
plt.title("Threshold Image")
plt.show()
#Segmenting the images
kernel = np.ones((3, 3), np.uint8)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE,kernel, iterations = 15)
bg = cv2.dilate(closing, kernel, iterations = 1)
dist_transform = cv2.distanceTransform(closing, cv2.DIST_L2, 0)
ret, fg = cv2.threshold(dist_transform, 0.02*dist_transform.max(), 255, 0)
#cv2.imshow('image', fg)
plt.figure(figsize=(8,8))
plt.imshow(fg,cmap="gray")
plt.axis('off')
plt.title("Segmented Image")
plt.show()
#Final code
plt.figure(figsize=(10,10))
plt.subplot(2,2,1)
plt.axis('off')
plt.title("Original Image")
plt.imshow(img,cmap="gray")
plt.subplot(2,2,2)
plt.imshow(gray,cmap="gray")
plt.axis('off')
plt.title("GrayScale Image")
plt.subplot(2,2,3)
plt.imshow(thresh,cmap="gray")
plt.axis('off')
plt.title("Threshold Image")
plt.subplot(2,2,4)
plt.imshow(fg,cmap="gray")
plt.axis('off')
plt.title("Segmented Image")
plt.show()