OpenCV是進行圖像處理的工具,也是計算機視覺領域近十幾年不斷發展和完善的產物。面對這個已基本成熟的開源庫知識體系,我們新生代有必要不斷地總結、回顧,以新的視角快速融入計算機視覺的奧秘世界。
從這篇隨筆開始,讓我們踏上重新回顧OpenCV進行圖像處理的奇妙之旅。
1 圖像處理基礎
1.1 圖像的讀入、顯示、保存
#圖像讀入
import cv2 img1 = cv2.imread(r'E:/python_opencv/tupian.jpg',0)
#圖像顯示
cv2.imshow('tupian',img1) k = cv2.waitKey()
#圖像保存
cv2.imwrite('tupian,jpg',img1)
1.2 圖像的基本表示方法
分為二值圖像、灰度圖像、彩色圖像 這三種表示方法。
二值圖像:0和1表示像素點顏色,0為黑色,1為白色。
灰度圖像:256個灰度級,用數值[0,255]表示,0為黑色,1為白色。
彩色圖像:RGB色彩空間表示紅、綠、藍三種通道,數值均為[0,255]。但是在opencv中用BGR色彩空間表示。
不同的表示方法和色彩空間之間可以互相轉換。
1.3 像素處理
像素是構成一幅圖像的基本組成單位。
二值圖像和灰度圖像:img[0,2]表示第0行第2列的像素點。
彩色圖像:opencv里img[0,2]表示第0行第2列上B、G、R三個通道的像素值,img[0,2,2]表示第0行第2列上第2個通道R的像素值。
注1:可以使用二層或三層循環嵌套,對某區域內像素值整體修改,如:
for i in range(0,50): #i表示像素的行數
for j in range(0,100): #j表示像素的行數
for k in range(0,3): #k表示通道數
img[i,j,k]=255 #該區域的像素值均修改為255
注2:使用Numpy庫中的zeros()函數可以生成一個元素值都為0的數組,如:
import numpy as np img = np.zeros((3,5,3),dtpye=np.uint8)
1.4 使用numpy訪問像素
numpy模塊中提供了item()訪問像素值,itemset()修改像素值
item(i,j)或item(i,j,k)
itemset((i,j),a) 或 itemset((i,j,k),a) i,j為行和列,k為彩色圖片中的通道,a為新值。如:
print('img.item(3,2,2)=',img.item(3,2,2)) #讀取原像素值
img.itemset((3,2,2),255) #將第3行第2列R通道的像素值修改為255
1.5 感興趣區域(Region of Interset, ROI)
如果需要使用一張圖片的某區域,可以將其定為感興趣區域(ROI),然后就能對其整體進行操作。
A = img1[10:30,50:100] #將img1的第10-30行像素、50-100列像素設定為ROI區域
img2[20:40,300:350] = A #將該ROI區域賦給img2的第20-40行像素、300-350列像素
1.6 通道操作
對通道進行操作分為通道拆分和通道合並。
(一)通道拆分:
將BGR圖像中的三個通道分別拆分出來。分為索引拆分方法和函數拆分方法。
索引拆分:
#拆分為B、G、R三個通道
B = img[:,:,0] G = img[:,:,1] R = img[:,:,2]
函數拆分:
B,G,R = cv2.split(img)
(二)通道合並:
使用cv2.merge()函數將三個通道的灰度圖像構成一幅彩色圖像。
bgr = cv2.merge([b,g,r])
1.7 獲取圖像屬性
獲取圖像常用的屬性,如大小、類型等。
shape 返回圖像行數、列數、通道數
size 返回圖像像素數
dtype 返回圖像的數據類型
print('img.shape=',img.shape) #shape 返回圖像行數、列數、通道數
print('img.size=',img.size) #size 返回圖像像素數
print('img.dtype=',img.dtype) #dtype 返回圖像的數據類型
這次內容就分享到這里了,下次繼續更新第2章圖像的運算,希望與各位老師和小伙伴們交流學習~