卷积模板的翻译 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

  • 法国签证营业执照翻译件模板 你与申根签证只有一条推送的距离
  • 江苏省增值税发票翻译模板 江苏税务局出口货物退(免)税申报管理系统软件
  • 肄业证书翻译模板 复旦大学学生学业证明文书管理细则(试行)
  • 四级英语作文模板带翻译 大学英语四级翻译模拟训练及答案
  • 社会某信用代码证翻译模板 js验证某社会信用代码,某社会信用代码 验证js,js+验证+社会信用代码证
  • 美国移民证件翻译模板 日语签证翻译聊聊身份证翻译模板
  • 翻译软件模板 人类史上*实用的的文档快速翻译指南
  • 江苏省增值税发票翻译模板 江苏出口货物退(免)税申报管理服务平台
  • 瑞士签证房产证翻译件模板 瑞士探亲签证—就读子女
  • 日语户口本翻译模板 户口本翻译价格_户口本翻译一般多少钱?
  • 卷积模板的翻译 matlab练习程序(图像滤波时的边界处理) www.chinazxzy.com/fymb/7513.html
    
    本站部分内容和图片来源于网络用户和读者投稿,不确定投稿用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的权利,请联系:chinazxzy@163.com,及时删除。
    Go To Top 回顶部
    • 扫一扫,微信在线