图像的代数运算与逻辑运算——Matlab实现

图像的代数运算与逻辑运算——Matlab实现

一、加法运算

加法运算通常用于平均值降噪等多种场合。图像相加一般用于同一场景的多幅图像求平均,以便有效降低加性噪声。当图片被随机噪声源干扰,则可以通过对多幅静止图像求平均值来达到消除或者降低噪声的目的。在求平均值的过程中,图像的静止部分不会改变,而由于图像的噪声是随机的,各不相同的噪声图案积累的很慢,因此可以通过多幅图像求平均值来降低随机噪声的影响。

若对M幅图像做平均,则M越大,降噪效果越好。

把一副图像加上高斯噪声,再通过多次相加求平均的方法去除噪声,其matlab程序如下:

%% 把一副图像加上高斯噪声,再通过多次相加求平均的方法去除噪声
% 验证相加次数和降噪效果是否成正比
clc;clear;close all;    % 初始化
I=imread('eight.tif');
J=imnoise(I,'gaussian',0,0.02); % 向这副图片加入高斯噪声
subplot(231);imshow(I);title('原图');
subplot(232);imshow(J);title('加噪声');
[M,N]=size(J);  K=zeros(M,N);   % 产生全零的矩阵,大小与图片的一样
a=100;
for i=1:a
    J=imnoise(I,'gaussian',0,0.02);
    J1=im2double(J);
    K=K+J1; % 相加
end
K=K/a;  % 求平均值
subplot(233);imshow(K);title([num2str(a),'次求平均后的图']);

运行结果如下:
在这里插入图片描述

当平均次数越多时,降噪效果越好。

代码中涉及的imnoise函数详解:

MATLAB中函数imnoise 是表示添加噪声污染一幅图像,叫做噪声污染图像函数。

g = imnoise(I,type)
g = imnoise(I,type,parameters)
g = imnoise(I,‘gaussian’,m,v)
g = imnoise(I,‘localvar’,V)
g = imnoise(I,‘localvar’,image_intensity,var)
g = imnoise(I,‘poisson’)
g = imnoise(I,‘salt & pepper’,d)
g = imnoise(I,‘speckle’,v)

f为是输入图像。函数imnoise在给图像添加噪声之前,将它转换为范围[0,1]内的double类图像。指定噪声参数时必须考虑到这一点。

g=imnoise(f,‘gaussian’,m,var)将均值m,方差为var的高斯噪声加到图像f上,默认值是均值m为0,方差var为0.01的噪声。

g=imnoise(f,‘localvar’,V)将均值为0,局部方差为V的高斯噪声添加到图像f上,其中V是与f大小相同的一个数组,它包含了每一个点的理想方差值。

g=imnoise(f,‘localvar’,image_intensity,var)将均值为0的高斯噪声添加到图像f中,其中噪声的局部方差var是图像f的亮度值的函数。参量image_intensity和var是大小相同的向量,plot(image_intensity,var)绘制出噪声方差和图像亮度的函数关系。向量image_intensity必须包含范围在[0,1]内的归一化亮度值。

g=imnoise(f,‘salt & pepper’,d)用椒盐噪声污染图像f,其中d是噪声密度(即包括噪声值的图像区域的百分比)。因此,大约有d*numel(f)个像素受到影响。默认的噪声密度为0.05。

g=imnoise(f,‘speckle’,var)用方程g=f+n*f)将乘性噪声添加到图像f上,其中n是均值为0,方差为var的均匀分布的随机噪声,var的默认值是0.04。

g=imnoise(f,‘poisson’)从数据中生成泊松噪声,而不是将人工的噪声添加到数据中,为了遵守泊松统计,unit8和unit16类图像的亮度必须和光子的数量相符合。当每个像素的光子数量大于65535时,就要使用双精度图像。亮度值在0到1之间变化,并且对应于光子的数量除以10e12。

二、减法运算

图像相减常用于检测变化及运动的物体,图像相减运算又称为图像差分运算。差分方法可以分为可控环境下的简单差分方法和基于背景模型的差分方法。在可控环境下,或者在很短的时间内,可以认为背景是固定不变的,可以直接使用差分运算检测变化或运动的物体。

将同一景物在不同时间拍摄的图像或同一景物在不同波段的图像相减,这就是差影法,实际上就是图像的减法运算。差值图像提供了图像间的差值信息,能用于指导动态监测、运动目标的检测和跟踪、图像背景的消除及目标识别等。

图像在进行差影法运算时必须使两相减图像的对应点位于空间同一目标上,否则,必须先做几何校准与匹配。当一个场景系列图像相减用来检测其他变化时,难以保证准确对准,这时就需要更进一步的分析。

已知一副收到椒盐噪声干扰的图片,通过减法运算提取出噪声,其matlab代码如下:

%% 已知一副收到椒盐噪声干扰的图片,通过减法运算提取出噪声
clc;clear;close all;    % 初始化
I=imread('C:\Users\xcz\Desktop\matlab_example\Images\lena.jpg');
I1=imnoise(I,'salt & pepper',0.02);
K=imsubtract(I1,I); % 实现两幅图片相减,也可使用imabsdiff函数,从而避免负值为0
K1=255-K;   % 图像求反显示
subplot(131);imshow(I);title('原图');
subplot(132);imshow(I1);title('加椒盐噪声后');
subplot(133);imshow(K1);title('提取的噪声');

运行结果如下:
在这里插入图片描述

matlab代码中涉及到的imsubtract函数详解:

英文原文如下
在这里插入图片描述

注意:imsubtract函数会将相减后为负值的数据截取为0;而 imabsdiff 函数则是求两幅图像的绝对差值,不会将负值截取为0, 从而使用的时候,为了避免差值产生负值,同时避免像素值运算结果之间差异过小(减去后结果为负数的不好都变成0),建议调用函数imabsdiff。

三、乘法运算

简单的乘法运算可用来改变图像的灰度级,实现灰度级变换,乘法运算也可用来遮住图像的某些部分,其典型应用时用于获得掩模图像。对于需要保留的区域,掩模图像的值置为1,而需要被抑制的区域,掩模图像的值置为0。乘法运算有时还可以作为一种技巧来实现卷积或相关处理。

matlab代码实现如下:

%% 实现图像的乘法运算
clc;clear;close all;    % 初始化
I=imread('moon.tif');
J=immultiply(I,1.2);    % 将此图片乘以1.2
K=immultiply(I,2);      % 将此图片乘以2
subplot(131);imshow(I);title('原图');
subplot(132);imshow(J);title('乘以1.2');
subplot(133);imshow(K);title('乘以2');

运行结果如下:
在这里插入图片描述

代码中涉及的immultiply函数用于图像相乘运算,详情见帮助文档

四、除法运算

简单的除法运算可用于改变图像的灰度级。除法运算的典型运用是比值图像处理。例如,除法运算可用于校正成像设备的非线性影响,在特殊形态的图像(如以CT为代表的医学图像)处理中用到。此外,除法运算还用于消除图像数字化设备随空间所产生的影响。

matlab代码实现如下:

%% 实现图像的除法运算
clc;clear;close all;    % 初始化
moon=imread('moon.tif');I=double(moon); % 读入图像,并将其数据类型转为double
J=I*0.43+90;K=I*0.1+90;L=I*0.01+90;
moon2=uint8(J);moon3=uint8(K);moon4=uint8(L);
J=imdivide(moon,moon2);K=imdivide(moon,moon3);
L=imdivide(moon,moon4);
subplot(221);imshow(moon);title('原图');
subplot(222);imshow(J,[]);title('J=I*0.43+90');
subplot(223);imshow(K,[]);title('K=I*0.1+90');
subplot(224);imshow(L,[]);title('L=I*0.01+90');

运行结果如下:
在这里插入图片描述

五、逻辑运算

常见的图像逻辑运算有与(and)、或(or)、非(not)等,其主要针对二值图像,在图像理解与分析领域比较有用。运用这种方法可以为图像提供模板,与其他运算方法结合起来可以获得特殊的效果。

两幅二值图像进行逻辑与、或、非,其matlab代码如下:

%% 两幅二值图像进行逻辑与、或、非
clc;clear;close all; %初始化
A=zeros(128);A(40:67,60:100)=1; % 创建两个矩阵
B=zeros(128);B(50:80,40:70)=1;
C=and(A,B);D=or(A,B);E=not(A); %对A图和B图进行逻辑运算
subplot(231);imshow(A);title('A图');
subplot(232);imshow(B);title('B图');
subplot(233);imshow(C);title('C图,A,B相与');
subplot(234);imshow(D);title('D图,A,B相或');
subplot(235);imshow(E);title('E图,A取反');

运行结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xcz8023/article/details/126217393
今日推荐