我正在尝试实现如下所示的ZCA Whitening算法:How to implement ZCA Whitening? Python在Scala中使用opencv(使用Java api)但是我找不到那里使用的大部分函数(python with numpy)。
到目前为止,我试过这个:
将图片加载为Mat:
val input = Imgcodecs.imread(img)
Imgproc.cvtColor(input, input, Imgproc.COLOR_BGR2GRAY)
input.convertTo(input, CvType.CV_64FC1)
然后应用算法:
//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
实施最后的转型
ZCAMatrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + epsilon)), U.T))
我尝试过:
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)
然后将转换应用于原始图像:
val output = new Mat
Core.gemm(ZCAMatrix, input, 1, new Mat, 0, output)
这不完全是它应该是的。 有人可以帮忙吗?