使用前需要先安裝套件
pip install opencv-python
原始圖片:
code:
# -*- coding: utf-8 -*-
"""
Created on Sat Aug 5 16:16:17 2023
@author: SavingKing
"""
import cv2 # 匯入OpenCv函式庫
import numpy as np # 匯入numpy函式庫
import os
folder = r"P:\Python class\powen\day2"
fname = "1.jpg"
fpath = os.path.join(folder,fname)
#'P:\\Python class\\powen\\day2\\1.jpg'
print("fpath:\n",fpath)
img = cv2.imread(fpath) # 使用OpenCV讀取圖片
img[0,0]=[0,0,255] # 改變 (0,0)位置的顏色為 (0,0,255) 紅
img[10:40,10:20]=[0,255,0] # 改變 (10,10) 到 (20,20) 的顏色為 (0,255,0) 綠
cv2.imshow('image',img) # 顯示視窗內容為img的圖標題image
"""
img.shape
Out[32]: (302, 403, 3)
"""
img[0:20,0:20]=[0,255,0] #左上角G
img[0:20,403-20:403]=[255,0,0] #右上角B
img[-20:,0:20]=[0,0,255] #左下角R
img[img.shape[0]-20:,img.shape[1]-20:]=[255,255,255] #右下角白
cv2.imshow('image',img) #執行結果
cv2.waitKey(0) # 程式停止,直到按下任意按鍵
cv2.destroyAllWindows() # 關閉所有視窗
執行結果:
openCV無法使用中文路徑:
參考論壇文章:
How do I read an image from a path with Unicode characters?
coding:
import cv2
import numpy
# 中文路徑示例
path = r'P:\Temp\中文目錄\1.jpg'
stream = open(path, "rb")
bytesData = stream.read() # 讀取二進位數據
stream.close() # 讀取完畢後關閉文件
# 使用讀取的二進位數據來創建 bytearray
bytesDataArray = bytearray(bytesData)
# 使用 bytearray 來創建 numpy 陣列
numpyarray = numpy.asarray(bytesDataArray, dtype=numpy.uint8)
# 使用 OpenCV 解碼 numpy 陣列得到圖片
bgrImage = cv2.imdecode(numpyarray, cv2.IMREAD_GRAYSCALE)
#cv2.IMREAD_COLOR #cv2.IMREAD_UNCHANGED
# 現在您可以在這裡進行影像處理或其他操作
img = bgrImage
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結果:
bgrImage = cv2.imdecode(numpyarray, cv2.IMREAD_UNCHANGED)
bgrImage = cv2.imdecode(numpyarray, cv2.IMREAD_COLOR)
根據讀取模式的不同,您將看到不同的顯示結果:
cv2.IMREAD_COLOR
模式:圖片會以BGR模式顯示,忽略透明度通道。cv2.IMREAD_GRAYSCALE
模式:圖片會以灰度模式顯示,只有一個通道,每個像素表示灰度值。cv2.IMREAD_UNCHANGED
模式:圖片會保留所有通道,包括顏色通道和透明度通道(如果有的話)。
cv2.imread()
和 cv2.imdecode()
都是OpenCV中用於讀取圖片的函數,但它們之間有一些重要的區別。
cv2.imread()
:cv2.imread()
是用於從檔案系統中讀取圖片的函數。- 它可以直接從檔案路徑讀取圖片並返回一個代表圖片的NumPy陣列。
- 默認情況下,
cv2.imread()
使用cv2.IMREAD_COLOR
讀取圖片,即以BGR(藍綠紅)模式讀取並忽略透明度通道。 - 它不支持讀取網路上的圖片或二進位數據。
cv2.imdecode()
:cv2.imdecode()
是用於解碼二進位數據為圖片的函數。- 它需要接收以二進位形式讀取的圖片數據(例如,使用
open()
函數以二進位模式讀取)。 - 您可以通過
numpy
將二進位數據轉換為uint8
型別的NumPy陣列,然後使用cv2.imdecode()
解碼這個NumPy陣列。 cv2.imdecode()
支持從網路上下載的圖片或其他來源讀取圖片。
總結來說,cv2.imread()
是直接從檔案系統中讀取圖片的函數,而 cv2.imdecode()
是用於解碼二進位數據為圖片的函數,您需要使用 numpy
將二進位數據轉換為NumPy陣列後再使用它。在實際使用中,您可以根據讀取的需求和來源來選擇適合的函數。
推薦hahow線上學習python: https://igrape.net/30afN