23

Why is there a difference in the output image when calling the same image using plt.imshow & cv2.imshow()?

Here is my code:

import cv2
import numpy as np
from matplotlib import pyplot as plt

src=cv2.imread('fruits1.jpg') # Source image

plt.subplot(211),plt.imshow(src),plt.title('image')
plt.xticks([]),plt.yticks([])
plt.show()

cv2.imshow('image',src)
cv2.waitKey(0)
cv2.destroyWindow()

Here is the image from plt.imshow:

image output for plt.imshow

and the second one is the original image:

image output from cv2.show

Is there some modification required with the plt.imshow()?

tdy
  • 36,675
  • 19
  • 86
  • 83
Aman Garg
  • 343
  • 1
  • 2
  • 6
  • OpenCV uses BGR channel ordering, but matplotlib uses RGB. So there is a channel reversal ordering between the two needed when going from one to the other. – fmw42 Dec 30 '22 at 22:16

3 Answers3

35

Because OpenCV stores images in BGR order instead of RGB.

Try plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

See here for an example.

laks
  • 366
  • 3
  • 2
3

OpenCV - BGR and Matplotlib - RGB

OpenCV:

https://docs.opencv.org/2.4/doc/tutorials/introduction/display_image/display_image.html

enter image description here

Matplotlib:

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.imshow.html

enter image description here

Cris Luengo
  • 55,762
  • 10
  • 62
  • 120
Adam Merckx
  • 1,122
  • 1
  • 14
  • 31
1

you can either use :

plt.imshow(cv2.cvtColor(image,cv2.COLOR_BGR2RGB))
                        OR
plt.imshow(image[:,:,::-1])  # here we are reversing the channel order
Suman
  • 699
  • 6
  • 5