SIFT尺度不變特徵轉換 影像中的局部特徵
Digitization數位化:用3步驟,將float像素值數位化為數位影像
物體經由鏡片投影產生影像(連續的), 生成取樣影像(像素位置是離散的、色彩值是連續的),量化將色彩值轉為離散數值
取樣(產生離散的位置x,y)+量化(每個位置得到離散的色彩值0~255)=數位影像可表示為二維矩陣,矩陣中的每一個元素稱為 像素 I(x,y) MxN矩陣>> x=0M-1;y=0N-1 有M個row + N個colum
數位影像的品質:
數位影像的類別:由量化(bit)數決定
cv2.imread()
讀
同個目錄下'name.jpg';其他目錄:'檔案路徑';0:gray imge/1:color/-1:alpha channelcv2.imshow()
秀cv2.imwrite()
存cv2.waitKey(delay)
接受一個按鈕事件並返回按鈕的ASCII碼; delay=1000:延遲1秒 0:延遲時間無窮大
cv2.destroyWindow(winname)
關閉某視窗
e.g.
超過0~255範圍 會不自然
圖片的型態img.shape
:秀出圖像的長垂直、寬水平、色彩(灰階1 黑白2 彩色3)
cv2.imwrite("outname.jpg",img)
存檔,搭配 cv2.waitkey(0)
使用-按某鍵存檔:
Python openCV uses BGR mode 顯示各個通道的圖像
b,g,r=cv2.split(img)
把3種通道分割開來img2=cv2.merge(b,g,r)
合併成3種通道(彩色影像)cv2.imgshow()
先切割BGR的通道>>有三個 長*寬 的矩陣,裡面分別放0~255的數字 單獨抓某個通道會是灰階圖片
所以要把其他兩個通道清空(放0),再與某通道合併,才能呈現單獨某色的圖像
cap=cv2.VideoCapture(0)
create攝影機物件object
ret,frame=cap.read()
回傳兩個值(bool/numpy.array)
cap.release()
釋放幀;關閉攝影機
cap.isOpened()
檢查攝影機是否啟動
cap.open()
開啟攝影機
cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
將影像轉成灰階
cv2.VideoWriter(output_name,int fourcc,fps,size,全彩:true or flase)
np.multiply()
一個一個相乘
C=np.transpose (B)
一般矩陣乘法:要先轉置 讓基底相同
result_1= np.matmul (A , C)
矩陣相乘
元素都是0的矩陣 np.zeros(shape,dtype =float)
元素都是1的矩陣 np.ones(shape,dtype =float)
隨機陣列 np.random.randint(low最小值(含),high(不含),size維度,dtype=int)
e.g. 20x40的黑色區域
HW23.用內建的相機捕捉20秒的影片並儲存.
cv2.getTickCount ()函數向我們返回從參考事件發送到調用cv2.getTickCount()函數的時間的時鐘信號計數。
要計算代碼塊執行的時間,我們可以使用cv2.getTickCount()在代碼塊的開頭和結尾計算時鐘信號的數量,並將其差值除以頻率,可以使用cv2.getTickFrequency ()函數。
cv2.getTickCount()
計算兩次getTickCount()之間的時鐘數量/頻率 cv2.getTickFrequency ()
=時間
e.g.呈上,再秀出b、g、r三種通道的影像
np.zeros_like(matrix)
創造與matrix相同形狀的矩陣,但元素皆是0
cap.get(cv2.CAP_PROP_FRAME_WIDTH)
捕捉相機長寬
ROI:region-of-interest
img[200:300,400:500]
>>> X:200~300 Y:400~500 之間的範圍
cv2.addWeighted(img1,a,img2,i-a,gamma)
影像融合(兩張圖片大小要相同)
cv2.line()
cv2.circle()
cv2.rectangle()
矩形cv2.ellipse()
橢圓cv2.putText()
h,s,v=cv2.splite(img)
y,cr,cb=cv2.split(img)
cv2.cvtColor(bgr,cv2.COLOR_BGR2HSV)
cv2.cvtColor(bgr,cv2.COLOR_BGR2YCR_CB)
cv2.createTrackbar('滑桿名稱','windows_name',min,max,Fn)
在視窗上產生滑桿 滑動時執行Fn程式
cv2.getTrackbarPos('滑桿名稱','視窗名稱')
取得滑桿的位置
cv2.bitwise_and(frame,frame,msak=mask)
cv2.inRange(img,lowerb,upperb)
抓取特定範圍的顏色
齊次座標 :X、Y方向之外 再加一個分量 ,讓所有變換都可以透過矩陣乘法來表示 用 變換矩陣 transformation matrix 來達成(矩陣乘法)
縮放
平移 沿(x,y)方向移動:移動量(tx,ty)
np.float32([ [1,0,100],[0,1,50] ])
cv2.warpAffine(img,M,(clos,rows) )
執行變換
cv2.getRotationMatrix2D( (x,y),Θ,比例)
將圖像在在水平垂直方向剪切,實現扭曲和變形
np.reval()降維:多維降成1維
捲積
前處理:二值化
A是原始影像 B是結構化元素(可以自行定義)
cv2.erode(ing,kernel,iterations=1)
可以用來 去除雜訊
cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
例:
可以用來 捕小洞
cv2.morfhologyEx(img,v2.MORPH_CLOSE,kernel)
矩形
cv2.getStructuringElement(cv2.MORPH_RECT(5,5))
橢圓
十字形
功能: