實踐環境 python 3.6.2 scikit-build-0.16.7 win10 opencv_python-4.5.4.60-cp36-cp36m-win_amd64.whl 下載地址: https://pypi.org/project/opencv-python/4.5.4.60/#fil ...
實踐環境
python 3.6.2
scikit-build-0.16.7
win10
opencv_python-4.5.4.60-cp36-cp36m-win_amd64.whl
下載地址:
https://pypi.org/project/opencv-python/4.5.4.60/#files
註意:下載時不用下abi版的,比如 opencv_python-4.6.0.66-cp36-abi3-win_amd64.whl 不能用,
因為數據類型為 np.uint8,也就是0~255,
依賴包安裝
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-build # 解決 ModuleNotFoundError: No module named 'skbuild'問題
pip install opencv_python-4.5.4.60-cp36-cp36m-win_amd64.whl
代碼實踐
示例圖片
代碼
import os
import numpy as np
import cv2
from datetime import datetime
from PIL import Image
def capture_image(image_file_path, left, upper, width, height, target_file_name=None):
'''截取圖片'''
right = left + width
lower = upper + height
if os.path.exists(image_file_path):
image = Image.open(image_file_path)
# width, height = image.size
# print('圖片寬度', width, '圖片高度', height)
head, ext = os.path.splitext(image_file_path)
if not target_file_name:
target_file_name = 'pic_captured%s%s' % (datetime.now().strftime('%Y%m%d%H%M%S%f'), ext)
target_file_path = '%s%s' % (head, target_file_name)
image.crop((left, upper, right, lower)).save(target_file_path)
return target_file_path
else:
error_msg = '圖片文件路徑不存在:%s' % image_file_path
print(error_msg)
raise Exception(error_msg)
def append_picture(image1_path, image2_path):
'''拼接圖片'''
image1 = cv2.imread(image1_path, -1)
shape = image1.shape
height1, width1, channel1 = shape
# print(shape) # 輸出:(315, 510, 4)
# print(image1) # 輸出一3維數組
# print(len(image1), len(image1[0])) # 輸出:315 510
image2 = cv2.imread(image2_path, -1)
height2, width2, channel2 = image2.shape
total_height = max(height1, height2)
total_width = width1 + width2
dst = np.zeros((total_height, total_width, channel1), np.uint8)
dst[0:height1, 0:width1] = image1
dst[0:height2, width1:total_width] = image2
cv2.imwrite("merge.png", dst)
if __name__ == '__main__':
# 截取圖片
image_path1 = capture_image('example.png', 10, 30, 510, 315)
image_path2 = capture_image('example.png', 520, 30, 518, 315)
append_picture(image_path1, image_path2)
運行結果
截取的圖片
合併的圖片
代碼補充說明
-
imread(filename, flags=None)
filename
圖片路徑
函數返回一個3三元組:
(height, width, channel)
,元素中元素從左到右分別表示圖片的高度,寬度,通道數(彩色圖片是三通道的,每個通道表示圖片的一種顏色(RGB
),對於OpenCV讀取到的圖片的通道順序是BGR
) ,假設圖片3元組為(315, 510, 4)
,表示有315行,即315個二維數組,510列,即每個二維數組有510個一維數組。-
flags
標誌位-
cv2.IMREAD_COLOR
:預設參數,表示讀入一副彩色圖片,忽略alpha通道,可用1作為實參替代 -
cv2.IMREAD_GRAYSCALE
:讀入灰度圖片,可用0作為實參替代 -
cv2.IMREAD_UNCHANGED
:讀入完整圖片,包括alpha通道,可用-1作為實參替代PS:
alpha
通道,又稱A通道,是一個8位的灰度通道,該通道用256級灰度來記錄圖像中的透明度覆信息,定義透明、不透明和半透明區域,其中黑表示全透明,白表示不透明,灰表示半透明
-
-
imwrite(filename, img, params=None)
將圖片矩陣以文件的形式儲存起來
-
filename
待保存的圖片路徑 -
img
Mat或Mat的矢量)要保存的一個或多個圖像。 -
params
特定格式的參數對(paramId_1、paramValue_1、paramId_2、paramValue_2……),參閱cv::ImwriteFlags
-
-
zeros(shape, dtype=None, order='C')
返回一個用零填充的給定形狀和類型的新數組(
ndarray
)shape
整數或者整數元組。新數組的形狀,例如(2, 3)
or2
。dtype
數據類型,可選。數組所需的數據類型,比如,numpy.int8
。 預設numpy.float64
。order
{'C', 'F'}
,可選,預設:'C'
。是否在記憶體中按行優先(row-major)順序(C語言風格)或者列優先(column-major)(Fortran風格)順序存儲多維數據。
示例
>>> import numpy as np # 創建2維數組 >>> array = np.zeros([2, 3]) >>> print(array) # 輸出一個二維數組 一個包含2個一維數組,每個一維數組包含3個元素 [[0. 0. 0.] [0. 0. 0.]] >>> array = np.zeros([2, 3], np.int64) # 指定數組元素數據類型為int64 >>> print(array) [[0 0 0] [0 0 0]] >>> array = np.zeros([2, 3], np.float64) # 指定數組元素數據類型為float64 >>> print(array) [[0. 0. 0.] [0. 0. 0.]] >>> array = np.zeros([3, 2]) # 輸出一個二維數組 一個包含3個一維數組,每個一維數組包含2個元素 >>> print(array) [[0. 0.] [0. 0.] [0. 0.]] # 創建3維數組 >>> array = np.zeros((2, 3, 4), np.int8) >>> print(array) # 輸出一個3維數組 一個包含2個二維數組,每個二維數組包含3個一維數組,每個一維數組包含4個元素 [[[0 0 0 0] [0 0 0 0] [0 0 0 0]] [[0 0 0 0] [0 0 0 0] [0 0 0 0]]]
-
冒號在Numpy數組索引中的作用說明
3維數組為例
ndarray[index1:index2, index3:index4, index5:index6]
indexN:indexM
表示獲取索引在範圍[indexN, indexM)
內的數組元素(註意,不包含索引為indexM
的元素),這裡的indexN
代表起始元素索引,可選,預設為0,indexM
代表結束元素索引,可選,預設為所在層級數組元素個數+1index1:index2
表示獲取三維數組中,索引在範圍[index1, index2)
內的數組元素,即二維數組index3:index4
表示獲取上述二維數組中,索引在範圍[index3, index4)
內的數組元素,即一維數組index5:index6
表示獲取上述一維數組中,索引在範圍[index5, index6)
內的數組元素示例
>>> array = np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[11, 12, 13], [14, 15, 16], [17, 18, 19]], [[20, 21, 22], [23, 24, 25], [26, 27, 28]]]) # 創建一個3維 ndarray >>> array array([[[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]], [[11, 12, 13], [14, 15, 16], [17, 18, 19]], [[20, 21, 22], [23, 24, 25], [26, 27, 28]]]) >>> array[:] # 獲取全部元素,等價於array[:, :, :] array([[[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]], [[11, 12, 13], [14, 15, 16], [17, 18, 19]], [[20, 21, 22], [23, 24, 25], [26, 27, 28]]]) >>> array[:, :, :] array([[[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]], [[11, 12, 13], [14, 15, 16], [17, 18, 19]], [[20, 21, 22], [23, 24, 25], [26, 27, 28]]]) >>> array[1:2] # 獲取索引在[1,2)範圍內的二維數組 array([[[11, 12, 13], [14, 15, 16], [17, 18, 19]]]) >>> array[1:] # 獲取索引在[1,3)範圍內的二維數組 array([[[11, 12, 13], [14, 15, 16], [17, 18, 19]], [[20, 21, 22], [23, 24, 25], [26, 27, 28]]]) >>> array[:2] # 獲取索引在[0,2)範圍內的二維數組 array([[[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]], [[11, 12, 13], [14, 15, 16], [17, 18, 19]]]) >>> array[1:2, 1:2] # 獲取索引在[1,2)範圍內的二維數組,二維數組中只獲取索引在[1,2)範圍內的一維數組 array([[[14, 15, 16]]]) >>> array[1:2, :2] # 獲取索引在[1,2)範圍內的二維數組,二維數組中只獲取索引在[0,2)範圍內的一維數組 array([[[11, 12, 13], [14, 15, 16]]]) >>> array[1:2, 1:] # 獲取索引在[1,2)範圍內的二維數組,二維數組中只獲取索引在[1,3)範圍內的一維數組 array([[[14, 15, 16], [17, 18, 19]]]) >>> array[1:2, :] # 獲取索引在[1,2)範圍內的二維數組的全部元素 array([[[11, 12, 13], [14, 15, 16], [17, 18, 19]]]) >>> array[1:2, 1:2, 1:2] # 獲取索引在[1,2)範圍內的二維數組,二維數組中只獲取索引在[1,2)範圍內的一維數組,一維數組中只獲取索引在[1,2)範圍內的元素 array([[[15]]]) >>> array[1:2, 1:2, 1:] # 獲取索引在[1,2)範圍內的二維數組,二維數組中只獲取索引在[1,2)範圍內的一維數組,一維數組中只獲取索引在[1,3)範圍內的元素 array([[[15, 16]]]) >>> array[1:2, 1:2, :2] # 獲取索引在[1,2)範圍內的二維數組,二維數組中只獲取索引在[1,2)範圍內的一維數組,一維數組中只獲取索引在[0,2)範圍內的元素 array([[[14, 15]]]) >>> array[1:2, 1:2, :] # 獲取索引在[1,2)範圍內的二維數組,二維數組中只獲取索引在[1,2)範圍內的一維數組,獲取一維數組的所有元素 array([[[14, 15, 16]]])
作者:授客
微信/QQ:1033553122
全國軟體測試QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限於時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞後如有任何疑問,請聯繫我!!!
微信打賞
支付寶打賞 全國軟體測試交流QQ群