ZCA Whitening with opencv和java

drs*_*ein 10 java opencv scala image-processing

我正在尝试实现如下所示的ZCA Whitening算法:如何实现ZCA Whitening?在Scala中使用opencv的Python(使用Java api)但是我找不到那里使用的大部分函数(phython with numpy).

到目前为止,我试过这个:

正在加载图像:

val input = Imgcodecs.imread(img)
Imgproc.cvtColor(input, input, Imgproc.COLOR_BGR2GRAY)
input.convertTo(input, CvType.CV_64FC1)
Run Code Online (Sandbox Code Playgroud)

然后应用算法:

//Covariance matrix
val covar, mean = new Mat()
Core.calcCovarMatrix(input, covar, mean, Core.COVAR_NORMAL | Core.COVAR_ROWS) 
Core.divide(covar, new Scalar(input.rows - 1), covar)

//Singular Value Decomposition
val w, u, vt = new Mat()
Core.SVDecomp(covar, w, u, vt, Core.SVD_FULL_UV)

//#Whitening constant, it prevents division by zero
val  epsilon = 1e-5
Run Code Online (Sandbox Code Playgroud)

实施最后的转型

ZCAMatrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + epsilon)), U.T))
Run Code Online (Sandbox Code Playgroud)

我尝试过:

var ZCAMatrix = new Mat
Core.add(w, new Scalar(epsilon), ZCAMatrix)
Core.sqrt(ZCAMatrix, ZCAMatrix)
Core.divide(1.0, ZCAMatrix, ZCAMatrix)
Core.gemm(Mat.diag(ZCAMatrix), u.t, 1, new Mat, 0, ZCAMatrix)
Core.gemm(u, ZCAMatrix, 1, new Mat, 0, ZCAMatrix)
Run Code Online (Sandbox Code Playgroud)

然后将转换应用于原始图像:

val output = new Mat
Core.gemm(ZCAMatrix, input, 1, new Mat, 0, output)
Run Code Online (Sandbox Code Playgroud)

这个转变的结果是: 这个

这不是它应该是什么.有人可以帮忙吗?