I am trying to plot an image with its respective histogram side by side with equal proportion using plt.fig()
in Python but I am not getting the desired output. Instead I get the histogram overlapping onto the image.
Any idea as to why this keeps happening?
import pylab as plt
import matplotlib.image as mpimg
import numpy as np
img = np.uint8(mpimg.imread('motherT.png'))
im2 = np.uint8(mpimg.imread('waldo.png'))
# convert to grayscale
# do for individual channels R, G, B, A for nongrayscale images
img = np.uint8((0.2126* img[:,:,0]) + \
np.uint8(0.7152 * img[:,:,1]) +\
np.uint8(0.0722 * img[:,:,2]))
im2 = np.uint8((0.2126* img[:,:,0]) + \
np.uint8(0.7152 * img[:,:,1]) +\
np.uint8(0.0722 * img[:,:,2]))
# show old and new image
# show original image
fig = plt.figure()
plt.imshow(img)
plt.title(' image 1')
plt.set_cmap('gray')
# show original image
fig.add_subplot(221)
plt.title('histogram ')
plt.hist(img,10)
plt.show()
fig = plt.figure()
plt.imshow(im2)
plt.title(' image 2')
plt.set_cmap('gray')
fig.add_subplot(221)
plt.title('histogram')
plt.hist(im2,10)
plt.show()
You appear to be doing this for two images? Subplots would be your best bet. The following shows you how to use them for a 2 x 2
effect:
import pylab as plt
import matplotlib.image as mpimg
import numpy as np
img = np.uint8(mpimg.imread('motherT.png'))
im2 = np.uint8(mpimg.imread('waldo.png'))
# convert to grayscale
# do for individual channels R, G, B, A for nongrayscale images
img = np.uint8((0.2126 * img[:,:,0]) + np.uint8(0.7152 * img[:,:,1]) + np.uint8(0.0722 * img[:,:,2]))
im2 = np.uint8((0.2126 * im2[:,:,0]) + np.uint8(0.7152 * im2[:,:,1]) + np.uint8(0.0722 * im2[:,:,2]))
# show old and new image
# show original image
fig = plt.figure()
# show original image
fig.add_subplot(221)
plt.title(' image 1')
plt.set_cmap('gray')
plt.imshow(img)
fig.add_subplot(222)
plt.title('histogram ')
plt.hist(img,10)
fig.add_subplot(223)
plt.title(' image 2')
plt.set_cmap('gray')
plt.imshow(im2)
fig.add_subplot(224)
plt.title('histogram')
plt.hist(im2,10)
plt.show()
This would give you something like:
Also note, in your original code, your grey scale calculation for im2
was using the image data for img
not im2
.
You might want to turn the axis off for each of your images, to do this you could add plt.axis('off')
before each plt.imshow()
giving you: