本科微积分教材中讲过卷积定理,公式也非常容易背: 如果:
所以在要分别对
在这里,我们通过在矩阵水平与垂直正方向补
这一步可以跟上一步一起用函数fft2解决:
H = fft2(h, a+c-1, b+d-1);X = fft2(x, a+c-1, b+d-1);这里fft2函数会自动扩充,然后进行变换。一开始以为是在原矩阵四周同时补0,后来经过验证发现MATLAB只在矩阵两个方向把0补齐即可。
直接看代码:
G = X.*H;g = ifft2(G);% 产生最大的结果,对应"full"% 产生与x大小一致的结果,对应"same"gf = g(floor((c-1)/2+1):floor((c+2*a-1)/2), floor((d-1)/2+1):floor((d+2*b-1)/2));g的大小与G相同,即扩充后的大小;gf截取至g,它的大小与原始矩阵x相同。
既然是验证,这里就附上代码和结果以作验证:
x = imread('horse.jpg'); %读取原图片x = rgb2gray(x);[a, b] = size(x);figure, imshow(x); title('原图像');c=5; d=5;h = fspecial('gaussian', [c,d]) %产生点扩散函数%产生空域卷积结果gc = conv2(x, h, 'same'); %gc = conv2(x, h);产生最大的结果,对应"full"figure, imshow(gc/255); title('卷积');% 用fft验证H = fft2(h, a+c-1, b+d-1);X = fft2(x, a+c-1, b+d-1);G = X.*H; %点乘g = ifft2(G);% 与G大小一致的结果,对应"full"% 产生与x大小一致的结果,对应"same"gf = g(floor((c-1)/2+1):floor((c+2*a-1)/2), floor((d-1)/2+1):floor((d+2*b-1)/2));figure, imshow(gf/255);%% 为了验证两种方式结果是否一致,将gf,gc做差显示出来figure, imshow(abs(gf-gc)/255);经过验证,最后一张图像几乎全黑,意味这两种方式计算的结果是一致的。
C = conv2(x, h, shape);
命令 | 结果大小 |
---|---|
‘full’ | [a+c-1, b+d-1] |
‘same’ | [a, b] |
‘valid’ | [a-c+1, b-d+1] |
抽时间把conv2()具体怎么计算的讲明白。
新闻热点
疑难解答