import cv2 #opencv讀取的格式是BGR
import numpy as np
一、#讀入文件
img=cv2.imread('cat.jpg') #’’引號內是圖片所在盤的地址+名字,如:D:/1.jpg
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #轉換成灰度圖
二、#得到圖片的信息 高,寬,通道數
img_gray.shape
三、#圖片顯示
cv2.imshow('image',img)
cv2.imshow("img_gray", img_gray) #顯示窗口設置,"img_gray"窗口名字,img_gray需要顯示的文件
四、關閉窗口
cv2.waitKey(0) #參數為0:按鍵關閉窗口,參數為>0的為顯示0ms
五、#創建Windows
窗口cv2.destroyAllWindows()
六、#圖片保存
cv2.imwrite('mycat.png',img) #參數1:保存地址,參數2:需要保存的文件名
七、打開視頻
vc = cv2.VideoCapture('test.mp4') #一個參數,如果是地址,則打開視頻,如果參數為0,則是打開攝像頭
八、 vc = cv2.VideoCapture('test.mp4')
if vc.isOpened(): # 檢查是否打開正確
oepn, frame = vc.read() #返回兩個參數,open打開的狀態,frame打開后的文件
else:
open = False
while open:
ret, frame = vc.read()
if frame is None:
break
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('result', gray)
if cv2.waitKey(100) & 0xFF == 27:
break
vc.release()
cv2.destroyAllWindows()
九、#圖片切片,相當於裁剪
cat=img[0:50,0:200]
十、邊界填充
top_size,bottom_size,left_size,right_size = (50,50,50,50) #定義參數值(上下左右的填充尺寸)
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE) #填充函數
填充模式:1、cv2.BORDER_REPLICATE :復制法,復制最邊緣的像素
2、cv2.BORDER_REFLECT :反射法,abcd | dcba
3、cv2.BORDER_REFLECT_101 :反射法 abcd | cba
4、cv2.BORDER_WRAP :外包裝法 abcd |abcd
5、cv2.BORDER_CONSTANT, value=0 常量法,value = 0 (黑) =1(白) =2 (紅)
十一、img_cat2= img_cat +10 #讀取到的圖片是一組像素數組,可以進行 加減法操作
img_cat2= img_cat +img_cat #同維數組可以進行相加
十二、res = cv2.resize(img, (0, 0), fx=4, fy=4) #改變照片的像素大小。 (0,0)固定值,Fx x軸放大倍數
img_dog = cv2.resize(img_dog, (500, 414)) #(value1 , value2) 想要改到的像素大小
十三、res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0) #圖片融合, 0.4指cat的權重,0.6是dog的權重,0指偏移量
十四、圖像閾值處理(全局)
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
img_gray:輸入的圖片,需要是灰度圖
thresh1 :輸出的圖片
Thresh = 127 閾值,既比較值,通常取127
Maxval = 255,
模式: 1、cv2.THRESH_BINARY, 大於Thresh ,取maxval。反之取 0
2、cv2.THRESH_BINARY_INV, 與1相反
3、cv2.THRESH_TRUNC 大於Thresh ,取maxval。反之不變
4、cv2.THRESH_TOZERO 大於Thresh ,不變。反之取0
5、cv2.THRESH_TOZERO_INV 與4相反
局部: dst = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
超大圖像二值化: 利用FOR循環進行分塊全局(局部)二值化
cw=256,; ch=256; h,w=image.shape[:2]; gary=cv.cvtColor(image,cv.COLOR_BGR2GRAY);
for row in range(0,h,ch): for col in range(0,w,cw): roi = gray[row:row+ch, col:col+cw]
dst = cv.ada... gray[row:row+ch, col:col+cw] = dst
十五、圖像平滑處理
1、均值濾波,簡單的平均卷積操作
blur = cv2.blur(img, (3, 3)) img 源文件,(3,3)指3*3的單位矩陣,常用奇數來進行平滑處理
2、方框濾波,
box = cv2.boxFilter(img,-1,(3,3), normalize=True) -1 指原通道不變, (3,3)同上,
normalize=True 是否進行歸一化處理,True 效果好
3、高斯濾波
aussian = cv2.GaussianBlur(img, (5, 5), 1)
4、中值濾波
median = cv2.medianBlur(img, 5) 5 指 5*5矩陣
十六、矩陣拼接,(圖像的拼接)
res = np.hstack((blur,aussian,median)) 括號內指的是所需要拼接的圖片
hstack 橫向拼接 vstack 縱向拼接
十七、腐蝕操作
kernel = np.ones((3,3),np.uint8) #稱為 ‘核’,用3*3的矩陣去腐蝕,矩陣數可變
erosion = cv2.erode(img,kernel,iterations = 1) #iterations 迭代次數,既腐蝕的次數
十八、膨脹操作
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
十九、開運算與閉運算(可以去噪聲)
先腐蝕后膨脹 稱為開運算,通過調節矩陣的大小,可以提取圖像中的橫、豎線段,刪除曉得干擾。
先膨脹后腐蝕 稱為閉運算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.MORPH_OPEN 指開運算模式, cv2.MORPH_CLOSE 指閉運算
二十、梯度操作 (膨脹 - 腐蝕)
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
二十一、禮帽:原始數據 - 開運算
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
黑帽:閉運算 - 原始數據
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
二十二、計算圖像梯度
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
dx = 1 dy=0 指計算x軸方向
dx = 0 dy=1 指計算y軸方向 不建議x = 1 dy=1 指計算x,y軸方向
Ksize 指Sobel 算子的大小 ,通常取3、5、7
sobelx = cv2.convertScaleAbs(sobelx) #求絕對值
分別求出x ,y軸的梯度,並且得到絕對值,然后再兩個梯度結合在一起
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) # 0.5指的是權重
二十三、其他算子
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0) #scharr 算子,用法同 sobel
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian) #laplacian 拉普拉斯算子有別於前兩種
二十四、Canny 邊緣檢測
1、使用高斯濾波器,平滑圖像,除燥
2、計算像素點的梯度強度和方向
3、應用非極大值抑制,消除邊緣檢測帶來的雜散響應
4、應用雙閾值檢測來確定真實的邊緣 推薦高低閾值比 T2/T1 =3:1 or2:1
5、通過抑制孤立的弱邊緣,來最終完成邊緣檢測
v1=cv2.Canny(img,80,150)
gaussian = cv.GaussianBlur(image, (3,3), 0)
gray = cv.cvtColor(gaussian, cv.COLOR_BGR2GRAY)
xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0)
ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
edge_output = cv.Canny(xgrad, ygrad, 80, 150)
cv.imshow('edge', edge_output)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
output = cv.Canny(gray, 80, 150)
二十五、圖像金字塔
1、高斯金字塔
up=cv2.pyrUp(img) 向上采樣法,放大
down=cv2.pyrDown(img) 向下采樣法,縮小
2、拉普拉斯金字塔
原始數據 減去 (原始數據先DOWN 再 UP)
二十六、圖像輪廓
binary, contours, hierarchy = cv2.findContours(image, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
binary :得到的二值圖像, contours :輪廓信息, hierarchy :層級
Image : 灰度圖
Mode:輪廓檢索模式
1、RETR_EXTERNL :只檢測最邊緣的輪廓
2、RETR_LIST :檢測所有,並保存在一條
3、RETR_CCOMP :檢測所有,並將他們組織兩層,頂層是各部分的外部邊界,第二層是空洞的邊界
4、RETR_TREE :檢測所有的,並重構嵌套輪廓的整個層次。常用
Method : 輪庫逼近方法
cv2.CHAIN_APPROX_NONE : 以Freemen鏈碼方式輸出輪廓,所有其他方法輸出多邊形
cv2.CHAIN_APPROX_SIMPLE :壓縮水平的,垂直的,斜的部分,函數只保留他們的終點部分
#傳入繪制圖像,輪廓,輪廓索引,顏色模式,線條厚度# 注意需要copy,要不原圖會變。。。
img = cv2.imread('contours.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) 二值化
binary, contours, hierarchy = cv2.findContours(image, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
draw_img 復制原圖, contours:得到的輪廓, -1:所有的輪廓全部畫出,
(0,0,255)用紅色畫出, 2 指線寬
二十七、輪廓信息
cnt = contours[0]
cv2.contourArea(cnt) #面積
cv2.arcLength(cnt,True) #周長,True表示閉合的
幾何中心 mm = cv.moments(cnt)
cx = mm[‘m10’] / mm[‘m00’]
cy = mm[‘m01’] / mm[‘m00’]
cv.circle(image, (np.int(cx)), np.int(cy), 3, (0, 255, 255), -1)
二十八、邊界矩形
cnt = contours[0]
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
二十九、模板匹配
res = cv2.matchTemplate(img,template,1)
Img:原始圖, template:模板圖,既裁剪圖,
Mode:
- TM_SQDIFF 計算出的值越小越好
- TM_CCORR 計算出的值越大越好
- TM_CCOEFF 越大越好
- TM_SQDIFF_NORMED 接近0好
- TM_CCORR_NORMED 接近1好
- TM_CCOEF_NORMED 接近1好
image = cv.imread('D:/3.jpg') #得到原數據
ima_template = image.copy()[200:300, 200:300] #得到模板數據
th, tw = ima_template.shape[:2] #得到模板的長、寬
res = cv.matchTemplate(image, ima_template, cv.TM_CCORR_NORMED) #進行模板匹配,返回數據RES
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res) #根據模式不同而選擇不同的參數
t1 = max_loc #參數實例化
br = (t1[0] + tw, t1[1] + th) #得到矩形另一個對角
cv.rectangle(image, t1, br,(0, 0, 255), 2) #在原圖像中畫出模板
cv.imshow('1', image) #顯示
三十、圖像直方圖
img = cv2.imread('D:/3.jpg', 0) 第一個參數是文件路徑,第二個參數為0指灰度圖,不使用第二個參數時指彩圖
hist = cv2.calcHist([img],[0],None,[256],[0,256])
Img:原圖像,格式為uint-8,或者float32。用[]括起來
channels 如果傳入的是灰度圖,用[0]. 彩圖可以用[0][1][2]他們分別對應着BGR
Mask 掩模圖像。直方圖就把它為None。
histSize :Bin數目, ranges:像素范圍常數范圍 常為[0,256]
color = ('blue', 'green', 'red')
for i, color in enumerate(color):
hist = cv.calcHist([image], [i], None, [256], [0, 256])
plt.plot(hist, color=color)
plt.xlim([0, 256])
plt.show()
直方圖反向投影:(HSV與RGB色彩空間)
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
hist = cv.calcHist([hsv], [0,1], None, [180, 256], [0, 180, 0, 256])
三十一、創建Mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img, img, mask=mask) #與操作
三十二、將圖片通過直方圖的形式展現出來
equ = cv2.equalizeHist(img) #圖片均衡化操作
plt.hist(equ .ravel(),256) #通過直方圖展現
Plt.show()
三十三、自適應直方圖均衡化(分別進行局部均衡化)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) #創建自適應均衡化方式
res_clahe = clahe.apply(img) #自適應均衡化
三十四、傅里葉變換
高頻:變化劇烈的灰度分量,例如邊界 低通濾波:只保留低頻,會使圖像模糊
低頻:變化緩慢的灰度分量 高通濾波:只保留高頻,會使圖像細節增強
Opencv中主要就是cv2.dft() 和cv2.idft() ,輸入圖像需要先轉化成np.float32格式
得到的結果中頻率為0的部分會在左上角,通常要轉換到中心位置,可以通過shift變換來實現。
Cv2.dft()返回的結果是雙通道的(實部和虛部),通常還需要轉換成圖像格式才能展示(0,255)
三十五、圖像特征-harris角點檢測
cv2.cornerHarris(img, blockSize, Ksize, k)
Img:數據類型為float32的圖像 (先轉換為灰度圖,再轉成32位)
blockSize:角點檢測中指定區域的大小, 使用2 指2*2矩陣
Ksize:Sobel求導中使用的窗口大小 默認 3
K :取值參數為[0.04 ,0.06] 默認值0.04
三十六、SIFT函數
sift = cv2.xfeatures2d.SIFT_create() 實例化SIFT
kp = sift.detect(image,None) image 灰度圖
Img = cv2.drawWeypoints(image,kp,img)
Kp,des=sift.compute(image,kp) 計算特征
Print(np.array(kp).shape)
三十七、背景建模
1、幀差法:由於場景中的目標在運動,目標的影響在不同圖像幀中的位置不同。該類算法對時間上連續的兩幀圖像進行差分運算,不同幀對應的像素點相減,判斷灰度差的絕對值,當絕對值超過一定的閾值時,即可判斷為目標運動,從而實現目標檢測。
2、混合高斯模型:在進行前景檢測前,先對背景進行訓練,對圖像中每個背景采用一個混合高斯模型進行模擬,每個背景的混合高斯的個數可以自適應,然后再檢測階段,對新的像素進行GMM匹配,如果該像素能夠匹配其中一個高斯,則認為是背景,否則認為是前景。由於整個過程GMM 模型再不斷更新學習中,所以對動態背景有一定的魯棒性。
三十八、光流估計
光流是空間運動物體在觀測成像平面上的像素運動是瞬時速度,根據各個像素點的速度矢量特征,可以對圖像進行動態分析(目標跟蹤)。
函數:cv2.calcOpticalFlowPyrLK()
參數:precImage 前一幀圖像 nextImage 當前幀圖像
prevPts 待跟蹤的特征點向量 winSize 搜索窗口的大小
maxLevel 最大的金字塔層數
返回:nextPts 輸出跟蹤特征點向量 status 特征點是否找到,找到狀態為1,未找到狀態為0
三十九、創建一個照片
Img = np.zeros([400,400,3],np.uint8) 大小是400*400,3通道,8位
或者 img = np.ones([400, 400, 1], np.uint8)
Img[:,:,0] = np.ones([400,400])*127 改變創建圖片的顏色
img.fill(100) 為每一個像素點賦值 100
四十、查看程序運行的時間
1、t1 = cv2.getTickCount() 2、t2 = cv2.getTickCount()
3、time = (t2 - t1) / cv2.getTickFrequency() 4、print('time:%s ms'%(time / 100))
四十一、像素取反
ima = cv2.bitwise_not(image)
四十二、色彩轉換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度圖
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) HSV
yuv = cv2.cvtColor(image, cv2.COLOR_BGR2YUV) YUV
ycrb = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb) YCRB
四十三、色彩分離
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) #在HSV格式下
Low_hsv = np.array([37,43,46])
Upper_hsv = np.array([77,255,2555]) #創建兩個參數,在函數中進行篩選作用
Mask = cv2.inRange(hsv, Low_hsv, Upper_hsv)
四十四、算術運算
ima3 = cv.add(ima1,ima2) ima4 = cv.subtract(ima1,ima2)
ima5 = cv.divide(ima1, ima2) ima6 = cv.multiply(ima1, ima2)
邏輯運算:
cv.bitwise_and() cv.bitwise_or()
cv.bitwise_not() cv.bitwise_xor()
四十五、自定義模糊處理
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) #銳化算子
kernel = np.ones((5, 5), np.float32)/25 #自定義模糊算子
dst = cv.filter2D(image, -1, kernel=kernel)
四十六、EPF (可用於美顏)
高斯雙邊保留 dst = cv.bilateralFilter(image, 0, 100, 15) 顏色邊界選大一些的100, 空間邊界選小的 15
均值遷移 dst = cv.pyrMeanShiftFiltering(image, 10, 50)
四十七、分水嶺算法
輸入圖像---> 灰度變換(除燥)---> 二值化---> 距離變換---> 尋找種子---> 生成MASK--->
---> 分水嶺變換---> 輸出圖像
距離變換 dist = cv.distanceTransform(mb, cv.DIST_L2, 3)
Mb:需要距離變換的圖像,cv.DIST_L2 變換模式, 3:掩模,卷積核
dist_output = cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)
四十八、人臉檢測
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #傳入灰度圖
#人臉檢測包
face_detector = cv.CascadeClassifier('G:/python/Anaconda3/Library/etc/haarcascades/haarcascade_frontalface_alt_tree.xml')
faces = face_detector.detectMultiScale(gray, 1.02, 3)
{ gray待檢測圖像, 1.02:圖像放大倍數 3:當3次監測到屬於人臉,則確定是人臉}
for x, y, w, h in faces: #通過FOR循環,畫出人臉
cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
{image:畫在原圖像中 (x , y):起點, (x + w, y + h):終點 (0, 0, 255):顏色 2:線寬}
cv.imshow('face', image)
四十九、數字驗證碼識別
from PIL import Image
import pytesseract as tess
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, thresh1 = cv.threshold(gray, 140, 255, cv.THRESH_BINARY_INV)
kernel = np.ones((1, 2), np.uint8)
open = cv.morphologyEx(thresh1, cv.MORPH_OPEN, kernel, iterations=1)
cv.bitwise_not(open, open) #取反
text_Image = Image.fromarray(open) #變成text圖像
text = tess.image_to_string(text_Image) #轉換成數字
print('驗證碼為:{}'.format(text))
基於Haad + Adaboost 人臉識別
什么是特征:特征=像素經過運算得到的結果,可以是具體的值,向量,多維向量
1、Haar特征:
特征=白色-黑色
特征=整個區域*權重1+黑色-*權重2 權重1=1,權重2=-2
特征=(p1-p2-p3+p4)*w
2、SVM支持向量機
本質是尋求一個最優的超平面進行分類
3、KNN算法(K-近鄰算法):
工作原理:給定一個已知的標簽類別的訓練數據集,輸入沒有標簽的新數據后,在訓練集中找到與新數據最鄰近的K個實例,如果這K個實例的多數屬於某個類別,那么新數據就屬於這個類別。
1、構建數據 構建一個字典類型的數據
2、計算已知數據類型中的數據點與當前數據之間的距離
movie_data_1_2 = movie_data.iloc[:6, 0:2] 選取字典中的0:6行,0:2列的數據
列求和 :.sum(0) 行求和 :.sum(1) 當有多個因素決定距離時,需要求得綜合的距離
3、#確定前K個數據的類別出現的頻率
re = dr.loc[:, 'label'].value_counts()
4、數據歸一化,
有多個特征進行參考時,且每一個特征是同樣重要,所以要進行歸一化處理,使得多個特征的權重相同
方法:0-1標准化, Z-score標准化 Sigmoid壓縮法
0-1標准化
data = pd.concat([data_minmax, data_test.iloc[:, 3]], axis=1)
concat():將兩組元素合成一組,兩組元素需要放進一個[]中,
結合方式由axis=決定。axis = 1,列結合,行數不變。axis=0,行結合,列數不變
test.index = range(test.shape[0]) #重置測試集的編號