卷積功能的實現

卷積是圖像處理經常用到的功能,在圖像濾波、銳化等方面經常使用,今天使用MATLAB寫自己的卷積函數。

下面首先介紹一下卷積的原理:

如圖(圖從網上下載,侵刪),卷積就是模板在所處理的圖像上進行滑動,從而實現圖像的濾波、銳化等功能。圖中的卷積模板爲prewitt模板,將圖像中元素與卷積模板上的對應元素相乘之和作爲輸出,替代圖像中與卷積模板對應區域中心的元素。

常用的卷積模板有:sobel、prewitt、Roberts等。

下面使用MATLAB使用[1/9,1/9,1/9;1/9,1/9,1/9;1/9,1/9,1/9]模板對圖像進行平滑處理:

function conv_pic=my_conv(pic,filter)
%實現卷積過程
%其中pic爲輸入的圖像,filter爲卷積核,conv_pic爲卷積之後輸出的圖像
pic=double(pic);
[raw1,col1,w]=size(pic);
[raw2,col2]=size(filter);
for num=1:w
conv_pic(:,:,num)=zeros(raw1-(raw2-1),col1-(col2-1));
for i=(raw2-1)/2+1:(raw1-(raw2-1)/2)-1
    for j=(col2-1)/2+1:(col1-(col2-1)/2)-1
        for m=1:raw2
            for n=1:col2
                conv_pic(i,j,num)=conv_pic(i,j,num)+filter(m,n)*pic((i-(raw2-1)/2+m-1),(j-(col2-1)/2+n-1),num);
            end
        end
    end
end
end

最後對自己寫的卷積函數和MATLAB自帶的卷積函數進行比較:

clear all;clc;close all
%卷積功能比較(自帶卷積函數和自己寫的卷積函數)
pic=imread('tiananmen1.bmp');
filter=[1/9,1/9,1/9;1/9,1/9,1/9;1/9,1/9,1/9];
%使用自己的函數進行卷積
conv_pic=my_conv(pic,filter);
conv_pic=uint8(conv_pic);
imshow(conv_pic);
%使用MATLAB自帶的函數進行卷積
for i=1:3
conv_pic_bi(:,:,i)=conv2(pic(:,:,i),filter);
end
conv_pic_bi=uint8(conv_pic_bi);
figure
imshow(conv_pic_bi);

下面爲輸出結果的比較:

                                                                               自己寫的卷積函數輸出的結果  

                                                                                  內置卷積函數輸出的結果 

可以看出處理效果非常相近,但是使用自己寫的卷積函數處理速度慢了很多(使用了大量循環)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章