OpenCV學習:針對圖片的基本操作
---恢復內容開始---
來自opencv-python官方學習文件,本人謹做翻譯和註釋,以及一些自己的理解
本文由作者翻譯並進行程式碼驗證,轉載請註明出處~
官方文件請參閱:https://docs.opencv.org/4.0.1/db/d5b/tutorial_py_mouse_handling.html
執行環境:
windows 10+pycharm professional 2018.3+python 3.7.1+opencv 4.0.1
目標:
1,獲取並修改影象的畫素值
2,獲取影象屬性
3,設定ROI(Region of Interest)
4,分割、合併影象
一:獲取並修改影象的畫素值
讀取一張彩色圖---> 獲取行和列的畫素值。對於BGR影象,返回藍綠紅的畫素的陣列,對於灰度影象,返回強度值。
Numpy是一個基於python的擴充套件程式庫,支援大量的陣列與矩陣運算。
程式碼中:
blue = img[100,100,0]
img的後面的第三個引數分別是座標(100,100)下的藍綠紅的畫素值
程式碼如下:
import numpy as np import cv2 as cv img = cv.imread('C:\\Users\\xjtu\\Desktop\\roi.jpg') px = img[100,100]print( px ) # accessing only blue pixel blue = img[100,100,0] print( blue )
你也可以通過一下程式碼修改某個點的畫素值,程式碼如下:
img[100,100] = [255,255,255] print( img[100,100] )
執行截圖如下:
也可以通過一下程式碼,直接實現畫素值的轉化。程式碼是將(10,10)的紅色的畫素值設定為100
img.itemset((10,10,2),100)
二:獲取影象屬性
影象屬性包括行數、列數和通道數、影象資料型別、畫素數等
image.shape函式返回的是一個三元的陣列,內含行數、列數和通道數
由於灰度圖沒有通道數,所以可以利用image.shape來判斷載入的影象是彩色的還是灰度圖
img.size返回的是總的畫素值
img.dtype返回的是影象的資料格式
img.dtype在OpenCV-Python中很重要,因為在程式中很大一部分是因為資料格式不對引起的
import cv2 as cv
img = cv.imread('C:\\Users\\xjtu\\Desktop\\roi.jpg')
print(img.shape)
print("src_image_size",img.size)
print("src_image_datatype",img.dtype)
img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
print(img.shape)
print("gray_image_size",img.size)
print("gray_image_datatype",img.dtype)
截圖如下:
三、設定ROI
有的時候,需要在影象中設定感興趣的區域。比如針對影象中的眼部識別,首先需要識別出面部,然後再在面部中查詢。這一般很精確,效率也很高。程式碼如下
ball = img[280:340, 330:390]
img[273:333, 100:160] = ball
四、分割和融合影象通道
分割和融合影象通道主要是為了方便在某些情況下,需要在特定的通道的影象下工作。程式碼如下
b,g,r = cv.split(img) img = cv.merge((b,g,r)) b = img[:,:,0] img[:,:,2] = 0
五、製作影象邊框
有的時候需要為影象設定一定的邊界,可以用cv.copyMakeBorder()這個函式,但是它還有更多的卷積和0填充操作。這個函式的引數有:
src-輸入影象
top,bottom,left,right-用畫素值表示的對應方向的長度
borderType:主要包含以下幾種
a)cv.BORDER_CONSTANT,連續的彩色的邊界
b)cv.BORDER_REFLECT,邊框將是邊框元素的映象反射
c)cv.BORDER_REFLECT_101或 cv.BORDER_DEFAULT,(暫時還未理解,記於0111)
d)cv.BORDER_REPLICATE , 最後一個元素被複制
e)cv.BORDER_WRAP ,(暫時還未理解,記於0111)
製作影象邊框的示例程式碼如下:
''' @author: lys @file: make_borders_for_image.py @time: 2019/1/11 17:05 @desc:在影象上設定邊界 ''' import cv2 as cv import numpy as np from matplotlib import pyplot as plt BLUE = [255,0,0] img1 = cv.imread('C:\\Users\\xjtu\\Desktop\\roi.jpg') replicate = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REPLICATE) reflect = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT) reflect101 = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT_101) wrap = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_WRAP) constant= cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_CONSTANT,value=BLUE) plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL') plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE') plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT') plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101') plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP') plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT') plt.show()
執行截圖為: