卷积模板的翻译 matlab练习程序(图像滤波时的边界处理)
日期:2023-03-11 12:39:36 / 人气: 561 / 发布者:成都翻译公司
这就是图像和模板卷积时的所有关系。看似好像要写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
- 英国签证护照翻译模板 英国签证材料的英文版还需要盖章吗?2023-03-11
- 离婚证证翻译模板 第二次结婚是否需要带离婚证2023-03-11
- 高考证明翻译模板 出国留学高考成绩证明翻译需要注意什么2023-03-11
- 四六级写作翻译高分模板分享一 实力杠杠的,咸师四六级超高分学霸!2023-03-11
- 套翻译专题模板 2019考研英语十大经典翻译句型2023-03-11
- 加拿大留学签证户口本翻译模板 加拿大护照翻译公证模板_加拿大护照翻译样本中文2023-03-11
- 生日邀请函模板带翻译 关于英文邀请函范文2023-03-11
- 毕业证翻译2023-03-11


