pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
# 注意需要安裝numpy庫,這是Python中進行矩陣操作與運算庫,類似與MATLAB運算2、圖像處理基本操作
在圖像處理過程中,讀取圖像、顯示圖像、保存圖像是最基本的操作。以下簡單介紹這幾項基本操作,以下操作都基於上圖:ex1.png
2.1 讀取、顯示、寫入圖像# OpenCV提供了函數cv2
# 使用.imread()方法來讀取圖像,支持各種靜態圖像格式,用法如下:
imread(filename, flags=None)
# 返回值是讀取到的圖像數據。如果未讀取到圖像,則返回「None」。
# filename:完整的圖像文件名
# flags:讀取標誌,-1保持原格式不變、0灰度圖像、1 RGB圖像、2、4以任何可能的顏色格式讀取圖像
imshow(winname, mat) # 顯示圖片
# winname 窗口名
# mat 數據矩陣
imwrite(filename, img, params=None) # 寫入圖片
# filename 文件名
# img 圖片數據
# params 參數
waitKey(delay=None) # 窗口等待關閉
# delay 等待延時,單位ms
import cv2
img = cv2.imread("ex1.png") # 原圖
imgGrey = cv2.imread("ex1.png",0) # 灰度圖
cv2.imshow("img",img)
cv2.imshow("imgGrey",imgGrey)
cv2.waitKey() # 等待關閉圖片
cv2.imwrite("Copy.jpg",img)2.2 圖像顯示窗口創建與銷毀
namedWindow(winname, flags=None) # 創建一個窗口
# winname 窗口名
# flags 指定窗口大小模式:cv2.WINDOW_AUTOSIZE:根據圖像自動創建大小
# cv2.WINDOW_NORMAL:窗口大小可調整
# cv2.destoryAllWindows(窗口名) # 刪除任何建立的窗口import cv2
img = cv2.imread("ex1.png")
cv2.namedWindow("win1", cv2.WINDOW_AUTOSIZE) # 創建窗口
cv2.imshow("win1", img) # 在指定窗口顯示,若窗口不存在,自動創建
cv2.waitKey()
cv2.destroyAllWindows()2.3 圖片寬、高、通道數、平均值獲取img.shape 返回圖像高(圖像矩陣的行數)、寬(圖像矩陣的列數)和通道數3個屬性組成的元組
若圖像是非彩色圖,則只返回高和寬組成的元組。
import cv2
img = cv2.imread("ex1.png")
imgGrey = cv2.imread("ex1.png", 0)
print(img.shape)
print(imgGrey.shape)2.4 圖像像素數目和圖像數據類型獲取import cv2
img = cv2.imread("ex1.png")
print(img.size) # 圖像的像素總數目
print(img.dtype) # 圖像數據類型(通常是uint8)2.5 生成指定大小的空圖像import cv2
import numpy as np
img = cv2.imread("ex1.png")
imgZero = np.zeros(img.shape, np.uint8)
imgFix = np.zeros((300, 500, 3), np.uint8) # 第一個是高,第二個是寬
imgFix = np.zeros((300, 500), np.uint8) # 灰度圖2.6 訪問和操作圖像像素# OpenCV中圖像矩陣的順序是B、G、R。可以直接通過坐標位置訪問和操作圖像像素。
# 參照numpy索引與賦值
import cv2
img = cv2.imread("ex1.png")
print(img[100:120, 500:550])
img[100:120, 500:550] = (0, 0, 255)
cv2.imshow("img", img)
cv2.waitKey()# 可以對不同顏色通道進行修改 BGR
# 需要注意的是,由於歷史遺留問題,opencv採用BGR模式,而不是RGB
import cv2
img = cv2.imread("ex1.png")
img[0:100, 100:200, 0] = 255
img[100:200, 200:300, 1] = 255
img[200:300, 300:400, 2] = 255
cv2.imshow("img", img)
cv2.waitKey()2.7 圖像三通道分離和合併# 分離圖像通道可以使用cv2中的split函數,合併使用merge函數。
import cv2
img = cv2.imread("ex1.png")
b, g, r = cv2.split(img)
# b = cv2.split(img)[0]
# g = cv2.split(img)[1]
# r = cv2.split(img)[2]
merged = cv2.merge([b, g, r])
cv2.imshow("Blue", b)
cv2.imshow("Green", g)
cv2.imshow("Red", r)
cv2.imshow("Merged", merged)
cv2.waitKey()2.8 在圖像上輸出文字putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
# img:圖像
# text:要輸出的文本
# org:文字的起點坐標
# fontFace:字體
# fontScale:字體大小
# color:字體顏色
# thickness:字圖加粗import cv2
img = cv2.imread("ex1.png")
cv2.putText(img, "Print some text to img", (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255))
cv2.imshow("img", img)
cv2.waitKey()2.9 圖像縮放resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
# src 縮放的圖片
# dsize 縮放後的尺寸 (高、寬)import cv2
img = cv2.imread("ex1.png")
height, width = img.shape[0:2]
img1 = cv2.resize(img, (width//2, height//2), cv2.INTER_AREA)
# 地板除,像素只能是整數
cv2.imshow('img2', img1)
cv2.waitKey()"cv2.INTER_AREA"是定義的縮放插值方法。共有5種:
1)INTER_NEAREST - 最近鄰插值法
2)INTER_LINEAR - 雙線性插值法(默認)
3)INTER_AREA - 基於局部像素的重採樣(resampling using pixel area relation)。對於圖像抽取(image decimation)來說,這可能是一個更好的方法。但如果是放大圖像時,它和最近鄰法的效果類似。
4)INTER_CUBIC - 基於4x4像素鄰域的3次插值法
5)INTER_LANCZOS4 - 基於8x8像素鄰域的Lanczos插值
為了最好的縮放效果,縮小推薦使用 "cv2.INTER_AREA"; 擴大推薦使用 「cv2.INTER_CUBIC」2.10 圖像遍歷# 遍歷運行太慢,最好使用矩陣操作
import cv2
img = cv2.imread('ex1.png')
height = img.shape[0]
weight = img.shape[1]
channels = img.shape[2]
for row in range(height): # 遍歷高
for col in range(weight): # 遍歷寬
for c in range(channels): # 遍歷各通道
value = img[row, col, c]
img[row, col, c] = 255 - img[row, col, c] # 操作像素
cv2.imshow('result', img)
cv2.waitKey()2.11大津閾值
import cv2
img = cv2.imread('ex1.png', 0) # 按灰度圖讀入
# ret 是自動選擇的大津分割閾值 img_binary 是二值化圖像
ret, img_binary = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU) # 大津閾值
# ret, binary = cv.threshold(img, 100, 255, cv.THRESH_BINARY) # 指定閾值
# cv2.imshow('Source image', img)
cv2.imshow('THRESH_OTSU', img_binary)
cv2.waitKey()