初識OpenCv 練習筆記整理--學習五。【影象的基礎操作】
阿新 • • 發佈:2018-12-20
"""
核心操作 影象的基礎操作
目標:
獲取畫素值並修改
獲取影象的屬性(資訊)
影象的ROI()
影象通道的拆分以及合併
"""
# 第一小節 獲取並修改畫素值 2018/10/25 13:46 import cv2 img = cv2.imread('./image/image0.289115359675159.jpg') print(img.shape) # 圖片的大小 px = img[100, 100] # 長寬各為 100 的時候的r,g,b的值 bule = img[100, 100, 0] # 取b通道下 長和寬各為 100 時候的畫素值,這個就應該是b的值 ,且最後一個引數的值不能超過2,因為只有三個通道 # 通過上邊的瞭解 那麼便可以修改畫素值了。 img[100, 100] = [255, 255, 0] print(img[100, 100]) # 結果便是 [255 255 0]
# 第二小節 img.item 和 img.itemset用法 2018/10/25 14:45 import cv2 import numpy as np img = cv2.imread('./image/image0.12106563363219036.jpg') print(img.item(20, 10, 0)) # 和上邊的很相似 位置在長寬各為 20,10 b綠色的通道下的值 img.itemset((20, 10, 0), 100) # 很顯然是對(20, 10, 0)位置的畫素值進行了修改 並將其修改為100 print(img.item(20, 10, 0)) """ 197 # 第一個值的結果 100 # 第二個值的結果 """
# 第三小節 獲取影象屬性 2018/10/25 14:53 """ 影象的屬性包括:行、列、通道、影象資料型別、畫素數目等 img.shape 可以獲取影象的形狀。他的返回值是一個包含行數,烈屬,通道數的元組 """ import cv2 import numpy as np img = cv2.imread('./image/image0.7173173905174174.jpg') # 彩色圖 print(img.shape) """ 結果: (750, 500, 3) 值所代表的意思為:行列(長寬)為750,500 三通道 注意的是 如果只有灰度圖,返回值 僅有行數和列數 """ print(img.size) """ 結果: 1125000 返回影象的畫素數目 """ print(img.dtype) """ 結果: uint8 影象的資料型別 """
# 第四小節 影象的ROI 2018/10/25 16:02
"""
有時候需要對一幅影象的特定區域進行操作。例如我們檢測一幅影象中眼睛的位置,我們首先應該在影象中找到臉,
在再臉的區域找到眼睛,而不是直接在一幅影象中搜索。這樣會提高程式的準確性和效能。
ROI也是使用Numpy 索引來獲得的。現在我們選擇球的部分並把他拷貝到影象的去他區域。
"""
import cv2
import numpy as np
img = cv2.imread('./image/image0.1694241342140831.jpg')
print(img.shape) # 首先檢視圖片的大小
ball = img[270:330, 330:390] # 第270行到330行,第330列到332列的值獲取到
img[272:332, 100:160] = ball
cv2.imshow('image', img)
cv2.waitKey(0)
"""
結果總結:
第一 首先要檢視圖片的大小。
第二 裁剪的大小 也要和裁剪到的位置大小進行匹配
"""
# 第五小節 拆分以及合併影象通道
"""
前提:
有時候我們需要對BGR三個通道分別進行操作。這就需要把BGR拆分成單個通道。有時還需要把獨立的通道圖片合併成一個BGR影象。
"""
import cv2
img = cv2.imread('./image/image0.057406079113572206.jpg')
b, g, r = cv2.split(img) # 分別表示3通道
img = cv2.merge((b, g, r)) # 重新組合通道 看原始碼最重要。
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
"""
想使所有畫素的紅色通道的值都為0, 可以直接使用Numpy 索引,這會更快。
"""
import cv2
img = cv2.imread('./image/image0.057406079113572206.jpg')
img[:, :, 2] = 0
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 第六小節 為影象擴邊(填充) 2018/10/25 16:35
"""
想在影象的周圍建立一個邊,就像相框一樣,你可以使用cv2.copyMakeBorder()函式。
這經常在卷積運算或者0填充時被用到。這個函式包括的引數如下:
src 輸入影象
top,bottom,left,right,對應便捷的畫素數目。
borderType 要新增那種型別的邊界,型別如下:
cv2.BORDER_CONSTANT 新增有顏色的常數值邊界,還需要參考原始碼
cv2.BORDER_REFLECT 邊界元素的映象。比如:fedcba|abcde_fgh
cv2.BORDER_FEFLECT_101 or cv2.BORDER_DEFAULT
cv2.BORDER_REPLICATE 重複最後一個元素。
以下程式碼演示更好的瞭解各個引數代表的意思。
"""
import cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE = [255, 0, 0]
img = cv2.imread('./image/image0.5933298728009282.jpg')
REPLICATE = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REPLICATE) # 邊框類似水印
REFLECT = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REFLECT) # 邊框在圖片內 類似實線邊框
REFLECT_101 = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REFLECT_101) # 和第二張類似
WRAP = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_WRAP) # 突出邊框內的照片
CONSTANT = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=BLUE) # 綠色邊框
# cv2.imshow('iamge', CONSTANT)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
# 使用matplotlib展示圖片
plt.subplot(231), plt.imshow(img, '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(REFLECT_101, '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()
後續安排合理時間 今天暫時到這 繼續搞點爬蟲知識。後續也要天天看看 熟練掌握。