1. 程式人生 > >初識OpenCv 練習筆記整理--學習五。【影象的基礎操作】

初識OpenCv 練習筆記整理--學習五。【影象的基礎操作】

"""
核心操作 影象的基礎操作
目標:
    獲取畫素值並修改
    獲取影象的屬性(資訊)
    影象的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()

後續安排合理時間 今天暫時到這 繼續搞點爬蟲知識。後續也要天天看看 熟練掌握。