Opencv 圖像處理


cmd.exe  安裝命令行

》pip install opencv-python

》pip install tensorflow  

》pip install keras      必須安裝tensorflow基礎之上

 

板塊一、

     幾何圖形(cv2 圖像處理)

 

圖片導入;
圖片長寬通道數學;
圖片裁剪;
圖片輸出;
圖片保存文件;

tu = cv2.imread('image.jpg')
(h,w,t)=tu.shape
print(tu.shape)
cX,cY = (w//2,h//2)
print(cX)
tl = tu[0:cY,0:cX]
tr = tu[0:cY,cX:w]
bl = tu[cY:h,0:cX]
br = tu[cY:h,cX:w]
def zzImage(zhou):
    plt.imshow(zhou)
    plt.axis('off')
    plt.show()
zzImage(br)
#   裁剪順序  先y,再x

cv2.imwrite('newImage.jpg',image)

 封裝常用函數 代碼塊(.py文件)

包含圖片旋轉代碼

 
import cv2
import matplotlib.pyplot as plt
import numpy as np

#讀取圖片
def imgRead(src):
   src = cv2.imread(src)
   return cv2.cvtColor(src,cv2.COLOR_BGR2RGB)
#顯示圖片
def imgShow(img):
    plt.imshow(img)
    plt.axis('off')
    plt.show()
def imgWrite(Img):
    return cv2.imwrite('newImage.jpg',Img)



img = imgRead('face.png')
imgShow(img)
#imgWrite(img)

#看圖片的信息 
(h,w,t)=img.shape  
print(img.shape)
#得出圖片的中心點
cX,cY=(w//2,h//2)
#寫一個 動作 ,旋轉動作   (旋轉中心點,旋轉角度,縮放的倍數)
Action = cv2.getRotationMatrix2D((cX,cY),90,1.0)
#外容器執行旋轉動作  存儲圖片
img = cv2.warpAffine(img,Action,(w,h))
imgShow(img)
View Code

 使用引入格式: from 文件名 import *

設置圖片大小+等比例算法: imgW = 80
imgH = int(img.shape[0]*imgW/img.shape[1])
img= cv2.resize(img,(imgW,imgH))
show(img)
print(img.shape)

人臉檢測方法初學:

#定義人臉檢測方法
def check(image):
    detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')  #寫入這個 簡單的xml文件
    rects = detector.detectMultiScale(image,scaleFactor=1.1,minNeighbors=3,minSize=(10,10),flags=cv2.CASCADE_SCALE_IMAGE)
    for (x,y,w,h) in rects:
          cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)
img = imread('Solvay.jpg')       
check(img)
show(img)

 

板塊二、

     一、畫圖

導包 import numpy as np
import cv2
import matplotlib.pyplot as plt
顯示函數 def show(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()
創建一個 300 300 畫布 image = np.zeros((300,300,3),dtype='uint8')
畫線 green = (0,255,0)
cv2.line(image, (0,0), (300,300), green)
正方形 -1 為填充 cv2.rectangle(wrap,(3,3),(296,296),(120,120,120),5)
(cX,cY) = wrap.shape[1]//2,wrap.shape[0]//2
for i in range(0,140,15):
    cv2.circle(wrap,(cX,cY),i,green,2)
cv2.circle(wrap,(cX,cY),15,(255,0,0),-1)
show(wrap)

 content = np.zeros((300,300,3),dtype='uint8')
for z in range(15):
   #隨機的半徑
    Rban = np.random.randint(0,150)
    #隨機的圓心
    Rxin = tuple(np.random.randint(0,300,size=(2)))
    #隨機的顏色
    Rcolor = np.random.randint(0,255,size=(3)).tolist()
    cv2.circle(content,Rxin,Rban,Rcolor,-1)
show(content)

 

 二、翻轉

導包不說了 cv2  matplotlib.pyplot

水平翻轉  1

垂直翻轉  0

水平+垂直 -1

cv2.finp(image,1)

 三、裁剪

  裁剪就是:把圖片的某一塊坐標數值,存起來顯示   

       avater = image[0:0,200,200]   打印輸出

 四、圖像算術

   

加像素 add = np.ones(wrap.shape,dtype='uint8')*100
coo = cv2.add(wrap,add)
show(coo)
減像素 shan = np.ones(wrap.shape,dtype='uint8')*205
cww = cv2.subtract(wrap,shan)
show(cww)
 

 五、按位計算

與 1&1=1,1&0=0,0&1=0,0&0=0 and = cv2.bitwise_and(box1,box2)
或1|1=1,1|0=1,0|1=1,0|0=0 or = cv2.bitwise_or(box1,box2)  
異或1^1=0,1^0=1,0^1=1,0^0=0 xor = cv2.bitwise_xor(box1,box2)  
1=0,0=1  not= cv2.bitwise_not(wrap)  

 五、遮擋

#導入一張圖片

img = cv2.imread('cat.jpg')

#創建一個 跟圖片相同大小的容器

wrap = np.zeros(img.shap,dtype='uint8')

#創建一個盒子

squen = cv2.rectangle(wrap,(25,25),(250,350),白色,-1)

#進行按位計算  得出新的圖片

newImg = cv2.bitwise_and(wrap,img)

show(newImg)

   

 五、單通道切割

mm = cv2.imread('cat.jpg')
show(mm)

(R,G,B) = cv2.split(mm)
mm.shape

meraged = cv2.merge([R,G,B])
show(meraged)

cv2.imshow('R',R)
cv2.imshow('G',G)
cv2.imshow('B',B)
cv2.waitKey(0)
cv2.destroyAllWindows()
 

 六、圖像金字塔

nn = cv2.imread('image.jpg')
show(nn)
nn.shape

 



for u in range(4):
    nn = cv2.pyrDown(nn)
    print(nn.shape)
    show(nn)

for u in range(4):
    nn = cv2.pyrUp(nn)
    print(nn.shape)
    show(nn)

 七、拉普拉斯金字塔(提取圖像邊界輪廓的)

yuan = cv2.imread('image.jpg')
show(yuan)
yuan.shape

#第一次降低
down_image1 = cv2.pyrDown(yuan)
#第二次降低
down_image2 = cv2.pyrDown(down_image1)
#第三次提升
up_image = cv2.pyrUp(down_image2)
#第一次降低  減去 最后一次  得出的就是 結果
lapulasi = down_image1 - up_image
show(lapulasi)

 

 

板塊三、  形態學(卷積)

      一、Erode腐蝕     .erode()

#設置腐蝕 Erision   黑色多一點  白色小時
juxing = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
tuoyuan = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
shizi = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

imagea = cv2.erode(imga,juxing)
show(imagea)

去除白色,黑色多

     二、Dilate膨脹      .dilate()

#膨脹 dilate 黑色多一點  白色小時
juxing = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
tuoyuan = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
shizi = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

imagea = cv2.dilate(imga,juxing)
show(imagea)

去除白色,黑色多

      三、Opening開運算

#先腐蝕后膨脹
juxing = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

opening= cv2.morphologyEx(imga,cv2.MORPH_OPEN,juxing)
show(opening)

專業去除白色小點

     四、Closing閉運算 相反

#先膨脹后腐蝕
juxing = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

closing= cv2.morphologyEx(imga,cv2.MORPH_CLOSE,juxing)
show(closing)

專業去除嘿色小點

     五、先開后閉運算

#先膨脹后腐蝕
juxing = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
imgb = cv2.imread('image2.jpg')
opening= cv2.morphologyEx(imgb,cv2.MORPH_OPEN,juxing)
colseing= cv2.morphologyEx(opening,cv2.MORPH_CLOSE,juxing)
show(colseing)

 

     六、梯度運算


juxing = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

closing= cv2.morphologyEx(imga,cv2.MORPH_GRADIENT,juxing)
show(closing)

膨脹 - 腐蝕  =出現圖像的輪廓線

     七、白帽運算作用:隱藏的白色顯示

#
juxing = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

closing= cv2.morphologyEx(imga,cv2.MORPH_TopHat,juxing)
show(closing)

src - opening

     八、黑帽運算作用:隱藏的黑色顯示

#
juxing = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

closing= cv2.morphologyEx(imga,cv2.MORPH_CLOSE,juxing)
show(closing)

colseing-src

      顏色模式轉換 (RGB/HSV/LAB/GRAY)

               hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)    轉為 HSV

板塊四、  二值化(閾值)     就是講一張圖片 轉為黑白兩個顏色  形成對比

           五種簡單模式:   

gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
plt.imshow(gray,'gray')
plt.axis('off')
plt.show()

ret1,thresh1 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
ret2,thresh2 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
ret3,thresh3 = cv2.threshold(gray,127,255,cv2.THRESH_TRUNC)
ret4,thresh4 = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)
ret5,thresh5 = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO_INV)

titles = ['original','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [gray, thresh1, thresh2, thresh3, thresh4, thresh5]
plt.figure(figsize=(15,5))
for i in range(6):
    plt.subplot(2,3,i+1)
    plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.axis('off')
plt.show()
View Code

 

        作用:自動化閾值(全局閾值),相當於這個摳圖   

#自動化閾值  代碼如下:

img = cv2.imread('opencv_logo.png')
#轉換為灰度
gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
#定義 自動閾值
ret1,thresh1 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)
print('ret1',ret1)

#普通灰度
plt.imshow(gray,'gray')
plt.axis('off')
plt.show()

#打印自動閾值
plt.imshow(thresh1,'gray')
plt.axis('off')
plt.show()

#打印自動閾值
plt.imshow(thresh2,'gray')
plt.axis('off')
plt.show()

   Adaptive Thresholding自適應閾值

       我們使用是全局閾值,整幅圖像采用同一個數作為閾值。這個是 每一個區域對應一個閾值,自適應  一張圖有不同的閾值。

# 變灰度圖
image = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
# 中值濾波
image = cv2.medianBlur(image,5)
# 普通二值化
ret,th1 = cv2.threshold(image,127,255,cv2.THRESH_BINARY)
# 平均值閾值
th2 = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,3)
# 高斯閾值
th3 = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,3)
titles = ['original', 'Global Thresholding', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [image, th1, th2, th3]
plt.figure(figsize=(10,5))
for i in range(4):
    plt.subplot(2,2,i+1)
    plt.imshow(images[i],'gray')
    plt.axis('off')
    plt.title(titles[i])
plt.show()

 

 

       

   圖像梯度:OpenCV 提供了三種不同的梯度濾波器,或者說高通濾波器: Sobel,Scharr 和 Laplacian    (算子)

          出現X軸、Y軸  單向的顏色模糊模式,或者是 XY都有的  第二圖  那張。

def gradient(image):
    image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    # cv2.CV_64F輸出圖像的深度(數據類型),64位float類型,因為梯度可能是正也可能是負
    laplacian = cv2.Laplacian(image, cv2.CV_64F)
    # 1, 0表示在x方向求一階導數,最大可以求2階導數
    sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
    # 0, 1表示在y方向求一階導數,最大可以求2階導數
    sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
    titles = ['Original', 'Laplacian', 'SobelX', 'SobelY']
    images = [image,laplacian,sobelx,sobely]
    plt.figure(figsize=(10,5))
    for i in range(4):
        plt.subplot(2,2,i+1)
        plt.imshow(images[i],'gray')
        plt.title(titles[i])
        plt.axis('off')
    plt.show()

gradient(image)

 

 

 

    Canny邊緣檢測:

def edge_detection(image,minVal=100,maxVal=200):
    image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    edges = cv2.Canny(image,minVal,maxVal)
    plt.imshow(edges,'gray')
    plt.axis('off')
    plt.show()

 

 

# 自動確定閾值的一種方法
def auto_canny(image, sigma=0.33):
    v = np.median(image)
    lower = int(max(0, (1.0-sigma) * v))
    upper = int(min(255, (1.0+sigma) * v))
    edged = cv2.Canny(image, lower, upper)
    print(lower,upper)
    return edged

 

edges = auto_canny(image)
edges = cv2.GaussianBlur(edges, (3,3), 0)
plt.imshow(edges,'gray')
plt.axis('off')
plt.show()

    攝像頭畫面獲取:

import numpy as np
import cv2

#從攝像獲取 圖像畫面  
cap  = cv2.VideoCapture(0)

while(True):
    #ret 讀取成功True 或  失敗 False
    #Frame 讀取的圖像 的內容
    #讀取一幀數據
    ret,frame = cap.read()
    #變為灰度圖片
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame',gray)

# 監控鍵盤輸入,如果鍵值是 q 那么久跳出 while循環
    if cv2.waitKey(1) & 0xff == ord('w'):
            break
cap.release()
cv2.destroyAllWindows()

 

 

    視頻文件讀取:

# 從文件讀取視頻內容
cap = cv2.VideoCapture('videos/cats.mp4')
# 視頻每秒傳輸幀數
fps = cap.get(cv2.CAP_PROP_FPS)
# 視頻圖像的寬度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# 視頻圖像的長度
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(fps)
print(frame_width)
print(frame_height)

#循環讀取圖像幀
while(True):
    ret,frame = cap.read()
    if ret !=True:
        break
    cv2.imshow('frame',frame)

#waitKey()  設置圖像延遲播放  速率
    if cv2.waitKey(25) & 0xff ==  ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

 

    寫入視頻文件讀取:

           讀取視頻文件,讀取寫入的文件,將文件A 修改翻轉,寫入到文件B

import numpy as np
import cv2

# 從文件讀取視頻內容
cap = cv2.VideoCapture('videos/cats.mp4')
# 視頻每秒傳輸幀數
fps = cap.get(cv2.CAP_PROP_FPS)
# 視頻圖像的寬度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# 視頻圖像的長度
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(fps)
print(frame_width)
print(frame_height)

 

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('video/output.avi',fourcc,fps,(frame_width,frame_height))

while(True):
    ret, frame = cap.read()
    if ret==True:
        # 水平翻轉
        frame = cv2.flip(frame,0)
        out.write(frame)
        cv2.imshow('frame',frame)
        if cv2.waitKey(25) & 0xff == ord('q'):
            break
    else:
        break
out.release()
cap.release()
cv2.destroyAllWindows()

 

     10.人臉檢測Haar特征+Adaboost級聯分類器:

            Haar 就是通過移動滑塊收集特征,最小24*24,最大就是白黑白跟滑塊邊緣的寬度一致,使用卷積再滑塊盒子中移動檢測。

            攝像頭人臉檢測:

#從攝像獲取 圖像畫面  
cap  = cv2.VideoCapture(0)

detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')

while(True):
    #ret 讀取成功True 或  失敗 False
    #Frame 讀取的圖像 的內容
    ret,image = cap.read()
    #image = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    
    # 級聯分類器
    rects = detector.detectMultiScale(image, scaleFactor=1.1, minNeighbors=2, minSize=(10,10), flags=cv2.CASCADE_SCALE_IMAGE)
    for (x,y,w,h) in rects:
        # 畫矩形框
        cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)
        
    cv2.imshow('人臉識別',image)
    if cv2.waitKey(1) & 0xff == ord('w'):
            break
cap.release()
cv2.destroyAllWindows()

 

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM