opencv_1javascript
import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
1 圖像的基本操做 |
1.1 圖像的讀取、顯示和保存 |
讀取圖像:cv2.imread(filename,flags)css
該函數有兩個參數,第一個參數是圖片的地址,第二個參數是讀取圖像的方式(默認值爲1,以RGB格式讀取)html
顯示圖片:cv2.imshow(winname,mat)html5
以窗口的形式顯示圖片,兩個參數,第一個是窗口上顯示的名稱,第二個是圖像在代碼中的表示名稱java
保存圖片:cv2.imwrite(filename,img,params)node
N個參數,第一個是要保存的圖像的名字,如 'Rachel.jpg' ,第二個是也是圖像在代碼中的表示名稱,此外還有圖像的質量等參數,暫且略過python
銷燬所有窗口:cv2.destroyALLWindows()jquery
銷燬特定窗口:cv2.destroyWindow(winname) 括號裏填指定窗口名稱linux
綁定按鍵:cv2.waitKey(delay)android
示例代碼:
按下 s 鍵保存圖片到 png 格式
# image show a window using opencv.
img = cv2.imread('./1.jpeg', 1) # '1' 是RGB, ‘0’是灰度
# cv2.imshow('ysy', img) # 顯示窗口名稱ysy
# k = cv2.waitKey(0) # 等待按鍵,返回按鍵ASCII
'''
if k == ord('s'): # 若按下 s
cv2.imwrite('ysy_gray.png', img)
cv2.destroyAllWindows() # 刪除所有窗口
'''
# image show inline jupyter using matplotlib
# plt.figure(figsize=(15,10)) # 設置畫布大小
plt.figure()
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
1.2 圖像的縮放 |
縮放圖片是很是經常使用的操做,cv2裏面的函數是:cv2.resize
函數原型:cv2.resize(src, dst, dsize, fx=0, fy=0, interpolation=INTER_LINEAR )
fx,fy表示縮放比例,interpolation是縮放時填充的類型,有如下幾種:
INTER_NEAREST(鄰近元素插值法)
INTER_LINEAR(缺省值,雙線性插值)
INTER_AREA(使用象素關係重採樣。當圖像縮小時候,該方法能夠避免波紋出現。當圖像放大時,相似於 CV_INTER_NN 方法)
INTER_CUBIC(立方插值)
示例代碼:
圖片變成原圖的0.5倍的灰度圖
img_resize =cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
# image show inline jupyter using matplotlib
plt.figure() # 設置畫布
plt.imshow(cv2.cvtColor(img_resize, cv2.COLOR_BGR2RGB))
plt.show()
1.3 圖像的翻轉與旋轉 |
圖像翻轉用到的函數是cv2.flip
函數原型:cv2.flip(src, dst, flipCode)
flipCode,翻轉模式,flipCode==0垂直翻轉(沿X軸翻轉),flipCode>0水平翻轉(沿Y軸翻轉),flipCode<0水平垂直翻轉(先沿x軸翻轉,再沿Y軸翻轉,等價於旋轉180°)
# 翻轉
new = img_resize # 原圖
img_new1 = cv2.flip(new, 0)
img_new2 = cv2.flip(new, 1)
img_new3 = cv2.flip(new, -1)
# 建立畫布, 把四個圖畫在一個畫布裏面
plt.figure(figsize=(15,10))
# (1,1)
ax1 = plt.subplot(2, 2, 1)
ax2 = plt.subplot(2, 2, 2)
ax3 = plt.subplot(2, 2, 3)
ax4 = plt.subplot(2, 2, 4)
# 選擇ax1
plt.sca(ax1)
plt.imshow(cv2.cvtColor(img_resize, cv2.COLOR_BGR2RGB))
# 選擇ax2
plt.sca(ax2)
plt.imshow(cv2.cvtColor(img_new1, cv2.COLOR_BGR2RGB))
# 選擇ax3
plt.sca(ax3)
plt.imshow(cv2.cvtColor(img_new2, cv2.COLOR_BGR2RGB))
# 選擇ax4
plt.sca(ax4)
plt.imshow(cv2.cvtColor(img_new3, cv2.COLOR_BGR2RGB))
圖像旋轉用到的函數是cv2.getRotationMatrix2D
函數原型:getRotationMatrix2D(center,angle,scale)
center通常是中心點的座標,用元組表示
angle角度是逆時針旋轉的角度
scale是比例,有放大或縮小圖像的做用
示例代碼:
rows, cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 90, 1)
dst = cv2.warpAffine(img, M, (cols, rows)) # 仿射變化,以後會講
plt.figure() # 設置畫布
plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
plt.show()
1.4 圖像的基本信息 |
import cv2
import requests
import time
from PIL import Image
from io import BytesIO
# set None proxy
import os
os.environ['no_proxy'] = '*'
img = cv2.imread('1.jpeg')
color_img = cv2.imread('1.jpeg', cv2.IMREAD_COLOR)
gray_img = cv2.imread('1.jpeg', cv2.IMREAD_GRAYSCALE)
# 獲取信息:行,列,通道,像素數目,圖像數據類型
print(color_img.shape, color_img.size, color_img.dtype)
print(gray_img.shape, gray_img.size, gray_img.dtype)
# Internet picture
url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1565165195&di=0ae43289971ee5b3cdc36eb9c9612a0a&imgtype=jpg&er=1&src=http%3A%2F%2Fvpic.video.qq.com%2F3388556%2Fx0540ujyh6i_ori_3.jpg"
# get file(of Internet picture)
for i in range(10):
start=time.time()
file = requests.get(url)
img = cv2.imdecode(np.fromstring(file.content, np.uint8), 1) #file.content 是讀取的遠程文件的字節流
print('time',time.time()-start)
#using plt draw picture
plt.figure() # 設置畫布
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
# using PIL.Image to read Internet file of picture
## image = Image.open(BytesIO(file.content))
## image.show()
# using cv2 to read Internet file of picture
color_img = img
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 獲取信息:行,列,通道,像素數目,圖像數據類型
print(color_img.shape, color_img.size, color_img.dtype)
print(gray_img.shape, gray_img.size, gray_img.dtype)
import os
os.environ['no_proxy'] = '*'
print(requests.get("https://www.baidu.com"))
# session method
session = requests.Session()
session.trust_env = False
response = session.get('http://www.stackoverflow.com')
start=time.time()
file = requests.get("https://www.baidu.com/img/bd_logo1.png")
img = cv2.imdecode(np.fromstring(file.content, np.uint8), 1) #file.content 是讀取的遠程文件的字節流
print('time',time.time()-start)
cv2.imshow("1",img)
cv2.waitKeyEx()