1. 程式人生 > >影象處理 之 探索 與 驗證 拉普拉斯運算元(Laplace)與 Hessian矩陣特徵值 之間的關係

影象處理 之 探索 與 驗證 拉普拉斯運算元(Laplace)與 Hessian矩陣特徵值 之間的關係

目錄

引言

      5.結論

引言

      數學:驗證矩陣對角線元素和等於特徵值之和

      應用而言:給定影象,計算他的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")