卷积模板的翻译 matlab练习程序(图像滤波时的边界处理)
日期:2023-03-11 12:39:36 / 人气: 571 / 发布者:成都翻译公司
这就是图像和模板卷积时的所有关系。看似好像要写16个if判断,其实是不用的,我们只要判断卷积时模板的四个边界和图像的四个边界的关系就行了。自己写的滤波时边界处理的效果我们在编写过滤器程序时,通常会使用矩阵模板对原始图像进行卷积。这时候我们在处理图像边界时一般选择忽略边缘。但是如果模板比较大,处理效果会很差。它将是原始图像,过滤后的结果在中间。虽然用Matlab的imfilter可以解决,但还是通过过滤的原理自己实践。
模板和图像之间共有 16 种关系。我粗略地画了它们。前三个小矩形是模板卷积模板的翻译,大矩形是图像卷积模板的翻译,*后一个是大矩形,小矩形是图像。这就是卷积时图像和模板之间的所有关系。
好像是写16个if判断,不过没必要。我们只需要在卷积的时候判断模板的四个边界和图像的四个边界之间的关系。有两对相对坐标,一对是图像的卷积范围,另一对是模板的卷积范围。先说一下如何表达图像的卷积范围。如果当前处理点为(i,j),模板大小为2*r+1(我这里使用了对称奇数模板。如果模板的像素边界是偶数,处理起来会很困难,这里我简单地把奇数变成偶数,原理类似)。8个边界可以这样表示,图像为1表示图像的上边缘,m表示图像的下边缘,1表示图像的左边缘,n表示图像的右边缘,ir表示模板的上边缘,i+r表示模板的下边缘,jr表示模板的左边缘,j+r代表模板的右边缘。通过这四对的组合,你可以拥有16种关系。有关详细信息,请参阅下面的代码。结合代码看注释更清晰。
主文件
clear all; close all; clc; r=20; w=fspecial('average',[2*r+1 2*r+1]); img=imread('lena.jpg'); img=mat2gray(img); [m n]=size(img); imshow(img); imgn=filterim(img,w); figure; imshow(mat2gray(imgn)); imgn=img; for i=r+1:m-r for j=r+1:n-r imgn(i,j)=sum(sum(img(i-r:i+r,j-r:j+r).*w)); end end figure; imshow(mat2gray(imgn)); figure; img=imfilter(img,w); imshow(mat2gray(img))
filterim.m(实现主要功能):
function imgn=filterim(img,w) [r r]=size(w); [m n]=size(img); if mod(r,2)==0 r=r+1; w=imresize(w,[r r]); end imgn=zeros(m,n); r=floor(r/2); for i=1:m for j=1:n %图像需要获得四个边界的卷积范围,模板只需要获得*上面和*左面就可以了,因为图像和模板两个卷积范围是一样的。 if i-r<1 %判断模板上边缘和图像上边缘的关系 img_up=1; %如果当前像素的高小于模板的一半,那么选择图像的上边缘作为卷积图像的上边缘 mark_up=r-i+1; %模板的上边缘使用和图像相交的上边缘 else img_up=i-r; %使用当前像素的高减去模板的一半作为卷积图像的上边缘 mark_up=1; %使用模板的*上边缘作为卷积模板的上边缘 end if i+r>m %判断模板下边缘和图像下边缘的关系 img_down=m; %如果当前像素的高加上模板的一半超过整个图像的高,那么卷积图像的下边缘使用整个图像的下边缘 else img_down=i+r; %否则卷积图像的下边缘使用当前像素的高加上模板的一半 end if j-r<1 %判断模板左边缘和图像左边缘的关系 img_left=1; %如果当前像素的宽小于模板的一半,那么选择图像的左边缘作为卷积图像的左边缘 mark_left=r-j+1; %模板的左边缘使用和图像相交的左边缘 else img_left=j-r; %使用当前像素的宽减去模板的一半作为卷积图像的左边缘 mark_left=1; %使用模板的*左边缘作为卷积模板的左边缘 end if j+r>n %判断模板右边缘和图像右边缘的关系 img_right=n; %如果当前像素的宽加上模板的一般超过整个图像的宽,那么卷积图像的右边缘使用整个图像的右边缘 else img_right=j+r; %否则卷积图像的右边缘使用当前像素的宽加上模板的一半 end imgn(i,j)=sum(sum(img(img_up:img_down,img_left:img_right).*w(mark_up:mark_up+(img_down-img_up),mark_left:mark_left+(img_right-img_left))));%/((img_down-img_up+1)*(img_right-img_left+1)); %卷积图像上边缘:下边缘,左边缘:右边缘 %卷积模板上边缘:上边缘+(竖直卷积范围),卷积模板左边缘:左边缘+(水平卷积范围) end end end
说实话,写这篇评论我很纠结。我已经尽力把评论写清楚了,虽然我还是觉得没有解释清楚。我真的需要锻炼我的写作和表达能力。
下面是渲染图:
原图
自己过滤时边界处理的效果
无边界处理的通常效果
Matlab函数处理结果
我的效果基本接近matlab自带的效果,但是速度好像慢了很多。matlab自带的函数可以用汇编来处理。总之,算法是这样的。
相关阅读Relate
热门文章 Recent
- 永州正规的合同协议翻译模板 翻译版权许可合同标准样本2023-03-11
- 英语作文模板加翻译 考研英语作文万能模板说明2023-03-11
- 成绩单课程翻译模板下载 ACCAer在校英语成绩证明必备英文翻译模板!!2023-03-11
- 四级成绩证书翻译模板 英语翻译证书测验四级证书测验[优质文档]2023-03-11
- 昆特兰理工大学学位证书翻译模板 昆特兰理工大学 Kwantlen Polytechnic University2023-03-11
- 申根签证退休证翻译件模板2023-03-11
- 门诊疾病证明书翻译模板 篇四 :疾病诊断证明书和病假证明书发放管理制度2023-03-11
- 英语四级作文图表模板翻译 2012英语四级写作惊现新题型 旧方法一样能搞定2023-03-11
- 委托翻译合同模板一 委托翻译合同范本2023-03-11
- 亚马逊上产品模板翻译 创建库存文件2023-03-11


