前言

一维反卷积(deconv),可以很好的实现一维卷积的反过程!但是二维反卷积就很难恢复了!为什么呢?因为我们知道二维卷积计算的过程就是:卷积核不断滑动,卷积核不断与原始数据中的小矩阵做"点乘并求和";现假设卷积核为3x3,那么每一个和它点乘的小矩阵对应尺寸也是3x3。现在我们只知道"卷积核里的9个数"和这两个小矩阵"卷积操作后"的"一个"数值结果!也就说是"小矩阵里的9个元素"都还是"未知的"!这个方程没办法解的,也就没办法恢复原矩阵的。

网上关于二维反卷积实现的方法

这里的二维反卷积更像是一种别的操作,它已经不符合"(一维)卷积与反卷积的定义了!所以这种操作的"实际意义也还不明确"(Matlab中也没有自带的相关命令)。本文纯粹是把其方法实现,不深究其结果和意义。

首先二维反卷积的输入是"二维卷积处理后的图像矩阵",卷积核还是"原先的卷积核"。二维反卷积分两步:1. 预处理:卷积核翻转180°,原始图像矩阵每个元素扩0边,操作如图1所示;2. 卷积计算,操作如这里所示。

图1:预处理操作

Matlab编程实现

可以看出二维反卷积操作其实非常简单,其对应的处理一张二维图片矩阵的操作如下(这里是对3通道的彩图处理的):

clc; clear;

% 卷积核

k = [1 1 1;1 -8 1;1 1 1]; % "强边缘锐化"卷积核

data = imread('zxc.jpg'); % 数据——最好比卷积核的尺寸大

figure(1);

imshow(data);

data = double(data);

% 输入的数据:

data1 = data(:,:,1);

data2 = data(:,:,2);

data3 = data(:,:,3);

% 二维卷积:

result1 = conv2(data1, k, 'same');

result2 = conv2(data2, k, 'same');

result3 = conv2(data3, k, 'same');

result = cat(3, result1, result2, result3);

figure(2);

image(result);

% 反卷积开始: 卷积和不变, 输入变成3个result

size_k = size(k);

bc = fix(size_k(1)/2) % 单点周围扩大的边长

x = data1;

% x = [8 11 13 1 1 1 2;5 26 17 2 2 3 2;39 12 11 1 3 4 5]

size_x = size(x);

rowx = size_x(1);

colx = size_x(2);

% 扩展后尺寸:

kz1 = zeros(rowx+(rowx-1)*bc+bc*2,colx+(colx-1)*bc+bc*2);

kz2 = zeros(rowx+(rowx-1)*bc+bc*2,colx+(colx-1)*bc+bc*2);

kz3 = zeros(rowx+(rowx-1)*bc+bc*2,colx+(colx-1)*bc+bc*2);

% 注意上式扩边的写法,为了保证通用性(任意扩边长度均可实现)

size_kz = size(kz1);

rowkz = size_kz(1);

colkz = size_kz(2);

% 将原数值按对应位置插回去:

fprintf('反卷积拓边开始:\n')

countn = 1;

countm = 1; % 行与列的计数器(方便理解)

mtmp = bc*countm;

ntmp = bc*countn; % 这两个临时变量是记录x原数据的坐标

for m = bc+1:bc+1:rowkz

for n = bc+1:bc+1:colkz

kz1(m,n) = x(m-mtmp,n-ntmp); % 对应位置插进去

kz2(m,n) = x(m-mtmp,n-ntmp);

kz3(m,n) = x(m-mtmp,n-ntmp);

countn = countn + 1;

ntmp = bc*countn;

end

countm = countm + 1;

mtmp = bc*countm;

% 列序号记得恢复(因为列的新一轮开始了)

countn = 1;

ntmp = bc*countn;

end

% 卷积(反卷积中的一步):

fprintf('反卷积中卷积开始:\n')

fresult1 = zeros(rowkz,colkz);

fresult2 = zeros(rowkz,colkz);

fresult3 = zeros(rowkz,colkz);

k = rot90(rot90(k));

for mm = bc+1:rowkz-bc

for nn = bc+1:colkz-bc

t1 = kz1(mm-bc:mm+bc,nn-bc:nn+bc);

t2 = kz2(mm-bc:mm+bc,nn-bc:nn+bc);

t3 = kz3(mm-bc:mm+bc,nn-bc:nn+bc);

fjuan1 = sum(k.*t1);

fjuan2 = sum(k.*t2);

fjuan3 = sum(k.*t3);

fresult1(mm,nn) = sum(fjuan1(:));

fresult2(mm,nn) = sum(fjuan2(:));

fresult3(mm,nn) = sum(fjuan3(:));

end

end

fresult1 = fresult1(bc:rowkz-bc,bc:colkz-bc);

fresult2 = fresult2(bc:rowkz-bc,bc:colkz-bc);

fresult3 = fresult3(bc:rowkz-bc,bc:colkz-bc);

fresult = cat(3, fresult1, fresult2, fresult3);

figure(3);

imshow(fresult)

结果图没什么意义,就不展示了。"zxc.jpg"图片在这里。

二维反卷积 matlab,二维反卷积的实现(实际意义不明确)相关推荐

  1. matlab 二维样条插值函数,matlab中二维插值函数interp2的使用详解

    下面是一段产生log-normal分布的代码,以此进行说明. clear all; clc; for t=1:100 Traffic(t) =curve(t); end MaxTraffic = ma ...

  2. matlab 多维数组 滤波,matlab多维数组的处理......

    1.一个三维数组由行.列和页三维组成,其中每一页包含一个由行和列构成的二维数组. 2.利用标准数组函数创建多维数组 A=zeros(4,3,2) 生成一个4行3列2页的三维全0数组,ones,rand ...

  3. matlab画二维图彩图,matlab二维图形绘制.pdf

    MATLAB 绘二维图 数据可视化的目的在于:通过图形,从一堆杂乱的离散数据中观察数 据间的内在关系,感受由图形所传递的内在本质. MATLAB 一向注重数据的图形表示,并不断地采用新技术改进和完备其 ...

  4. 二维有限体积 matlab,二维有限体积法计算热传导及源码.pdf

    二维有限体积法计算热传导及源码 //#include "stdafx.h" #include #include #include #include #include using n ...

  5. Matlab二维循环卷积程序 cconv2

    在处理时域点积的傅里叶变化等于频域卷积问题时,需要用到循环卷积. matlab 中循环卷积(cconv(A,B))是离散傅里叶对应的卷积,在处理离散傅里叶逆变时非常好用. 但Matlab 没有提供二维 ...

  6. pytorch方法测试——卷积(二维)

    pytorch方法测试--卷积(二维) 测试代码: import torch import torch.nn as nnm = nn.Conv2d(2, 2, 3, stride=2) input = ...

  7. matlab二维谐振子,基于有限差分法求解的二维谐振子的MATLAB程序如下。哪位大神能帮我做个注明啊,完全看不懂啊,,急...

    基于有限差分法求解的二维谐振子的MATLAB程序如下.哪位大神能帮我做个注明啊,完全看不懂啊,,急0 ____丿呆呆丶2017.04.15浏览20次分享举报 tic clc clear L=20; W ...

  8. matlab中二维散点图,MATLAB实例:二维散点图

    MATLAB实例:二维散点图 用MATLAB实现简单的散点图的绘制,可以自行设置点的形状与颜色,可以去掉坐标轴边框. 数据来源:MATLAB高斯混合数据的生成 将二维数据保存为gauss.txt. 1 ...

  9. MATLAB二维绘图(二)向图中添加标题,坐标轴,图标和文字信息

    MATLAB二维绘图(二)向图中添加标题,坐标轴,图标和文字信息 1.添加标题.图例.x轴信息和y轴信息,示例: %% 添加标题 clear; clc; close all; x = 0:0.1:2* ...

最新文章

  1. 让PHP更快的提供文件下载
  2. 基于FPGA的HDB3编译码器设计
  3. 微服务架构与领域驱动设计应用实践
  4. CSS知识点个人总结(不断更新)
  5. 【hash】Seek the Name, Seek the Fame
  6. 使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据
  7. Linear Programming_the simplex method in tableau format
  8. payara 创建 集群_使用Payara Micro的Easy Java EE Microservices
  9. Spring 定时任务的几种实现
  10. html城市手机搜索,原生js实现html手机端城市列表索引选择城市
  11. OC相关-02:oc和c的基本差异
  12. Python基本知识
  13. “echo ”和“echo ”的区别
  14. Starting Programe
  15. python爬取网易云评论_Python - 网易云热门评论爬取
  16. 虚拟内存怎么设置最好?虚拟内存设置多少合适
  17. hazelcast 搭建_SpringBoot整合Hazelcast实现分布式缓存
  18. Go和Rust计算性能大比武
  19. HTML学习总结 基础篇 图像标签imag的使用及其属性
  20. 阿里云服务器如何购买?三种方式可买(图文教程举例)

热门文章

  1. CMake入门二——子目录的嵌套
  2. sqlserver2000换成mysql_将SQL Server 2000数据导入到MySQL 5.5的方法
  3. Redis:我是如何与客户端进行通信的
  4. android progressdialog 点击不消失,ProgressDialog不消失在Android应用程序
  5. jdk环境变量配置完成后,如何检验?
  6. UESTC 1339 郭大侠与线上游戏
  7. 天刀一醉轩服务器维护多久,天涯明月刀手游服务器名字有哪些
  8. 计算机二级access公共基础知识,计算机二级ACCESS考试
  9. 一建有什么刷题软件,怎么备考?
  10. 不动点迭代法和牛顿迭代法