OpenCV Create and Show the Image Correctly
Table of Contents:
- Create a gray image
- Draw primitives
- Create a noisy image
- Read image from URL
- Show image
- Blue apple
- Create a grayscale image from RGB
- Show single channel image
- Convert single channel image to RGB (three channels)
Usually when we think of images we imagine three channel images.
Let’s create the image in Python using just matplotlib.pyplot
and numpy
packages. One great example would be to create a three channel gray image.
Create a gray image
#create gray image 270x474 with 3 channels
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
img = np.empty([270,474, 3], dtype=np.uint8)
img.fill(128) # gray
plt.imshow(img)
plt.show()
print(img.shape)
print(type(img))
In this example we created a 3 channel image and filled it in gray.
Draw primitives
Lines and circles are basic primitives we can add to the image. We use OpenCV library for adding primitives because it works directly on numpy images.
import numpy as np
import cv2
img = np.zeros((270,474, 3), dtype = "uint8")
green = (0, 255, 0)
cv2.line(img, (0, 0), (474, 270), green)
red = (255, 0, 0)
R = 100
(centerX, centerY) = (img.shape[1] // 2, img.shape[0] // 2)
cv2.circle(img, (centerX, centerY), R , red)
plt.imshow(img)
plt.show()
We used matplotlib.pyplot
to show the image.
Create a noisy image
Again we will create the image just using matplotlib.pyplot
and numpy
.
import matplotlib.pyplot as plt
import numpy as np
img = np.random.rand(270,474,3)
plt.imshow(img)
Here we are using the matplotlib.pyplot
method imshow
again.
Read image from URL
Next we will read the image from the URL and save it to the file system.
import requests
url = 'https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Ftse1.mm.bing.net%2Fth%3Fid%3DOIP.MBtx9vFOK2x5CM9Jjx0M5AHaEO%26pid%3DApi&f=1'
response = requests.get(url, allow_redirects=True) # nostream
with open('apple.jpg', 'wb') as handle:
handle.write(response.content)
# saved as C:\Users\dj\apple.jpg
print(handle)
Show image
Now we will just read the apple.jpg image using cv2 Python library.
%matplotlib inline
from matplotlib import pyplot as plt
import cv2
img=cv2.imread(r"apple.jpg")
print(img.shape)
img=img[:,:,::-1]
_ = plt.imshow(img)
Blue apple
If we would not convert the image with img=img[:,:,::-1]
we would get the blue apple.
%matplotlib inline
from matplotlib import pyplot as plt
import cv2
img=cv2.imread(r"apple.jpg")
_ = plt.imshow(img)
Create a grayscale image from RGB
We can just use OpenCV cvtColor
method to create single channel image and then if we combine three of these using OpenCV merge
method we will get the gray apple.
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print(img.shape)
img = cv2.merge([img,img,img])
_ = plt.imshow(img)
Check out this gist for more details.
Show single channel image
%matplotlib inline
from matplotlib import pyplot as plt
import cv2
img=cv2.imread(r"apple.jpg", cv2.IMREAD_GRAYSCALE)
print(img.shape)
_ = plt.imshow(img)
But this does not look gray, because imshow method is using viridis cmap. Let’s use gray cmap.
_ = plt.imshow(img, cmap='gray') # default is viridis
Convert single channel image to RGB (three channels)
%matplotlib inline
from matplotlib import pyplot as plt
import cv2
grayimg=cv2.imread(r"apple.jpg", cv2.IMREAD_GRAYSCALE)
print(grayimg.shape)
img = cv2.cvtColor(grayimg,cv2.COLOR_GRAY2RGB)
print(img.shape)
_ = plt.imshow(img)
…
tags: image & category: python