Python程式設計:cv2模組對影象處理的基本操作
阿新 • • 發佈:2019-01-03
安裝
pip install opencv-python
CV2實踐所用到的圖片
bug.png
1、簡單讀寫
import cv2
# 讀入影象
img = cv2.imread("source/bug.png")
# 顯示影象
cv2.imshow("bug", img)
cv2.waitKey(0) # 單位毫秒
cv2.destroyWindow("bug")
# 複製影象
new_img = img.copy()
# 儲存影象
cv2.imwrite("bug-new.png", new_img)
顯示如下:
2、圖片翻轉
im = cv2.imread("source/bug.png")
new_img = cv2.flip(im, flipCode=0)
cv2.imwrite("source/bug-flip-0.png", new_img)
Vertical垂直翻轉(沿X軸) flipCode=0
原圖:
翻轉圖:
Horizontal水平翻轉(沿Y軸)flipCode=1
horizontal and vertical 水平和垂直翻轉(沿中心點) flipCode=-1
3、色彩變換
彩色影象轉為灰度影象
im = cv2.imread("source/bug.png")
new_img = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY)
cv2.imwrite("source/bug-gray.png", new_img)
cv2.COLOR_X2Y
其中X,Y = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS
4、給圖片加文字
- 加英文字元
img = cv2.imread("source/bug.png", cv2.IMREAD_COLOR)
# 圖片物件、文字、畫素、字型、字型大小、顏色、字型粗細
new_img = cv2.putText(
img=img,
text="OOXX",
org=(60, 50),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=1,
color=(255, 0, 0),
thickness=2
)
cv2.imwrite("source/bug-text.png", new_img)
- 新增中文字元
opencv自帶的putText函式無法輸出中文字元,需要藉助Pillow
安裝
pip install pillow numpy
程式碼示例
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
# 1、將cv2轉為PIL
img = cv2.imread("source/bug.png")
# cv2和PIL中顏色的hex碼的儲存順序不同
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
pil_img = Image.fromarray(img)
# 2、PIL圖片上列印中文
draw = ImageDraw.Draw(pil_img)
font = ImageFont.truetype(font="華文黑體.ttf", size=20, encoding="utf-8")
draw.text(xy=(50, 20), text="愛我中華", fill=(0, 0, 255), font=font)
# 3、PIL圖片轉cv2
new_img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)
cv2.imwrite("source/bug-text.png", new_img)
Mac本字型路徑,選一個已有的字型
1、/System/Library/Fonts
2、/Library/Fonts
5、繪圖
import numpy as np
import cv2
# 常用顏色值
RED = (0, 0, 255)
GREEN = (0, 255, 0)
BLUE = (255, 0, 0)
np.set_printoptions(threshold='nan')
# 建立一個寬512高512的黑色畫布,RGB(0,0,0)即黑色
img = np.zeros(shape=(512, 512, 3), dtype=np.uint8)
# 畫直線,圖片物件,起始座標(x軸,y軸),結束座標,顏色,寬度
cv2.line(
img=img,
pt1=(0, 0),
pt2=(311, 511),
color=BLUE,
thickness=10
)
# 畫矩形,圖片物件,左上角座標,右下角座標,顏色,寬度
cv2.rectangle(
img=img,
pt1=(30, 166),
pt2=(130, 266),
color=GREEN,
thickness=3
)
# 畫圓形,圖片物件,中心點座標,半徑大小,顏色,寬度
cv2.circle(
img=img,
center=(222, 222),
radius=50,
color=(255.111, 111),
thickness=-1
)
# 畫橢圓形,圖片物件,中心點座標,長短軸,順時針旋轉度數,開始角度(右長軸表0度,上短軸表270度),顏色,寬度
cv2.ellipse(
img=img,
center=(333, 333),
axes=(50, 20),
angle=0,
startAngle=0,
endAngle=150,
color=RED,
thickness=-1
)
# 畫多邊形,指定各個點座標,array必須是int32型別
pts = np.array(
[[10, 5], [20, 30], [70, 20], [50, 10]],
dtype=np.int32
)
# -1表示該緯度靠後面的緯度自動計算出來,實際上是4
pts = pts.reshape((-1, 1, 2,))
# print(pts)
# 畫多條線,False表不閉合,True表示閉合,閉合即多邊形
cv2.polylines(
img=img,
pts=[pts],
isClosed=True,
color=(255, 255, 0),
thickness=5
)
# 新增文字 圖片物件,要寫的內容,左邊距,字的底部到畫布上端的距離,字型,大小,顏色,粗細
cv2.putText(
img=img,
text="OpenCV",
org=(10, 400),
fontFace=cv2.FONT_HERSHEY_SCRIPT_COMPLEX,
fontScale=3.5,
color=(255, 255, 255),
thickness=2
)
cv2.imwrite("picture.jpg", img)
6、影象的表示
圖A
來自:https://www.cnblogs.com/shizhengwen/p/8719062.html
3維陣列
單通道的灰度影象在計算機中的表示:一個8位無符號整形的矩陣
多通道表示 : 第一個維度是高度,第二個維度是高度,第三個維度是通道
表達方式: 高度×寬度×通道數,H×W×C
深度學習: C×H×W (就是把每個通道都單獨表達成一個二維矩陣, 如圖A-c)
OpenCV預設影象表示:BGR
import numpy as np
import cv2
import matplotlib.pyplot as plt
# 矩陣
img = np.array([
[[255, 0, 0], [0, 255, 0], [0, 0, 255]],
[[255, 255, 0], [255, 0, 255], [0, 255, 255]],
[[255, 255, 255], [128, 128, 128], [0, 0, 0]],
], dtype=np.uint8)
# 用matplotlib儲存
plt.imsave('img_pyplot.jpg', img)
# 用OpenCV儲存
cv2.imwrite('img_cv2.jpg', img)
左邊:img_pyplot.jpg
右邊:img_cv2.jpg
參考:
模組cv2的用法