1.图像代数运算简介
图像的代数运算通常是指两幅图像,或者多幅图像通过加、减、乘、除代数运算以得到输出图像的方法。
如果记输入图像为
h
(
x
,
y
)
h(x,y)
h(x,y),
g
(
x
,
y
)
g(x,y)
g(x,y),输出图像为
f
(
x
,
y
)
f(x,y)
f(x,y)。则具体的图像代数运算形式为:
f
(
x
,
y
)
=
h
(
x
,
y
)
+
g
(
x
,
y
)
f
(
x
,
y
)
=
h
(
x
,
y
)
−
g
(
x
,
y
)
f
(
x
,
y
)
=
h
(
x
,
y
)
∗
g
(
x
,
y
)
f
(
x
,
y
)
=
h
(
x
,
y
)
/
g
(
x
,
y
)
f(x,y)=h(x,y)+g(x,y) \\ f(x,y)=h(x,y)-g(x,y) \\ f(x,y)=h(x,y)*g(x,y)\\ f(x,y)=h(x,y)/g(x,y)
f(x,y)=h(x,y)+g(x,y)f(x,y)=h(x,y)−g(x,y)f(x,y)=h(x,y)∗g(x,y)f(x,y)=h(x,y)/g(x,y)
-
加法运算
主要用于1.去除叠加性的随机噪声,2.实现图像的叠加效果 -
减法运算
主要用于1.差影法监测物体运动变化,2.混合图像的分离,3.计算图像梯度 -
乘法运算
主要用于掩膜mask -
除法运算
主要用于1.设备的校正,2.图像差异的比较
2.具体实现
图像代数运算可以自己实现也可以使用OpenCV中的函数实现,这里两种都给出,但在实际的使用中多以CV自带函数的使用。
这里给出图像素材(obj,bg,mask,noise)如下:
1.加法运算实现:
img_add0=obj+bg
#相加大于255会出现溢出显示错误
img_add=cv.add(obj*0.5,bg*0.5)
#add()返回的是int类型,所乘系数为权值防止相加溢出255
img_add2=cv.addWeighted(obj,0.5,bg,0.5,0)
#addWeighted()返回的是浮点类型,第五个参数为位移
原输入图像:
加法运算后(img_add0,img_add,img_add2):
2.减法实现
img_sub=img_add2-bg*0.5
img_sub2=cv.subtract(img_add2*1.0,bg*0.5)
#注意两个参数要为同类型,否则报错
原输入图像为:
输出图像(img_sub,img_sub2):
3.乘法实现
img_mul=obj*(mask/255)
img_mul2=cv.multiply(obj/1.0,mask/255)
#注意两个参数要为同类型,否则报错
#对掩膜mask进行归一化处理,也是防止相乘后结果溢出
原输入图像为:
输出图像(img_mul,img_mul2):
4.除法实现
img_div=obj/(np.float64(noise)+1)
#直接相除应注意除数为0的情况,故要转为浮点后+1
img_div2=cv.divide(obj,noise+1)
原始输入图像为:
输出图像为:
做一个小的图片合成实验:
img_step1=cv.multiply(obj*1.0,mask/255)
img_step2=cv.multiply(flower*1.0,1-(mask/255))
img_step3=cv.addWeighted(img_step1,0.5,img_step2,0.5,0)
原图像素材(obj,flower,mask):
输出图像(img_step1,img_step2,img_step3):