Open CV圖像基本操作
- 一、處理單個像素值
- 訪問像素值
- 修改像素值
- 二、處理單個ROI區域(自選區域)
- 提取 ROI
- 修改 ROI
- 三、 處理圖像通道
- 通道分離
- 通道合并
- 四、處理整體
- 圖像縮放
- 圖像旋轉
- 圖像平移
- 圖像翻轉
一、處理單個像素值
圖像是由像素組成的矩陣,每個像素都有一個或多個值,表示顏色或灰度。在灰度圖像中,每個像素只有一個值,表示灰度強度;在彩色圖像中,每個像素通常有三個值,分別表示紅色、綠色和藍色(RGB)通道的強度。
訪問像素值
假設我們有一個灰度圖像 img,可以通過 img[y, x] 來訪問位于 (x, y) 位置的像素值。對于彩色圖像,可以通過 img[y, x, c] 來訪問特定通道 c 的像素值,其中 c 為 0(藍色)、1(綠色)或 2(紅色)。
實例
import cv2# 讀取圖像
img = cv2.imread('image.jpg')# 訪問像素值
pixel_value = img[100, 150] # 訪問 (150, 100) 位置的像素值
print(pixel_value)
修改像素值
實例
# 修改像素值
img[100, 150] = [255, 255, 255] # 將 (150, 100) 位置的像素值設置為白色
二、處理單個ROI區域(自選區域)
ROI 是指圖像中我們感興趣的區域 (Region of Interest)。通過提取 ROI,我們可以只對圖像的特定部分進行處理,從而提高處理效率。
提取 ROI
在 OpenCV 中,可以通過切片操作來提取 ROI。假設我們想要提取圖像中左上角 100x100 像素的區域:
實例
# 提取 ROI
roi = img[0:100, 0:100]
修改 ROI
提取 ROI 后,可以對其進行修改,然后將修改后的 ROI 放回原圖像中。
實例
# 修改 ROI
roi[:, :] = [0, 255, 0] # 將 ROI 區域設置為綠色# 將修改后的 ROI 放回原圖像
img[0:100, 0:100] = roi
三、 處理圖像通道
彩色圖像通常由多個通道組成,例如 RGB 圖像的三個通道。有時我們需要將這些通道分離出來進行單獨處理,然后再將它們合并回原圖像。
通道分離
在 OpenCV 中,可以使用 cv2.split() 函數將圖像的通道分離。
實例
# 通道分離
import cv2if __name__ == '__main__':imgPath = 'D:\Word\keli.jpg'img = cv2.imread(imgPath)cv2.imshow('image', img)b, g, r = cv2.split(img)# 下面會依次顯示r,g,b三張圖,每張3秒cv2.imshow('b', b)cv2.waitKey(3000)cv2.imshow('g', g)cv2.waitKey(3000)cv2.imshow('r', r)cv2.waitKey(3000)# 下面會依次保存r,g,b三張圖,不像上面順序是反的cv2.imwrite('D:\Word\keli-r.jpg', r)time.sleep(5)cv2.imwrite('D:\Word\keli-g.jpg', g)time.sleep(5)cv2.imwrite('D:\Word\keli-b.jpg', b)
原圖
RGB圖
通道合并
分離后的通道可以使用 cv2.merge() 函數合并回原圖像。
實例
# 通道合并
merged_img = cv2.merge([b, g, r])
四、處理整體
圖像的幾何變換是圖像處理中常見的操作,包括縮放、旋轉、平移和翻轉。
圖像縮放
圖像縮放可以通過 cv2.resize() 函數實現。可以指定縮放后的圖像尺寸或縮放比例。
實例
# 圖像縮放
resized_img = cv2.resize(img, (200, 200)) # 將圖像縮放為 200x200 像素
圖像旋轉
圖像旋轉可以通過 cv2.getRotationMatrix2D() 和 cv2.warpAffine() 函數實現。需要指定旋轉中心和旋轉角度。
實例
# 圖像旋轉# 取高和寬h, w = img.shape[:2]# 計算旋轉中心center = (int(w/2), int(h/2))# 得到2維線性變化M = cv2.getRotationMatrix2D(center, 180, 1)# 將變化作用到img上img = cv2.warpAffine(img, M, (w, h))# 顯示cv2.imshow('img', img)cv2.waitKey(0)
圖像平移
圖像平移可以通過 cv2.warpAffine() 函數實現。需要指定平移矩陣。
實例
# 圖像平移# 向右平移 100 像素,向下平移 50 像素M2 = np.float32([[1, 0, 100], [0, 1, 50]])img = cv2.warpAffine(img, M2, (w, h))cv2.imshow('img', img)cv2.waitKey(0)
平移以后空的地方顯示黑色背景
圖像翻轉
圖像翻轉可以通過 cv2.flip() 函數實現。可以指定翻轉方向(水平、垂直或兩者)。
實例
# 圖像翻轉
flipped_img = cv2.flip(img, 1) # 水平翻轉
計劃后面都用這一張原創圖練習