【影像處理】使用OpenCV進行影像處理教程(一)

       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章影像的運算,希望與各位老師和小夥伴們交流學習~