Python+OpenCV 图像处理系列(5)—— 图像 ROI 操作及通道的拆分合并
1. 圖像 ROI
有時(shí)你需要對(duì)一幅圖像的特定區(qū)域進(jìn)行操作。例如我們要檢測(cè)一副圖像中眼睛的位置,我們首先應(yīng)該在圖像中找到臉,再在臉的區(qū)域中找眼睛,而不是直接在一幅圖像中搜索。這樣會(huì)提高程序的準(zhǔn)確性和性能。
圖像的 ROI (region of interest) 是指圖像中感興趣區(qū)域、在 OpenCV 中圖像設(shè)置圖像 ROI 區(qū)域,實(shí)現(xiàn)只對(duì) ROI 區(qū)域操作。例如,下面這個(gè)例子,我們把原始圖片中下面的花拷貝到第二幅圖片中。
import cv2image_name = "img/003.jpg"
img = cv2.imread(image_name)
cv2.imshow("origin", img)target = img[70:150, 30:110] # 70:150 表示 h 的范圍, 30:110 表示 w 的范圍
img[90:170, 110:190] = targetcv2.imshow("dst", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 拆分及合并圖像通道
OpenCV 中默認(rèn) imread 函數(shù)加載圖像文件,加載進(jìn)來(lái)的是三通道彩色圖像,色彩空間是 RGB 色彩空間、通道順序是 BGR(藍(lán)色、綠色、紅色)。有時(shí)我們需要對(duì) BGR 三個(gè)通道分別進(jìn)行操作。這時(shí)你就需要把 BGR 拆分成單個(gè)通道。有時(shí)你需要把獨(dú)立通道的圖片合并成一個(gè) BGR 圖像。使用到的 API 函數(shù)如下:
- split 通道分類(lèi)
- merge 通道合并
import cv2
import numpy as npimage_name = "img/003.jpg"
img = cv2.imread(image_name)
print "img is {}".format(img)
cv2.imshow("origin", img)mv = cv2.split(img)
# print "mv is {}".format(mv)
mv[0][:, :] = 255
dst1 = cv2.merge(mv)
cv2.imshow("dst1", dst1)mv = cv2.split(img)
mv[1][:, :] = 0
dst2 = cv2.merge(mv)
cv2.imshow("dst2", dst2)mv = cv2.split(img)
mv[2][:, :] = 0
dst3 = cv2.merge(mv)
cv2.imshow("dst3", dst3)dst4 = np.zeros(img.shape, img.dtype)
cv2.mixChannels(img, dst4, [2, 0])
cv2.imshow("dst4", dst4)
cv2.waitKey(0)
cv2.destroyAllWindows()
mv 的打印結(jié)果如下:
mv is
[
array([[131, 107, 82, ..., 67, 67, 66],[130, 109, 88, ..., 66, 66, 65],[118, 104, 90, ..., 67, 66, 65],...,[ 6, 8, 9, ..., 44, 45, 46],[ 4, 7, 10, ..., 41, 42, 44],[ 0, 5, 8, ..., 39, 40, 41]], dtype=uint8), array([[190, 167, 140, ..., 125, 125, 124],[187, 167, 144, ..., 124, 124, 123],[170, 156, 141, ..., 125, 124, 123],...,[ 73, 75, 73, ..., 58, 59, 60],[ 68, 71, 71, ..., 55, 56, 58],[ 63, 69, 69, ..., 53, 54, 55]], dtype=uint8),array([[199, 173, 145, ..., 97, 97, 96],[196, 173, 149, ..., 96, 96, 95],[177, 162, 144, ..., 100, 99, 98],...,[ 36, 38, 38, ..., 30, 31, 32],[ 38, 41, 43, ..., 27, 28, 30],[ 34, 40, 43, ..., 25, 26, 27]], dtype=uint8)
]
'''
警告:cv2.split() 是一個(gè)比較耗時(shí)的操作。只有真正需要時(shí)才用它,能用 Numpy 索引就盡量用。
總結(jié)
以上是生活随笔為你收集整理的Python+OpenCV 图像处理系列(5)—— 图像 ROI 操作及通道的拆分合并的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python+OpenCV 图像处理系列
- 下一篇: OpenCV 图像处理系列(6)—— 图