1.了解图像的算术运算在数字图像处理中的初步应用;
2.体会图像算术运算处理的过程和处理前后图像的变化。
PC机、matlab2018b
图像的代数运算是两幅输入图像之间进行的点对点的加、减、乘、除运算后得到输出图像的过程。
图像相加一般用于对同一场景的多幅图像求平均效果,以便有效地降低具有叠加性质的随机噪声。
图像减法也称为差分方法,是一种常用于检测图像变化及运动物体的图像处理方法。
编程实现图像的基本运算:两幅图像相加和相减,并分析这两种运算的作用。
1.灰度/RGB图像
2.相加(数据)
选用图片如下图所示:
|
|
|
|
(1)读取图像,记为img1,img2:使用imread函数将图像读入Matlab;
(2)获取img1图像大小m,n和img2图像大小p,q,若img1和img2大小相同,转到步骤(3),否则,对m,p取较小值记为s,对n,q取较小值记为t,将img1和img2图像剪裁为s,t 大小;
(3)对img1和img2乘参数para1=1和para2=0.3相加,相加数值可能超过255,遍历图像将超过255的数值置为255;
得到图像如下图所示:
(4)对img1和img2乘参数para1=1和para2=0.3相减,相减数值可能小于0,遍历图像将小于0的数值置为0;
得到图像如下图所示:
(1)读取图像,记为img1,img2:使用imread函数将图像读入Matlab;
(2)获取img1图像大小m,n,3和img2图像大小p,q,3若img1和img2大小相同,转到步骤(3),否则,对m,p取较小值记为s,对n,q取较小值记为t,将img1和img2图像剪裁为s,t,3大小;
(3)将两个图像矩阵分别拆为三个二维矩阵img_R,img_G,img_B,对img1和img2的三个二维矩阵分别乘参数para1=0.75和para2=0.3并且对应相加,相加数值可能超过255,遍历图像将超过255的数值置为255,将相加后的三个二维矩阵合并为一个彩色图像矩阵,该功能封装为函数ex2_MyImadd_1(img,background,para1,para2);
得到图像如下图所示:
(4)将两个图像矩阵分别拆为三个二维矩阵img_R,img_G,img_B,对img1和img2的三个二维矩阵分别乘参数para1=0.75和para2=0.3并且对应相减,相减数值可能小于0,遍历图像将小于0的数值置为0,将相加后的三个二维矩阵合并为一个彩色图像矩阵,该功能封装为函数ex2_MyImSub_1(img,background,para1,para2);
自定义函数
ex2_MyImadd_1(img,background,para1,para2)
ex2_MyImSub_1(img,background,para1,para2)
内置函数
imadd(X,Y)
Imsubtract(X,Y)
在图像加减运算时,自定义函数和内置函数可实现同样功能,同时自定义函数还能处理图像大小不同的情况,内置函数直接输入不同大小的图像时程序会报错如下图所示:
图像加法
做完加法运算后,有添加背景的效果如图2-5、图2-8,图像相应位置数值相加,相加时两张图片需要乘相应系数,否则图像会过于亮如图2-6、图2-9,因为两数值相加之后可能超过255,造成过度曝光的结果,如果乘系数后结果仍大于255,则需要将其置为255。
图像减法
做完加法运算后,图像效果如图2-7、图2-10所示,图像整体变暗,局部亮度下降明显,图像相应位置相减,相减时两张图片需要乘相应系数,否则图像会过于暗如图2-7、图2-11,因为两数值相减后结果可能小于0,造成过于暗的部分,如果乘系数后结果仍小于0,则需要将其置为0。
查阅相关文献有以下结论:
1. 图象相加一般用于对同一场景的多幅图象求平均,以便有效地降低加性随机噪声。通常图象采集系统中采集图象时有这样的参数可供选择。
2. 图象相减是常用的图象处理方法,用于检测变化及运动物体。在可控制的条件下,如工业视觉环境下,这种称之为差分方法的简单处理与阈值化处理一道往往是建立机器视觉系统最有效的方法之一。
进行图像加减运算时还应注意图片大小应相同,matlab内置函数不能自动处理图像大小不同的问题,本实验解决了图像加减运算时自动处理图像大小不同的问题。
function syn = ex2_MyImadd_2(img,background,para1,para2)
% 将img和background进行加法运算
% img:输入图像1,background:输入图像2,para1:img待乘系数1,para2:background待乘系数2
% syn:合成图像
% 转换类型
img = double(img);
background = double(background);
% 图像维数
dimension = size(size(img));
% 黑白图像
if dimension(2) == 2
[m,n] = size(img);
[p,q] = size(background);
s = min(m,p);
t = min(n,q);
% 改变背景图片大小和前景图片一致
img = img(1:s,1:t);
background = background(1:s,1:t);
% 加法运算
syn = para1 * img + para2 * background;
% 相加之后数值可能超过255,将超过255的数值置为255
syn = uint8(ex2_MyCut_1(syn));
elseif dimension(2) == 3
% 获取图片大小
[m,n,~] = size(img);
[p,q,~] = size(background);
s = min(m,p);
t = min(n,q);
% 改变背景图片大小和前景图片一致
img = img(1:s,1:t,:);
background = background(1:s,1:t,:);
% 将彩色图片拆成三通道
img_R = img(:,:,1);
img_G = img(:,:,2);
img_B = img(:,:,3);
bg_R = background(:,:,1);
bg_G = background(:,:,2);
bg_B = background(:,:,3);
% 加法运算
synImg_R = para1 * img_R + para2 * bg_R;
synImg_G = para1 * img_G + para2 * bg_G;
synImg_B = para1 * img_B + para2 * bg_B;
% 相加之后数值可能超过255,将超过255的数值置为255
synImg_R = ex2_MyCut_1(synImg_R);
synImg_G = ex2_MyCut_1(synImg_G);
synImg_B = ex2_MyCut_1(synImg_B);
% 合并
syn(:,:,1) = synImg_R;
syn(:,:,2) = synImg_G;
syn(:,:,3) = synImg_B;
syn = uint8(syn);
end
function syn = ex2_MyImSub_1(img,background,para1,para2)
% 将img和background进行减法运算
% img:输入图像1,background:输入图像2,para1:img待乘系数1,para2:background待乘系数2
% syn:合成图像
% 转换类型
img = double(img);
background = double(background);
% 图像维数
dimension = size(size(img));
% 黑白图像
if dimension(2) == 2
[m,n] = size(img);
[p,q] = size(background);
s = min(m,p);
t = min(n,q);
% 改变背景图片大小和前景图片一致
img = img(1:s,1:t);
background = background(1:s,1:t);
% 减法运算
syn = para1 * img - para2 * background;
% 相加之后数值可能小于0,将小于0的数值置为0
syn = uint8(ex2_MyCut_1(syn));
elseif dimension(2) == 3
% 获取图片大小
[m,n,~] = size(img);
[p,q,~] = size(background);
s = min(m,p);
t = min(n,q);
% 改变背景图片大小和前景图片一致
img = img(1:s,1:t,:);
background = background(1:s,1:t,:);
% 将彩色图片拆成三通道
img_R = img(:,:,1);
img_G = img(:,:,2);
img_B = img(:,:,3);
bg_R = background(:,:,1);
bg_G = background(:,:,2);
bg_B = background(:,:,3);
% 减法运算
synImg_R = para1 * img_R - para2 * bg_R;
synImg_G = para1 * img_G - para2 * bg_G;
synImg_B = para1 * img_B - para2 * bg_B;
% 相加之后数值可能小于0,将小于0的数值置为0
synImg_R = ex2_MyCut_1(synImg_R);
synImg_G = ex2_MyCut_1(synImg_G);
synImg_B = ex2_MyCut_1(synImg_B);
% 合并
syn(:,:,1) = synImg_R;
syn(:,:,2) = synImg_G;
syn(:,:,3) = synImg_B;
syn = uint8(syn);
end
function img_1 = ex2_MyCut_1(img)
% 将灰度图像超过255的数值置255,小于0的数值置0
% img:输入图像,二维矩阵
% img_1:处理过后的图像
% 获取图像大小
[m,n] = size(img);
img_1 = img;
for i = 1:m
for j = 1:n
% 超过255的数值置255
if img(i,j) > 255
img_1(i,j) = 255;
end
% 小于0的数值置0
if img(i,j) < 0
img_1(i,j) = 0;
end
end
end