Python-OpenCV 处理图像(六)(七)(八):对象识别 图像灰度化处理 图像二值化处理
為了加快處理速度,在圖像處理算法中,往往需要把彩色圖像轉換為灰度圖像。
0x00. 灰度圖
灰度數字圖像是每個像素只有一個采樣顏色的圖像,這類圖像通常顯示為從最暗黑色到最亮的白色的灰度。
灰度圖像與黑白圖像不同,在計算機圖像領域中黑白圖像只有黑白兩種顏色,灰度圖像在黑色與白色之間還有許多級的顏色深度。
在RGB模型中,如果R=G=B時,則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值。
0x01. 灰度化的方法
1. 分量法
將彩色圖像中的三分量的亮度作為三個灰度圖像的灰度值,可根據應用需要選取一種灰度圖像。
F1(i,j) = R(i,j)?
F2(i,j) = G(i,j)?
F3(i,j) = B(i,j)
代碼示例:
import cv2.cv as cv image = cv.LoadImage('mao.jpg') b = cv.CreateImage(cv.GetSize(image), image.depth, 1) g = cv.CloneImage(b) r = cv.CloneImage(b)cv.Split(image, b, g, r, None) cv.ShowImage('a_window', r)cv.WaitKey(0)2. 最大值法
將彩色圖像中的三分量亮度的最大值作為灰度圖的灰度值。
F(i,j) = max(R(i,j), G(i,j), B(i,j))
代碼示例:
image = cv.LoadImage('mao.jpg') new = cv.CreateImage(cv.GetSize(image), image.depth, 1) for i in range(image.height):for j in range(image.width):new[i,j] = max(image[i,j][0], image[i,j][1], image[i,j][2]) cv.ShowImage('a_window', new) cv.WaitKey(0)3.平均值法
將彩色圖像中的三分量亮度求平均得到一個灰度值。
F(i,j) = (R(i,j) + G(i,j) + B(i,j)) / 3
代碼示例:
image = cv.LoadImage('mao.jpg') new = cv.CreateImage(cv.GetSize(image), image.depth, 1) for i in range(image.height):for j in range(image.width):new[i,j] = (image[i,j][0] + image[i,j][1] + image[i,j][2])/3 cv.ShowImage('a_window', new) cv.WaitKey(0)4.加權平均法
根據重要性及其它指標,將三個分量以不同的權值進行加權平均。由于人眼對綠色的敏感最高,對藍色敏感最低,因此,按下式對RGB三分量進行加權平均能得到較合理的灰度圖像。
F(i,j) = 0.30R(i,j) + 0.59G(i,j) + 0.11B(i,j))
代碼示例:
image = cv.LoadImage('mao.jpg') new = cv.CreateImage(cv.GetSize(image), image.depth, 1) for i in range(image.height):for j in range(image.width):new[i,j] = 0.3 * image[i,j][0] + 0.59 * image[i,j][1] + 0.11 * image[i,j][2] cv.ShowImage('a_window', new) cv.WaitKey(0)上面的公式可以看出綠色(G 分量)所占的比重比較大,所以有時候也會直接取G 分量進行灰度化。
代碼示例:
image = cv.LoadImage('mao.jpg') new = cv.CreateImage(cv.GetSize(image), image.depth, 1) for i in range(image.height):for j in range(image.width):new[i,j] = image[i,j][1] cv.ShowImage('a_window', new) cv.WaitKey(0)—————————————傲嬌的分割線———————————————
0x00. 特征識別
這里主要用到兩個函數:
GoodFeaturesToTrack?和?extractSURF
-
GoodFeaturesToTrack: 在圖像中尋找具有大特征值的角點。
-
SURF算法: 是一個穩健的圖像識別和描述算法。
總之這倆個我目前也不清楚能用來干嘛,以后用到了在更新吧。
import cv2.cv as cv import mathim = cv.LoadImage("img/church.png", cv.CV_LOAD_IMAGE_GRAYSCALE) im2 = cv.CloneImage(im)# Goodfeatureto track algorithm eigImage = cv.CreateMat(im.height, im.width, cv.IPL_DEPTH_32F) tempImage = cv.CloneMat(eigImage) cornerCount = 500 quality = 0.01 minDistance = 10corners = cv.GoodFeaturesToTrack(im, eigImage, tempImage, cornerCount, quality, minDistance)radius = 3 thickness = 2for (x,y) in corners:cv.Circle(im, (int(x),int(y)), radius, (255,255,255), thickness)cv.ShowImage("GoodfeaturesToTrack", im)#SURF algorithm hessthresh = 1500 # 400 500 dsize = 0 # 1 layers = 1 # 3 10keypoints, descriptors = cv.ExtractSURF(im2, None, cv.CreateMemStorage(), (dsize, hessthresh, 3, layers)) for ((x, y), laplacian, size, dir, hessian) in keypoints:cv.Circle(im2, (int(x),int(y)), cv.Round(size/2), (255,255,255), 1)x2 = x+((size/2)*math.cos(dir))y2 = y+((size/2)*math.sin(dir))cv.Line(im2, (int(x),int(y)), (int(x2),int(y2)), (255,255,255), 1)cv.ShowImage("SURF ", im2)cv.WaitKey(0)0x01. 人臉識別
可以使用 OpenCV 訓練好的級聯分類器來識別圖像中的人臉,當然還有很多其他的分類器:例如表情識別,鼻子等,具體可在這里下載:
OpenCV分類器
具體使用代碼:
#import library - MUST use cv2 if using opencv_traincascade import cv2# rectangle color and stroke color = (0,0,255) # reverse of RGB (B,G,R) - weird strokeWeight = 1 # thickness of outline# set window name windowName = "Object Detection"# load an image to search for faces img = cv2.imread("mao.jpg")# load detection file (various files for different views and uses) cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")# preprocessing, as suggested by: http://www.bytefish.de/wiki/opencv/object_detection # img_copy = cv2.resize(img, (img.shape[1]/2, img.shape[0]/2)) # gray = cv2.cvtColor(img_copy, cv2.COLOR_BGR2GRAY) # gray = cv2.equalizeHist(gray)# detect objects, return as list rects = cascade.detectMultiScale(img)# display until escape key is hit while True:# get a list of rectanglesfor x,y, width,height in rects:cv2.rectangle(img, (x,y), (x+width, y+height), color, strokeWeight)# display!cv2.imshow(windowName, img)# escape key (ASCII 27) closes windowif cv2.waitKey(20) == 27:break# if esc key is hit, quit! exit()效果:
——————————————————賣萌的分割線——————————————————
0x00. 圖像二值化
圖像二值化就是將圖像上的像素點的灰度值設置為0或255,也就是將整個圖像呈現出明顯的黑白效果。
將256個亮度等級的灰度圖像通過適當的閾值選取而獲得仍然可以反映圖像整體和局部特征的二值化圖像。
圖像的二值化有利于圖像的進一步處理,使圖像變得簡單,而且數據量減小,能凸顯出感興趣的目標的輪廓。
0x01. 圖像二值化處理
在將圖像二值化之前需要將其先灰度化,示例代碼:
import cv2.cv as cv image = cv.LoadImage('mao.jpg')new = cv.CreateImage(cv.GetSize(image), image.depth, 1) for i in range(image.height):for j in range(image.width):new[i,j] = max(image[i,j][0], image[i,j][1], image[i,j][2])cv.Threshold(new, new, 10, 255, cv.CV_THRESH_BINARY_INV) cv.ShowImage('a_window', new) cv.WaitKey(0)0x02. cv.Threshold
cv.Threshold(src, dst, threshold, maxValue, thresholdType)
函數 cvThreshold 對單通道數組應用固定閾值操作。
該函數的典型應用是對灰度圖像進行閾值操作得到二值圖像。
參數說明:
src:原始數組 (單通道 , 8-bit of 32-bit 浮點數)。 dst:輸出數組,必須與 src 的類型一致,或者為 8-bit。 threshold:閾值 maxValue:使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。 threshold_type:閾值類型 threshold_type=CV_THRESH_BINARY:如果 src(x,y)>threshold ,dst(x,y) = max_value; 否則,dst(x,y)=0; threshold_type=CV_THRESH_BINARY_INV:如果 src(x,y)>threshold,dst(x,y) = 0; 否則,dst(x,y) = max_value. threshold_type=CV_THRESH_TRUNC:如果 src(x,y)>threshold,dst(x,y) = max_value; 否則dst(x,y) = src(x,y). threshold_type=CV_THRESH_TOZERO:如果src(x,y)>threshold,dst(x,y) = src(x,y) ; 否則 dst(x,y) = 0. threshold_type=CV_THRESH_TOZERO_INV:如果 src(x,y)>threshold,dst(x,y) = 0 ; 否則dst(x,y) = src(x,y).
from:?https://segmentfault.com/a/1190000003755089
https://segmentfault.com/a/1190000003755100
https://segmentfault.com/a/1190000003755115
總結
以上是生活随笔為你收集整理的Python-OpenCV 处理图像(六)(七)(八):对象识别 图像灰度化处理 图像二值化处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python-OpenCV 处理图像(四
- 下一篇: Python-OpenCV 处理视频(一