積分影象和卷積實現
阿新 • • 發佈:2019-02-17
積分圖?
即是當前位置的畫素值是為左上角到當前位置的畫素總和,用途有計算haar特徵、濾波等
程式程式碼:
def integral(img): rows,cols=img.shape[0],img.shape[1] integral_img=np.zeros((rows,cols)).astype("uint32") for i in range(rows): for j in range(cols): sum1=0 for k in range(i+1): for p in range(j+1): sum1+=img[k,p] integral_img[i,j]=sum1
這樣的寫法很不符合python,for迴圈能避免儘量避免
numpy 用一句可以 實現:
intergal_image=np.cumsum(np.cumsum(img,0),1)
卷積?
影象卷積即是濾波,有三種方式:valid、same 、full
卷積後的圖大小=1+(影象大小-卷積核大小+2*p)/s
程式碼如下:
def conv(image,filter_mask,padding): h,w=image.shape[:] if padding==False: result=[] for i in range(0,h-len(filter_mask)+1): r=[] for j in range(0,w-len(filter_mask)+1): r.append(image[i,j]*filter_mask[0,0]+image[i,j+1]*filter_mask[0,1] +image[i,j+2]*filter_mask[0,2]+image[i+1,j]*filter_mask[1,0]+ image[i+1,j+1]*filter_mask[1,1]+image[i+1,j+2]*filter_mask[1,2] +image[i+2,j]*filter_mask[2,0]+image[i+2,j+1]*filter_mask[2,1] +image[i+2,j+2]*filter_mask[2,2]) result.append(r) if padding==True: image_new=np.zeros((h+2,w+2)) image_new[0:h,0:w]=image result=[] for i in range(0,h+2-len(filter_mask)+1): r=[] for j in range(0,w+2-len(filter_mask)+1): r.append(image_new[i,j]*filter_mask[0,0]+image_new[i,j+1]*filter_mask[0,1] +image_new[i,j+2]*filter_mask[0,2]+image_new[i+1,j]*filter_mask[1,0]+ image_new[i+1,j+1]*filter_mask[1,1]+image_new[i+1,j+2]*filter_mask[1,2] +image_new[i+2,j]*filter_mask[2,0]+image_new[i+2,j+1]*filter_mask[2,1] +image_new[i+2,j+2]*filter_mask[2,2]) result.append(r) return np.array(result)