影象處理 之 探索 與 驗證 拉普拉斯運算元(Laplace)與 Hessian矩陣特徵值 之間的關係
阿新 • • 發佈:2019-02-05
目錄
引言
數學:驗證矩陣對角線元素和等於特徵值之和
應用而言:給定影象,計算他的Hessian矩陣,Laplace運算元 = Hessian矩陣的特徵值之和。
即:Laplace= EigenOfHessian
一、矩陣一階偏導數
1. X軸方向
編寫程式碼:
def gradx(Img, sx = 1.0): return sx * (Img[1: , : ] - Img[ :-1, : ])
2. Y軸方向
編寫程式碼:
def grady(Img, sy = 1.0):
return sy * (Img[ : , 1: ] - Img[ : , : -1])
二、矩陣二階偏導數
1. X軸方向上二階偏導
編寫程式碼:
def gradxx(img, sx = 1.0):
return sx ** 2 * (img[2 : ] + img[ : -2] - 2 * img[1 : -1])
2. Y軸方向上二階偏導
編寫程式碼:
def gradyy(img, sy = 1.0): return sy ** 2 * (img[ : , 2: ] + img[ : , :-2] - 2 * img[ : ,1:-1])
3.第一次在X軸方向上求偏導,第二次在Y軸方向上求偏導
編寫程式碼:
def gradxy(img, sx = 1.0, sy = 1.0):
return sy * sx * ((img[:-1, :-1]+img[1:,1:])-(img[:-1,1:]+img[1:,:-1]))
4.第一次在Y軸方向上求偏導,第二次在X軸方向上求偏導
此章節自行驗證,可以得出,Dxy與Dyx其結果是一致的。
5.結論
三、拉普拉斯運算元(Laplace)
編寫程式碼:
def laplace(img, sx = 1.0, sy = 1.0): return gradxx(img, sx) + gradyy(img, sy)
四、Hessian矩陣
1.影象的Hessian矩陣
根據定義,可知:
2.Hessian矩陣的特徵值(2個)
設lambda為Hessian矩陣的特徵值,則該矩陣的特徵多項式為:
並且當它為0時有非零解,即:
求解lambda:
3.驗證推論A
五、程式碼(全部)
# -*- coding: utf-8 -*-
"""
Created on Mon Jul 2 15:13:18 2018
@author: Diko
"""
import numpy
from skimage import data,color
def dxx(img ,sx = 1.0):
return sx**2*(img[2:] + img[:-2] - 2*img[1:-1])
def dyy(img ,sy = 1.0):
return sy**2*(img[:,2:] + img[:,:-2] - 2*img[:,1:-1])
def dxy(img ,sx = 1.0, sy = 1.0):
return sx*sy*(img[1:,1:] + img[:-1,:-1] - img[1:,:-1] - img[:-1,1:])
def laplace(img, sx =1.0, sy = 1.0):
return (dxx(img, sx)[:,:-2] + dyy(img, sy)[:-2,:])
def eigenOfHessian(img, sx = 1.0, sy = 1.0):
lam = numpy.empty([2, img.shape[0]-2, img.shape[1]-2])
H11, H12, H21, H22 = dxx(img, sx)[:,:-2], dxy(img,sx,sy)[:-1,:-1], dxy(img, sx,sy)[:-1,:-1], dyy(img, sy)[:-2,:]
A, B, C = 1, -(H11 + H22), H11*H22 - H12*H21
de = numpy.sqrt(B**2 - 4*A*C)
lam1 = (-B + de)/(2*A)
lam2 = (-B - de)/(2*A)
lam = lam1, lam2
return lam
if __name__ == "__main__":
epsilon = 1e-10
pictures = [color.rgb2gray(data.chelsea()),color.rgb2gray(data.astronaut()),color.rgb2gray(data.camera())]
for pic in pictures:
error = numpy.ones([pic.shape[0]-2,pic.shape[1]-2])*epsilon
if((numpy.abs(laplace(pic,1.0,1.0)-numpy.sum(eigenOfHessian(pic,1.0,1.0),0))<error).all()):
print("true")