目標:1.學會圖像的通道分割與合并
? ? ? ? ? ?2.學會圖像的的常規操作
##一些概念:
二值圖像:只包含黑色和白色兩種顏色的圖像,1為白色,0為黑色
灰度圖像:計算機會將灰度處理為256個灰度級,用區間[0,255]來表示。其中255表達純白?色,0表示純黑色。
彩色圖像:由于色彩空間不一致,導致彩色圖像的表示也不一致,以RGB圖像為例,由三個? 通道組成,R通道,G通道,B通道,每個色彩的通道值處于[0,255],經過不同的組合共有?256*256*256=16777216種顏色。但是在opencv中,圖像通道是按照?B,G,R排列的
1. 通道操作
為什么需要通道操作?
有時候,需要將圖像的通道數進行分割處理,在opencv中,圖像通道是按照?B,G,R排列的
方法:分為索引拆分和通過函數拆分,主要講解函數拆分
函數:cv2.spilt(img)
import cv2lean=cv2.imread("1.JPG") b,g,r=cv2.split(lean) # 與下面的寫法是一致的# b1=cv2.split(lean)[0] # g1=cv2.split(lean)[1] # r1=cv2.split(lean)[2]cv2.imshow("B",b) cv2.imshow("G",g) cv2.imshow("R",r) cv2.waitKey(0) cv2.destroyAllWindows()
注意事項:上述代碼呈現的圖片大小不能調,下面的是可以手動調大小的
import cv2result=cv2.imread("1.JPG") b,g,r=cv2.split(result) #分割圖像,將圖像按照B,G,R的通道進行拆分 cv2.namedWindow('11',cv2.WINDOW_NORMAL) # 需要自定義個窗體,正常模式 cv2.namedWindow('12',cv2.WINDOW_NORMAL) cv2.namedWindow('13',cv2.WINDOW_NORMAL) cv2.imshow("11",b) cv2.imshow("12",g) cv2.imshow("13",r) cv2.waitKey(0) cv2.destroyAllWindows()
2. 通道合并
說明:通道合并是通道拆分的逆過程,例如將三個通道的灰度圖像構成 一副彩色圖像。
為什么需要通道合并?
有時候可能需要兩個通道合并或者多個通道合并,圖像在opencv中是按照B,G,R的順序進行排列的,可以先對圖像進行拆分操作,在按照R,G,B的順序進行合并。
函數:cv2.merge(mv)
解釋:參數mv為單通道圖像或者列表,每個通道的圖像長和款應該相同
import cv2result=cv2.imread("1.JPG") b,g,r=cv2.split(result) #分割圖像,將圖像按照B,G,R的通道進行拆分 cv2.namedWindow('11',cv2.WINDOW_NORMAL) # 需要自定義個窗體,正常模式 cv2.namedWindow('12',cv2.WINDOW_NORMAL) #cv2.namedWindow('13',cv2.WINDOW_NORMAL)bgr=cv2.merge([b,g,r]) rgb=cv2.merge([r,g,b])cv2.imshow("11",bgr) cv2.imshow("12",rgb) #cv2.imshow("13",r) cv2.waitKey(0) cv2.destroyAllWindows()
3. 圖像屬性
下面僅介紹常用的圖像屬性
shape:如果是彩色圖像,則返回行數、列數、通道數的數組,若是二值圖像或者灰度圖像? ? ? ? ? ? ? ? ?則只返回行數和列數
size:返回圖像的像素數,其值為 “行x列x通道數”,灰度圖像或者二值圖像通道數為1
dtype:返回圖像的數據類型
### 圖像的高和寬分別對應著列數和行數。
- 高度(Height)=行數
- 寬度(Width)=列數
如何獲取圖像的長和寬?
import cv2# 讀取圖像(返回的是 numpy 數組) img = cv2.imread("image.jpg")# 獲取圖像的高度(行數)和寬度(列數) height, width = img.shape[:2] # 取前兩個值,分別是高度和寬度print(f"圖像寬度(列數):{width}") print(f"圖像高度(行數):{height}")
如何統一圖像的大小?如何批量統一圖像的嗯大小?
函數:
cv2.resize(src, dsize, fx=0, fy=0, interpolation=cv2.INTER_LINEAR
)
參數 作用 src
輸入圖像( numpy
?數組)dsize
目標尺寸,格式為? (寬度, 高度)
(如?(640, 480)
)fx
/fy
水平 / 垂直方向的縮放比例(若指定,則? dsize
?需設為?None
)interpolation
插值方法(決定縮放時如何計算新像素值,影響結果質 import cv2 import os from glob import globdef resize_images(input_dir, output_dir, target_size=(640, 480)):"""批量調整圖像大小:param input_dir: 原始圖像所在文件夾:param output_dir: 調整后圖像的保存文件夾:param target_size: 目標尺寸 (寬度, 高度)"""# 創建輸出文件夾(如果不存在)os.makedirs(output_dir, exist_ok=True)# 獲取文件夾中所有圖片(支持常見格式)image_paths = glob(os.path.join(input_dir, "*.[jpgnJPGEpngPNG]"))for img_path in image_paths:# 讀取圖像img = cv2.imread(img_path)if img is None:print(f"無法讀取圖像: {img_path}")continue# 調整圖像大小# interpolation參數:縮放時的插值方法# - cv2.INTER_AREA: 適合縮小圖像(推薦)# - cv2.INTER_CUBIC: 適合放大圖像(質量更高但速度慢)# - cv2.INTER_LINEAR: 線性插值(默認,平衡速度和質量)resized_img = cv2.resize(img, target_size, interpolation=cv2.INTER_AREA)# 保存調整后的圖像img_name = os.path.basename(img_path)output_path = os.path.join(output_dir, img_name)cv2.imwrite(output_path, resized_img)print(f"已保存: {output_path}")# 使用示例 if __name__ == "__main__":input_folder = "原始圖片文件夾路徑" # 替換為你的輸入文件夾output_folder = "調整后圖片文件夾路徑" # 替換為你的輸出文件夾target_width = 800 # 目標寬度target_height = 600 # 目標高度resize_images(input_folder, output_folder, (target_width, target_height))