天天看點

opencv-python 指靜脈的ROI擷取(拟合手指中線加旋轉)

閱讀過我的上一篇部落格後,都知道應該如何在canny處理後提取到我們的手指輪廓,剔除背景輪廓了,還沒看的點這裡上一篇部落格

 然後我們要做的事情很簡單,就是拟合手指的中線,并且旋轉我們原來的圖像以待進一步的處理。

中線的獲得:

我拟合中線的辦法就是采取手指每一對上下(兩側)輪廓的平均值,然後将這個中間位置的坐标記錄下來。

import cv2 as cv
import numpy as np
import math
import  my_algorithm as my

clahe_test=cv.imread('clahe_test.bmp',0)
test_edges=cv.Canny(clahe_test,90,150)

finger_edges=my.get_edges(test_edges)
finger_center=my.get_centerline(finger_edges)
show=cv.add(finger_edges,finger_center)
cv.imshow('show',show)
cv.imshow('finger_edges',finger_edges)
cv.imshow('finger_center',finger_center)
cv.waitKey(0)
cv.destroyAllWindows()
           

 這是效果圖

opencv-python 指靜脈的ROI擷取(拟合手指中線加旋轉)

這裡用到了我自己寫的方法,get_edges和get_centertline,兩個方法都類似,可以參考上一篇部落格。上一篇沒有寫到get_centerline這個方法,我這裡貼一下

def get_centerline(img):   # img : single channel img which has been processed by get_edges
    rows,cols=img.shape
    coord=[]
    for i in range(cols):
        temp_index=np.argwhere(img[:,i]==255)
        temp_index=temp_index.tolist()
        center_position=round((temp_index[0][0]+temp_index[1][0])/2)
        temp_index.clear()
        coord.append([center_position,i])
    #print(coord)
    points=np.array(coord)
    #return points
    result_img=np.zeros((rows,cols),dtype="uint8")
    
    for j in coord:
        result_img[j[0],j[1]]=255
    return result_img
           

實際使用的時候需要把  #return points 前的#删除 ,這樣函數傳回的就是一組可以用于直線拟合的坐标了

 圖檔的旋轉:

得到了中線後,我們可以開始将這一系列點放入cv.fitline()之中進行拟合了,需要了解有關fitline()的簡單使用,可以點選我的這篇部落格。

finger_edges=my.get_edges(test_edges)
points=my.get_centerline(finger_edges)
line =cv.fitLine(points,cv.DIST_L2,0,0.01,0.01)       
line_test=cv.line(finger_edges,(line[2]-1000*line[1]/line[0],line[2]-1000),(line[2]+1000*line[1]/line[0],line[2]+1000),255)
           

 拟合後:

opencv-python 指靜脈的ROI擷取(拟合手指中線加旋轉)

然後對圖檔的旋轉直接采用opencv中自帶的方法就可以了,簡單貼一下代碼

rows,cols=clahe_test.shape
angle = math.atan(line[1]/line[0])*180/math.pi
angle= 90-angle if angle>0 else -90-angle
M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),angle,1)
dst = cv.warpAffine(clahe_test,M,(cols,rows))
cv.imshow("show",dst)
           

 效果:

opencv-python 指靜脈的ROI擷取(拟合手指中線加旋轉)

可以看到after_rotation的右上角出現了一點點縫隙,而這正是往直線傾斜方向的相反方向進行的旋轉說明旋轉成功了。

點個贊哦親~

繼續閱讀