matlab实现数字图像的加减乘除运算

  • Post author:
  • Post category:其他


数字图像处理的算术运算是指对两幅或多幅图像进行点对点的加、减、乘、除计算得到输出图像的运算。

g(x,y)=f_{1}(x,y)+f_{2}(x,y)

g(x,y)=f_{1}(x,y)-f_{2}(x,y)

g(x,y)=f_{1}(x,y)\times f_{2}(x,y)

g(x,y)=f_{1}(x,y)\div f_{2}(x,y)

其中输入图像的大小必须相同。

加法:主要是通过叠加相同的图像来达到去噪的效果(因为噪声的平均值为0),或者实现图像的叠加。

减法:主要是检测两幅图像之间的差异,增强细节。

乘法(除法):主要用于图像的分块显示。

matlab代码如下:

%一个总的“调用函数”,用来调用后面定义的具体加减乘除功能函数,
%这里默认输入的图像数据都是被压缩到0-1灰度范围内的。对于运算结果
%超出了0-1范围的情况,如果我们只是想展示图像,那么在函数定义时可以
%不用进行0-1截断(即大于1的像素点设为1,小于0的像素点设为0),因为
%图像展示函数imshow会进行这个操作;如果我们
%要利用运算后的图像数据进行其它操作,比如神经网络训练等,那么对运算后
%的图像进行0-1截断(图像的像素在正常范围)为宜。但在这里,我们只是为了
%展示图像效果,所以在函数定义中没有进行0-1截断。
function out=image_process
    out.image_add=@image_add;
    out.image_div=@image_div;
    out.image_mul=@image_mul;
    out.image_sub=@image_sub;
end

 %加法
function img=image_add(f1,f2)%f1,f2为输入的两幅同样大小的图像,后续函数也一样
    img=f1+f2;
end

%减法
function img=image_sub(f1,f2)
    img=f1-f2;
end

%乘法
function img=image_mul(f1,f2)
    img=f1.*f2;
end

%除法
function img=image_div(f1,f2)
    img=f1./(f2+(1e-6));  %这里除数加一个极小值是为了避免除数为0的情况出现
end

上诉代码是加减乘除函数的定义部分,单独一个matlab文件,其中文件名为“调用函数”的名字——image_process。

具体运行代码如下:

f1=imread('girl.jpg');%读取一个名为girl的jpg图像,但要保证该图像与当前程序在同一目录下
f1=mat2gray(f1,[0,255]);%把图像像素值0-255压缩到0-1,便于后续图像操作
figure1=figure;%画布1,以此类推
imshow(f1)%展示原始图像,对于像素值为0-1模式的,若有大于1或小于0的像素点,均按1或0处理

f2=imread('girl.jpg');
f2=mat2gray(f2,[0,255]);

fun=image_process;%调用另一个文件

add_img=fun.image_add(f1,f2);%调用另一个文件中定义的函数(图像加操作),以此类推
figure2=figure;%画布2,以此类推
imshow(add_img)%展示两个图像一次叠加后的输出图像

adds_img=fun.image_add(f1,f2);
for i=1:10
    adds_img=fun.image_add(f1,adds_img);
end
cn_img=adds_img/12;%这里共有12张图片的叠加,所以除以12,看一下去噪效果
figure3=figure;
imshow(cn_img)%展示图片去噪效果,因为小姐姐图片的画质是很清晰的,估计没什么噪声,效果应该不明显

sub_img=fun.image_sub(f1,f2);
figure4=figure;
imshow(sub_img);%展示两张相同图片相减结果

img1=f2*0+1;%把f2图像变为一张同样大小但像素值都为1的图像
img0=f2*0;%把f2图像变为一张同样大小但像素值都为0的图像
mul_img1=fun.image_mul(f1,img1);
mul_img0=fun.image_mul(f1,img0);
figure5=figure;
imshow(mul_img1)%展示一张图像与同样大小的全白图像相乘后结果
figure6=figure;
imshow(mul_img0)%展示一张图像与同样大小的全黑图像相乘后结果

div_img=fun.image_div(f1,f2);
figure7=figure;
imshow(div_img)%展示两张相同图像相除后结果

具体图像运算后的展示结果:

1.原始图片:

2.两张相同图片相加后的结果:

可以看到很多地方都“白”了,说明对应位置相加后的像素值超过了1。

3.十二张图像相加后再除以12去噪后的结果:

因为原始图像已经是极为高清的了,噪声很少,所以去噪效果目测不明显,与原始图像基本一致。

4.两张相同图片相减结果:

5.原始图片与同样大小的全白图像相乘结果:

全白图像像素值都为1,相乘后于原始图像一致。

6.原始图片与同样大小的全黑图像相乘结果:

全黑图像像素值都为0,相乘后图像全黑。

7.两张相同图像相除结果:

理论上应该为全白图像,但在图像相除函数的定义时,我们给除数加了一个较小值,可能导致最终结果有一些离谱像素点,当然,噪声也可能产生了一定的影响。

感谢阅读



版权声明:本文为XIETINGYUWO原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。