相比上两篇文章的逆滤波解法,tensorflow的最优化解法更加高效、简明,往往构建出滤波最优化公式就可以让tensorflow自动最优化,逆向得到目标逆滤波图像。
with tf.device('/gpu:0'): initial = tf.random_normal([1,252,252,1]) * 0.256 X = tf.Variable(initial)#图像作为变量 A=tf.placeholder("float", shape=[dia,dia,1,1])#卷积核是输入常量 B=tf.placeholder("float", shape=[1,252,252,1])#滤波图像作为输入常量 mu = 0.001 loss = tf.nn.conv2d(X,A,strides=[1,1,1,1],padding='SAME') loss = loss - B loss = tf.reshape(loss,[252*252,-1]) X_ravel = tf.reshape(X,[252*252,-1]) loss = tf.nn.l2_loss(loss)+mu*tf.nn.l2_loss(X_ravel)#1/2*(A*X-B)^2+muB^2 train_op = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
其中图像大小为252x252。tensorflow中,输入图像的坐标意义为[颜色通道,x,y,批处理大小],卷积核坐标意义为[x,y,输入数据个数,输出feature map个数]。我们构建好这个L2最小化模型,启动tensorflow求解即可,几秒钟就可以得到结果。结果如下图所示,振铃现象有点重,修改L2正则化阈值可以削减振铃,但是清晰度会有影响,所以最优化就是一个协调的过程。
源码: https://github.com/artzers/MachineLearning/blob/master/Tensorflow/Least%20Square%20Deconv.ipynb