用窗函数(类比卷积核)在对图像进行操作时,会遇到尴尬的问题,图像的边处操作很容易就程序错误了,没有值……
那我们怎么办呢?莫非不处理边上无法操作的点?当然也可以,不过少处理一圈边也挺难受的。那么,我们就补上一圈吧,补上一圈就可以。
怎么补?补上一圈白的?还是一圈黑的?都会影响我们的图,我们来个镜像吧,向下面这样,影响就没那么大了。当然真的扩展边不会扩这么大,下图只是为了说明这个问题。
那么怎么扩展呢,下面咱们看一下程序
本文用的函数是
B = padarray(A,padsize,padval,direction)
A是要扩充的图像;
B是扩充后的图像;
padsize是填充多少行、多少列,例如[5,5]填充5行,5列;
padval是填充的方法,
'symmetric'表示图像大小通过围绕边界进行镜像反射来扩展;
'replicate'表示图像大小通过复制外边界中的值来扩展;
'circular'图像大小通过将图像看成是一个二维周期函数的一个周期来进行扩展。
默认用0进行填充
direction是填充的方向,
'pre'表示在每一维的第一个元素前填充;
'post'表示在每一维的最后一个元素后填充;
'both'表示在每一维的第一个元素前和最后一个元素后填充,此项为默认值。(默认)
主程序
clc
clear all
im=imread('QQ截图20190306112110.jpg');
w=601;//扩展大小
r=im(:,:,1);
g=im(:,:,2);
b=im(:,:,3);
r=im2double(r);
g=im2double(g);
b=im2double(b);
% [height,width,~]=size(im);
padsize=[(w-1)/2,(w-1)/2];
padr = padarray(r,padsize,'symmetric','both');
padg = padarray(g,padsize,'symmetric','both');
padb = padarray(b,padsize,'symmetric','both');
imk(:,:,1)=padr;
imk(:,:,2)=padg;
imk(:,:,3)=padb;
% savepath = 'D:\TONGDAO\比对\实验对比\测试1';
% sspath=[savepath, '\原.jpg'];
sspath='扩展图.jpg';
imwrite(imk,sspath);
另外一个应用程序
im=imread('QQ截图20190306112110.jpg');
w=601;//扩展大小
g=im(:,:,2);
b=im(:,:,3);
r=im2double(r);
g=im2double(g);
b=im2double(b);
[height,width,~]=size(im);
padsize=[(w-1)/2,(w-1)/2];
padr = padarray(r,padsize,'symmetric','both');
padg = padarray(g,padsize,'symmetric','both');
ret=im;
for i=1:height
for j=1:width
slider = padr(i:i+w-1,j:j+w-1);
slideg = padg(i:i+w-1,j:j+w-1);
rm=mean(mean(slider));
gm=mean(mean(slideg));
tem=rm+gm-r(i,j);
tem=tem*255;
tem=uint8(tem);
ret(i, j, 1)=tem;
end
end
end