1. 程式人生 > >OpenCV學習:針對圖片的基本操作

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()

執行截圖為: