1. 程式人生 > >OpenCV 中的影象處理

OpenCV 中的影象處理

顏色空間轉換
目標
• 你將學習如何對影象進行顏色空間轉換,比如從BGR 到灰度圖,或者從BGR 到HSV 等。
• 我沒還要建立一個程式用來從一幅影象中獲取某個特定顏色的物體。

• 我們將要學習的函式有:cv2.cvtColor(),cv2.inRange() 等。

# -*- coding: utf-8 -*-
"""
Created on Mon Jan 22 14:06:05 2018
"""

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

#opencv 讀圖
img = cv2.imread("E:\\python\\opencv\\images\\demo0.png")

#轉換顏色空間
#對於BGR$Gray 的轉換,我們要使用的flag 就是cv2.COLOR_BGR2GRAY。同樣對於BGR$HSV 的轉換,我們用的flag 就是cv2.COLOR_BGR2HSV。
#你還可以通過下面的命令得到所有可用的flag。
'''
flags=[i for i in dir(cv2) if i.startswith('COLOR_')]
print flags
'''

#注意:在OpenCV 的HSV 格式中,H(色彩/色度)的取值範圍是[0,179],S(飽和度)的取值範圍[0,255],V(亮度)的取值範圍[0,255]。但是不
#同的軟體使用的值可能不同。所以當你需要拿OpenCV 的HSV 值與其他軟體的HSV 值進行對比時,一定要記得歸一化。

#物體跟蹤
#提取的是一個藍色的物體例子
'''
cap=cv2.VideoCapture(0)
while(1):
    # 獲取每一幀
    ret,frame=cap.read()
    # 轉換到HSV
    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    # 設定藍色的閾值
    lower_blue=np.array([110,50,50])
    upper_blue=np.array([130,255,255])
    # 根據閾值構建掩模
    mask=cv2.inRange(hsv,lower_blue,upper_blue)
    # 對原影象和掩模進行位運算
    res=cv2.bitwise_and(frame,frame,mask=mask)
    # 顯示影象
    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k=cv2.waitKey(5)&0xFF
    if k==27:
        break
# 關閉視窗
cv2.destroyAllWindows()
'''

#影象平滑,OpenCV 提供的函式cv.filter2D() 可以讓我們對一幅影象進行卷積操作。
'''
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging')
plt.xticks([]), plt.yticks([])
plt.show()
'''

#這是由一個歸一化卷積框完成的。他只是用卷積框覆蓋區域所有畫素的平均值來代替中心元素。可以使用函式cv2.blur() 和cv2.boxFilter() 來完這個任務。
'''
blur = cv2.blur(img,(5,5))
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()
'''

#高斯模糊,實現的函式是cv2.GaussianBlur()。我們需要指定高斯核的寬和高(必須是奇數)。以及高斯函式沿X,Y 方向的標準差。
#如果我們只指定了X 方向的的標準差,Y 方向也會取相同值。如果兩個標準差都是0,那麼函式會根據核函式的大小自己計算。高斯濾波可以有效的從影象中去除高斯噪音。
#0 是指根據視窗大小(5,5)來計算高斯函式標準差
'''
blur = cv2.GaussianBlur(img,(5,5),0)
'''