使用opencv和java进行ZCA美白

时间:2016-09-06 15:00:15

标签: java scala opencv image-processing

我正在尝试实现如下所示的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)

thei转换的结果是:this

这不完全是它应该是的。 有人可以帮忙吗?

0 个答案:

没有答案