Rainyboy 发表于 2013-11-7 06:53

两张照片相互卷积可以得到与它们都相似的图片吗?[附代码和素材]

本帖最后由 Rainyboy 于 2013-11-7 18:36 编辑

这个帖子的出发点是,有一和朋友闲聊到卷积,在网上搜了一下,看到了这样的链接:



其中的一个帖子是:
http://blog.csdn.net/augusdi/article/details/12438247在这些帖子中,并未对这一论点作更深入的阐述,当然,如果从他们的角度出发,得出这个结论还是是又道理的:
1,卷积满足交换律 conv(A,B) = conv(B,A);
2,conv(A,B) 可以看做是以B为滤波器,对A进行滤波,那么说得到的图象“像”A应该问题不大;
3,由于卷积的交换律,也可以将conv(A,B)看做是以A为滤波器对B进行滤波,那么我们似乎也可以说得到的图象“像”B;
4, 综上,就可以说conv(A,B)得到的图象既像A又像B了。

=========================================
这事儿在我理解起来有点怪,就是按照上述观点,B和自己做卷积之后得到的应该‘既像B又像B’,那他就是B了?这是不是意味着:
conv(B,B) = B (??)
但是根据卷积的性质, B只有和DELTA函数(只在一点值为1,其余点值为零的函数)作卷积之后才可能得到B自己:
conv(B,DELTA) = B

这是怎么一回事呢?到底两张照片相互卷积可以得到与它们都相似的图片吗?
不是有句话叫“Talk is cheap, show me the code”么?那咱们就找两张照片来卷积吧!!
如果你有更好的例子可以证明和证伪“两张照片相互卷积可以得到与它们都相似的图片”,都来讨论讨论吧!
=========================================

首先介绍我们的试验图片(均来自网络……无意冒犯):
   


两张照片的像素都是一样的(260*220),都是灰度,导入到程序中就是两个二维数组。

==============测试所用到的基本代码 (Python)==============

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import scipy.signal as spysg
import numpy as np

def makepic(img1,img2):
    plt.figure(1)
    plt.imshow(img1,cmap='gray')
    plt.colorbar()
    plt.figure(2)
    plt.imshow(img2,cmap='gray')
    plt.colorbar()
    son = spysg.fftconvolve(img2,img1,mode='full')
    plt.figure(3)
    plt.imshow(son,cmap='gray')
    plt.colorbar()
    plt.show()

==============测试一:用等大小的图相互卷积=================

imboy = mpimg.imread('boy.jpg')
imgirl = mpimg.imread('girl.jpg')
makepic(imboy,imgirl)

这是结果:



==============测试二:用不等大小的图相互卷积=================

测试一有一个问题,虽然他确实是两张图的卷积,但是由于他们大小一样,补零造成的边缘效应导致其中只有一个点没有收到补零的影响。为了解决这个问题,在测试二中将女同学的图片复制几张,再与男同学的图片做卷积:
参加卷积的图是:


结果仍然很遗憾(中间较亮的区域就是所谓的有效数据):

涉及到的代码是:
def extendim(img):
    M,N = img.shape
    big_img = np.zeros((M*2,N*2))
    for i in range(0,2):
      for j in range(0,2):
            Mi = M*i
            Ni = N*j
            big_img = img[:,:]
    return big_img

以及:
imboy = mpimg.imread('boy.jpg')
    imgirl = mpimg.imread('girl.jpg')
    big_imgirl = extendim(imgirl)
    makepic(imboy,big_imgirl)

==============测试三:与自己作卷积=================
让我们再回答在刚开始提出的反例,看看男同学自己与自己卷积发生了省什么,
很遗憾,仍然是混沌未开的样子:



==============讨论一============================

我们先来看看正如提到的那个反例中所说的,男同学的图与DELTA函数作卷积:
男同学的图就不充重复了,这个是参与卷积的DELTA函数的图片:


那个唯一取值为1(白色)的点在图片的左上角。这是卷积结果:

涉及的代码是:
imgirl = mpimg.imread('boy.jpg')
    im = np.zeros_like(imgirl)
    im=1
    makepic(im,imgirl)


==============讨论二============================
这里我们考虑这样的图片:

其中有一个方块(5*5)的取值都是1,与我们的女同学作卷积,结果是:

对比可以发现,结果的图象变虚了:

这是由于上述过程使得新图片的每一个点的值都是原图对应位置周围25个点的求和,相当于一个低通滤波器……

==============讨论三============================
如果我们拿这个图去参与卷积:

就会得到:


这个图大概可以说明卷积运算的过程……就是将其中的一个(矩阵/向量)图将另一个图(矩阵/向量)的作为权值,求和,再平移一位,接着重复加权求和,这样遍历完所有的点……这个过程在线性系统求响应(信号滤波、结构的瞬态响应)中经常发生。

用简单的矩阵作为滤波器,得到的结果还可以称得上与原图相像,但是可以想象,如果用很复杂的图(男生的图)去与女生的图作卷积,图已经被“滤波”得面目全非了……应该已经谈不上“像”谁了吧?


====================================
看来仅仅用卷积是不能如愿了,那么,大概应该怎样做才能得到既像你又像他的图片呢?

百度google了一下,这里有一个方案,与卷积有关:
http://cs.brown.edu/courses/cs143/2011/results/proj1/djf/



大概思路是:
C = conv(A,低通滤波器)+ conv(B,高通滤波器)

这样,大概来说,C从远处看将体现出A的特征,在近处将体现出B的特征。
各位可以移步看看,即便如此,要想做到开头那些帖子中讲的“可以用于考试作弊”的程度……恐怕还有差距,而且其中还涉及滤波器截止频率的选择等技巧。

另一些就是最近比较火的“平均脸"技术了,也就是把B和A的图片来算一个平均脸了。
但是平均脸技术……看上去要比直接把两张图做卷积复杂得多……我并非业内人士,大家可以自己检索……

比较简单的有这个:
http://blog.csdn.net/dsbatigol/article/details/9162131
其中甚至还用到了“人眼对齐算法”


稍学术点的有这个:
http://wenku.baidu.com/link?url=qrv2_oER1rsZWCuNhDoKlkeV-P9gsJzfbIJse2ETCNcbp_klMqe4UxIOSOIi0mbsw432ktlhWnkrvz14b_FdC2YppJrgqsrmhUob9Z4fPbO
其中还涉及了对面部特征点的采样

====================================
总之,卷积也许有一千个奇妙八百种功用,但说把两个人的图片直接卷积就可以拿去骗监考官,我觉得有点过了,你觉得呢?




hero9641 发表于 2013-11-7 09:04

Talk is cheap, show me the code~~

寂寞的部落 发表于 2013-11-10 09:48

{:{39}:}
页: [1]
查看完整版本: 两张照片相互卷积可以得到与它们都相似的图片吗?[附代码和素材]