本文簡單地介紹計算機圖形處理的一些基本概念,以及一些有趣的例子和對應的Open CV的程式碼操作。
順便說一句,恭喜IG奪冠!
一、圖片儲存原理
1、顏色空間RGB
(1)RGB三通道彩色圖
圖片由三維矩陣疊加而成([0,255]),通俗講就是將三個分別只有R(red),G(green),B(blue)的矩陣疊加。
2、影像處理
(1)卷積/濾波
二、OpenCV基礎
Open CV是一個開源的計算機視覺庫,採用C/C++編寫,提供Python、MATLAB以及其他語言的介面。
1、基本I/O操作
#-*- coding: utf-8 -*-import cv2# 開啟圖片img = cv2.imread('lion.jpg')# 顯示圖片img = cv2.imshow('lion','lion.jpg')# 儲存圖片cv2.imwrite('lion2.jpg',img)複製程式碼
2、灰度、二值化處理
灰度化:在RGB模型中,如果R=G=B時,則彩色表示一種灰度顏色。
二值化:影像的二值化,就是將影像上的畫素點的灰度值設定為0或255,整個影像呈現出明顯的只有黑和白的視覺效果
#-*- coding: utf-8 -*-import cv2 # 讀取圖片img = cv2.imread('wsc.jpeg')# 灰度化處理、儲存處理後檔案img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv2.imwrite('wsc-gray.jpg',img)# 二值化處理、儲存處理後檔案cv2.threshold(image, 550, 550, 0, image) cv2.imwrite('wsc-two-value.jpg',img)複製程式碼
圖片處理前 | 灰度處理 |
---|---|
圖片處理前 | 二值處理 |
3、圖片匹配
matchTemplate
用於在影像中與模板圖片比對,查詢目標
cv2.matchTemplate(img,template,eval('cv2.TM_CCOEFF'))複製程式碼
關鍵引數
-
TM_SQDIFF
平方差匹配法:該方法採用平方差來進行匹配;最好的匹配值為0;匹配越差,匹配值越大。 -
TM_CCORR
相關匹配法:該方法採用乘法操作;數值越大表明匹配程度越好。 -
TM_CCOEFF
相關係數匹配法:1表示完美的匹配;-1表示最差的匹配。 -
TM_SQDIFF_NORMED
歸一化平方差匹配法 -
TM_CCORR_NORMED
歸一化相關匹配法 -
TM_CCOEFF_NORMED
歸一化相關係數匹配法
三、有趣的例子
1、邊緣檢測
Canny邊緣檢測
程式碼
#-*- coding: utf-8 -*-import cv2# 讀取圖片img = cv2.imread('wsc.jpeg')# Canny邊緣檢測處理,並寫入圖片cv2.imwrite('wsc1.jpeg',cv2.Canny(img,200,300))複製程式碼
圖片處理前 | 圖片處理後 |
---|---|
2、人臉檢測
haarcascade_frontalface_default.xml
,該檔案為人臉檢測器(預設)檔案,檔案可在OpenCV的Github上下載。
#-*- coding: utf-8 -*-import cv2def detect(filename): face_cascade = cv2.CascadeClassifier('./data/haarcascades/haarcascade_frontalface_default.xml') # 讀取圖片 img = cv2.imread(filename) # 圖片灰度處理 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 人臉檢測,每次迭代影像壓縮率、人臉矩形保留近鄰數目最小值 faces = face_cascade.detectMultiScale(gray,1.3,6) # x,y為左上角座標,w,h表示人臉寬度和高度 for(x,y,w,h) in faces: # 檢測到人臉繪製成藍色矩形 img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) # 寫入檔案 cv2.imwrite('/Users/fangzhijie/Pictures/ig1.jpeg',img)filename = 'ig.jpeg'detect(filename)複製程式碼
圖片處理前 |
---|
圖片處理後 |
剩下的三位沒有識別出來,待定位原因。
3、影像匹配
搜尋模板圖片
原圖
程式碼
# -*- coding: utf-8 -*-import cv2import numpy as npfrom matplotlib import pyplot as plt# 讀取圖片img = cv2.imread('ig.jpeg')template = cv2.imread('wsc123.png')# 對圖片進行縮放,縮放到合適大小90*90template = cv2.resize(template, (90, 90),interpolation=cv2.INTER_CUBIC)# 進行影像匹配res = cv2.matchTemplate(img,template,eval('cv2.TM_CCOEFF'))# 記錄模板的寬度和高度w, h = template[:,:,0].shape[::-1]# 王思聰邊框的具體位置min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)# 畫出紅框top_left = max_locbottom_right = (top_left[0] + w, top_left[1] + h)imgplt = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)cv2.rectangle(imgplt,top_left, bottom_right, 255, 2)# 顯示圖片plt.imshow(imgplt)plt.title('Detected results'), plt.xticks([]), plt.yticks([])plt.show()複製程式碼
結果