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=https://www.cnblogs.com/myy-0/p/0 常量法,value = https://www.cnblogs.com/myy-0/p/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 = https://www.cnblogs.com/myy-0/p/pd.concat([data_minmax, data_test.iloc[:, 3]], axis=1)
concat():將兩組元素合成一組,兩組元素需要放進一個[]中,
結合方式由axis=決定,axis = 1,列結合,行數不變,axis=0,行結合,列數不變
test.index = range(test.shape[0]) #重置測驗集的編號
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/3811.html
標籤:其他
