02-影象處理入門基礎
影象是由一個個畫素構成的
我們所說的影象,通常分為二值影象、灰度影象、RGB影象
二值影象:影象當中的每個畫素點,只能取0或255,其中0為黑,255為白
灰度影象:影象當中的每個畫素點,可以取最暗黑色到最亮的白色的灰度之間256級灰度,其中二值影象和灰度影象都是單通道圖片
RGB影象:影象當中的每個畫素由R、G、B三個分量表示,即RGB三通道彩色圖片,其中每個通道取值範圍0-255之間
import cv2 # 彩色圖片轉換為灰度圖 src = cv2.imread("image.jpg",cv2.IMREAD_COLOR) cv2.imshow("original",src) img_gray= cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) cv2.imshow("img_gray",img_gray) # 灰度圖轉彩色圖片(這裡其實是將灰度影象的單通道變為三通道,沒有變為original的原始影象,整體影象還是灰色的) img_rgb = cv2.cvtColor(img_gray,cv2.COLOR_GRAY2BGR) cv2.imshow("img_rgb",img_rgb) cv2.waitKey(0) cv2.destroyAllWindows()
畫素處理
1.讀取畫素
返回值 = 影象(位置引數)
1> 灰度影象,返回灰度值
2> RGB影象,返回值為B,G,R的值(這是因為,RGB影象中的實際通道順序是BGR)
2.修改畫素值
影象(位置引數) = 修改的值
import cv2 # 1.灰度圖 # cv.IMREAD_GRAYSCALE:以灰度模式載入影象 img_gray=cv2.imread("image.jpg",cv2.IMREAD_GRAYSCALE) # 讀取畫素,返回影象第3行第10列的灰度值 p = img_gray[3,10] print("灰度圖中第3行第10列的灰度值:",p) # 修改畫素值 img_gray[3,10] = 100 print("修改畫素值後,灰度圖中第3行第10列的灰度值:",img_gray[3,10],end="\n\n") # 2,RGB影象 # cv2.IMREAD_COLOR:載入彩色影象。任何影象的透明度都會被忽視,它是預設標誌img = cv2.imread("image.jpg",cv2.IMREAD_COLOR) # 讀取畫素,返回影象第3行第10列的B,G,R的值 blue = img[3,10,0] green = img[3,10,1] red = img[3,10,2] print("RGB影象中第3行第10列的B,G,R分別為:",blue,green,red) # 修改畫素值 img[3,10] = [100,100,100] print("修改畫素值後,RGB影象中第3行第10列的B,G,R分別為:",img[3,10,0],img[3,10,1],img[3,10,2])
使用numpy進行畫素處理
Numpy(Numerical Python)是一個開源的Python科學計算庫,用於快速處理任意維度的陣列
安裝:pip install numpy
1.讀取畫素
返回值 = 影象.item(位置引數)
1> 灰度影象,返回灰度值
2> RGB影象,返回值為B,G,R的值(這是因為,RGB影象中的實際通道順序是BGR)
2.修改畫素值
影象名.itemset(位置引數,新值)
import numpy as np import cv2 # 1.灰度圖 # cv.IMREAD_GRAYSCALE:以灰度模式載入影象 img_gray=cv2.imread("image.jpg",cv2.IMREAD_GRAYSCALE) # 讀取畫素,返回影象第3行第10列的灰度值 p = img_gray.item(3,10) print("灰度圖中第3行第10列的灰度值:",p) # 修改畫素值 img_gray.itemset((3,10),100) print("修改畫素值後,灰度圖中第3行第10列的灰度值:",img_gray.item(3,10),end="\n\n") # 2,RGB影象 # cv2.IMREAD_COLOR:載入彩色影象。任何影象的透明度都會被忽視,它是預設標誌 img = cv2.imread("image.jpg",cv2.IMREAD_COLOR) # 讀取畫素,返回影象第3行第10列的B,G,R的值 blue = img.item(3,10,0) green = img.item(3,10,1) red = img.item(3,10,2) print("RGB影象中第3行第10列的B,G,R分別為:",blue,green,red) # 修改畫素值 img.itemset((3,10,0),100) img.itemset((3,10,1),100) img.itemset((3,10,2),100) print("修改畫素值後,RGB影象中第3行第10列的B,G,R分別為:",img.item(3,10,0),img.item(3,10,1),img.item(3,10,2)
獲取影象屬性
1.形狀:行、列、通道數
通過影象名.shape獲取影象的形狀,返回包括行數,列數,通道數的元組
1> 灰度影象,返回行數、列數
2> 彩色影象,返回行數、列數、通道數
2.畫素數目
通過影象名.size獲取影象的畫素數目
1> 灰度影象,返回行數*列數
2> 彩色影象,返回行數*列數*通道數
3.影象的資料型別
通過影象名.dtype獲取當前影象的資料型別
import cv2 # 1.灰度圖 # cv.IMREAD_GRAYSCALE:以灰度模式載入影象 img_gray=cv2.imread("image.jpg",cv2.IMREAD_GRAYSCALE) # 獲取影象的形狀 print("灰度圖的形狀",img_gray.shape) # 獲取影象的畫素數目 print("灰度圖的畫素數目",img_gray.size) # 獲取影象的資料型別 print("灰度圖的資料型別",img_gray.dtype,end="\n\n") # 2,RGB影象 # cv2.IMREAD_COLOR:載入彩色影象。任何影象的透明度都會被忽視,它是預設標誌 img = cv2.imread("image.jpg",cv2.IMREAD_COLOR) # 獲取影象的形狀 print("RGB彩色圖的形狀",img.shape) # 獲取影象的畫素數目 print("RGB彩色圖的畫素數目",img.size) # 獲取影象的資料型別 print("RGB彩色圖的資料型別",img.dtype)
影象ROI,感興趣區域
在影象處理領域,我們常常需要設定感興趣區域(ROI,region of interest),這個區域就是影象分析所關注的焦點,這樣以便進行進一步處理,可以大大減少處理時間
定義ROI區域有兩種方法
1> 使用表示矩形的區域React,它指定矩形的左上角座標和矩形的長寬
2> 指定感興趣行或列的範圍(Range),Range是指從起始索引到終止索引(不包括終止索引)的一連段連續序列
import cv2 import numpy as np # 讀取圖片 src=cv2.imread("test.jpg",cv2.IMREAD_COLOR) #讀取圖片 cv2.imshow("src",src) # 提取ROI感興趣區域 face = np.zeros((80,80,3)) face=src[10:90,70:150] cv2.imshow("face",face) # 將上述提取的ROI區域,RGB彩色圖轉換為灰度圖 gray=cv2.cvtColor(face,cv2.COLOR_BGR2GRAY) cv2.imshow("gray",gray) # 將上述ROI區域的灰度圖轉化為RGB彩色圖 backface=cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR) # 原圖的ROI感興趣區域進行替換 src[10:90,70:150]=backface cv2.imshow("backface",src) cv2.waitKey(0) cv2.destroyAllWindows()
通道的拆分與合併
1.拆分通道
2.合併通道
import cv2 img = cv2.imread("image.jpg",cv2.IMREAD_COLOR) # 拆分通道 # b,g,r = cv2.split(img) b = img[:,:,0] g = img[:,:,1] r = img[:,:,2] cv2.imshow("B",b) cv2.imshow("G",g) cv2.imshow("R",r) cv2.waitKey(0) cv2.destroyAllWindows() # 合併通道 rgb_img = cv2.merge([r,g,b]) bgr_img = cv2.merge((b,g,r)) cv2.imshow("RGB",rgb_img) cv2.imshow("BGR",bgr_img) cv2.waitKey(0) cv2.destroyAllWindows()