【python-opencv】opencv基礎操做之一

opencv_1javascript

 

 

In [1]:
import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
 
1 圖像的基本操做
Python的版本是Python3.6,openCV使用的是cv2
 
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 格式

In [2]:
# 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() # 刪除所有窗口
'''
Out[2]:
"\nif k == ord('s'): # 若按下 s\n    cv2.imwrite('ysy_gray.png', img)\n    cv2.destroyAllWindows() # 刪除所有窗口\n"
In [3]:
# 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倍的灰度圖

In [4]:
img_resize =cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
In [5]:
# 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°)

In [6]:
# 翻轉
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))
Out[6]:
<matplotlib.image.AxesImage at 0x7f0d483ac7b8>
 
 

圖像旋轉用到的函數是cv2.getRotationMatrix2D

函數原型:getRotationMatrix2D(center,angle,scale)

center通常是中心點的座標,用元組表示

angle角度是逆時針旋轉的角度

scale是比例,有放大或縮小圖像的做用

示例代碼:

In [7]:
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 圖像的基本信息
In [8]:
import cv2
import requests
import time
from PIL import Image
from io import BytesIO

# set None proxy
import os
os.environ['no_proxy'] = '*' 
In [9]:
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)
 
(509, 640, 3) 977280 uint8
(509, 640) 325760 uint8
In [10]:
# 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)
 
time 0.03805685043334961
time 0.05959320068359375
time 0.057103633880615234
time 0.04566621780395508
time 0.044306039810180664
time 0.0460968017578125
time 0.03691911697387695
time 0.03940176963806152
time 0.03730368614196777
time 0.04784965515136719
 
 
(360, 640, 3) 691200 uint8
(360, 640) 230400 uint8
In [11]:
import os
os.environ['no_proxy'] = '*' 
print(requests.get("https://www.baidu.com"))  
 
<Response [200]>
In [ ]:
# session method
session = requests.Session()
session.trust_env = False
response = session.get('http://www.stackoverflow.com')
In [ ]:
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()
 
time 0.18430542945861816
In [ ]:
相關文章
相關標籤/搜索