数字图像处理图像运算
⼀、图像的代数运算(医学图像处理、图像误差检测)
⾸先把图像转换成与Matlab基本代数符类型相容的双精度浮点型,再利⽤Matlab的代数运算符实现图像的代数运算。
1.图像的加法运算
>> i=imread('rice.png');
>> j=imread('cameraman.tif');
>> k=imadd(i,j,'uint16');
>> subplot(1,3,1);imshow(i);title('原始图像rice');
>> subplot(1,3,2);imshow(j);title('原始图像cameraman');
>> subplot(1,3,3);imshow(k);title('两幅图像叠加');
>> subplot(1,3,3);imshow(k,[]);title('两幅图像叠加');
imshow(K)直接显⽰灰度图像K
imshow(K,[])显⽰K,并将K的最⼤值和最⼩值分别作为纯⽩(255)和纯⿊(0),中间的K值映射为0-255之间的标准灰度值。
2.添加噪声
1. 添加⾼斯噪声,m,v分别为噪声的均值与⽅差,默认m=0,b=0.01
2. 添加椒盐噪声,d分别为噪声的密度,默认为0.05
3. 添加噪声,通⽤的格式:
>> i=imread('eight.tif');
>> j=imnoise(i,'salt & pepper',0.04);
>> subplot(1,2,1);imshow(i);title('原始图像');
>> subplot(1,2,2);imshow(j);title('添加椒盐噪声的图像');
利⽤多图像的平均可以降低图像的噪声
对于原图像,假设有⼀个噪声图像集:
⼀般噪声满⾜零期望:
如果⽤均值来估计噪声分布的期望,则有:
所以可以降低图像的噪声。
>> i=imread('eight.tif');
>> j1=imnoise(i,'gaussian',0,0.006);
>> j2=imnoise(i,'gaussian',0,0.006);
>> j3=imnoise(i,'gaussian',0,0.006);
>> j4=imnoise(i,'gaussian',0,0.006);
>> K=imlincomb(0.3,j1,0.3,j2,0.3,j3,0.3,j4);%线性组合
>> figure;
>> subplot(1,3,1);imshow(i);title('原始图像');
>> subplot(1,3,2);imshow(j1);title('添加⾼斯噪声的图像');
>> subplot(1,3,3);imshow(K,[]);title('抑制⾼斯噪声的图像');
3.图像的减法(差分)运算(检测变化及运动的物体)1. 消除背景法
>> i=imread('rice.png');
>> background=imopen(i,strel('disk',15));
>> j=imsubtract(i,background);
>> figure;
>> subplot(1,3,1);imshow(i);title('原始图像rice');
>> subplot(1,3,2);imshow(background);title('背景图像');
>> subplot(1,3,3);imshow(j,[]);title('去除背景的图像');
减法操作时有时会导致某些像素值为负数,这时函数会⾃动截取为0,也可以调⽤imabsdiff函数实现。
i=imread('cameraman.tif');
subplot(1,3,1);imshow(i);title('原始图像');
j=uint8(filter2(fspecial('gaussian'),i));
subplot(1,3,2);imshow(j);title('含噪图像');
k=imabsdiff(i,j);
subplot(1,3,3);imshow(k,[]);title('两幅图像相减');
2. 差影法
同⼀景物在不同时间拍摄的图像或同⼀景物在不同波段的图像相减。
差影法⽤于⾃动现场监测、运动⽬标的检测和跟踪、消除背景及⽬标识别等。
差影法检测变化:
i=imread('eight1.png');
j=imread('eight.png');
k=imabsdiff(i,j);
figure;
subplot(1,3,1);imshow(i);title('T1时刻的状态');
subplot(1,3,2);imshow(j);title('T2时刻的状态');
subplot(1,3,3);imshow(k);title('两个时刻的状态区别');
4.图像的乘法运算
>> i0=imread('rice.png');
>> i=rgb2gray(i0);
>>subplot(2,2,1);imshow(i);title('原始图像');
>>i16=uint16(i);
>>j=immultiplt(i);
>>subplot(2,2,2);imshow(j);title('图像⾃⾝相乘效果');
>>k=immultiply(i,0.65);
>>subplot(2,2,3);imshow(k);title('图像与常数0.65相乘效果');
>>k=immultiply(i,3);
>>subplot(2,2,4);imshow(k);title('图像与常数3相乘效果');
5.图像的除法运算(校正成像设备的⾮线性影响,在医学图像处理常⽤)
>> i0=imread('street.jpg');
>>j0=imread('street1.jpg');
>>i=rgb2gray(i0);
>>j=rgb2gray(j0);
>>subplot(2,3,1);imshow(i0);title('原始彩⾊图像');
>>subplot(2,3,2);imshow(j0);title('反⾊彩⾊图像');
>>subplot(2,3,3);imshow(i);title('原始灰度图像');
用subplot函数
>>k=imdivide(j,i);
>>k1=imdivie(i,0.3);
>>k2=imdivide(i,1.2);
>>subplot(2,3,4);imshow(k);title('图像相除的效果');
>>subplot(2,3,5);imshow(k1);title('图像与常数0.65相除的效果');
>>subplot(2,3,6);imshow(k2);title('图像与常数3相除的效果');
⼆、图像的邻域运算(图像滤波、形态学运算)
对图像的像素进⾏处理时,不仅需要输⼊该像素本⾝的灰度,还要输⼊以该像素为中⼼某局部区域的⼀些像素的灰度进⾏运算的⽅式,称为图像邻域运算
1、滑动邻域处理
滑动邻域操作每次在⼀个像素上进⾏。
输出图像的每个像素值都是输⼊图在这个像素邻域内进⾏指定的运算得到的像素值。
⼀般算法:
1. 选择⼀个像素
2. 确定这个像素的邻域
3. 对邻域的像素值应⽤指定的函数进⾏计算
4. 返回输出图像的像素值,其位置位于输⼊图像邻域的中⼼位置
5. 对图像中的每个像素重复上⾯四个步骤。
>> A=imread('cameraman.tif');
>> A=im2double(A);
>> fun=@(x)median(x(:));
>> B=nlfilter(A,[3,3],fun);
>> subplot(1,2,1);imshow(A);title('原始图像');
>> subplot(1,2,2);imshow(B);title('邻域操作');