(1)图像的加法运算
(2)图像的减法运算
(3)图像的乘法运算
(4)图像的除法运算
(5)图像的非运算
(6)图像的与运算
(7)图像的或 异或 运算
图像相加实战
在进行加法运算时,先思考可能会出现什么结果,并且为什么图像相加需要什么样的条件。
如果在一张图片上加上一个全为1的图,那猜测图片可能会变亮,条件就是我们创建的图片大小和需要进行相加的图片大小必须要一致。
import cv2
import numpy as np
mm = cv2.imread('E:\\pycharm\\PycharmFile\\opencv\\MM\\preview.jpg')
cv2.imshow('mm', mm)
# 图的加法运算就是矩阵的加法运算(会使图像变得更加亮)
# 因此加法运算的两张图必须是相等的
print(mm.shape)
backmm = np.ones((895, 895, 3), np.uint8) * 50
# 加法(图像变亮)
result = cv2.add(mm, backmm)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
左边是原图,右边是相加后的图。事实与我们想象的一样变亮了。
图像相减实战
与加法类似,那减法减去一个图像,图像猜测是否会变暗呢?
result1 = cv2.subtract(mm, backmm)
cv2.imshow('result1', result1)
左边时原图,右边是相减后的图。图像正如我们思考的变暗了。
图像的乘除
图像的乘除其实就是更快的加减,那结果我们也就可以猜出来,就是加减的效果更加的明显了。
# 乘法(更快的加)
result2 = cv2.multiply(mm, backmm)
cv2.imshow('result2', result2)
# 除法(更快的减)
result3 = cv2.divide(mm, backmm)
cv2.imshow('result3', result3)
从左到右分别是原图,乘法后的图,与除法后的图。
图像的溶合
addWeighted(A,alpha,B,bate,gamma)
alpha和bate分别是A,B占溶合后的图片的比例(权重)
gamma 静态权重
import cv2
import numpy as np
ww = cv2.imread('E:\\pycharm\\PycharmFile\\opencv\\MM\\preview.jpg')
lm = cv2.imread('E:\\pycharm\\PycharmFile\\opencv\\MM\\lm.jpg') # 这张图片的修改过程看 lm.py
cv2.imshow('ww', ww)
cv2.imshow('lm', lm)
# 只有两张图的属性一样才可以进行溶合
print(ww.shape)
print(lm.shape)
# 进行溶合
mm2 = cv2.addWeighted(ww, 0.7, lm, 0.3, 0)
cv2.imshow('mm2', mm2)
cv2.waitKey(0)
# while True:
# key=cv2.waitKey(0)
# if(key&0xFF==ord('q')):
# break
cv2.destroyAllWindows()
从左到右是两张需要溶合的图片,最后一张是溶合后的图片。大家可以自己修改权重来看看溶合后的图片有上面不同。
图像的位运算(与 或 非)
图像的非运算
bitwise_not(img)
非操作无非就是将黑的变成白,白的变成黑
import cv2
import numpy as np
# 创建一张图片 (1是白色,0是黑色)
img = np.zeros((200, 200), np.uint8) # 200x200黑白色图片
img[20:120, 20:120] = 255 # 见numpy1
# 非操作
img1 = cv2.bitwise_not(img)
cv2.imshow('img', img)
cv2.imshow('img1', img1)
cv2.waitKey(0)
img是原图,img1是进过非运算得到的结果。正如我们猜想的,黑变白,白变黑。
图像的与运算
bitwise_and(img1,img2)
与操作,就是当两个都是真(非0)的时候才为真(反应到图象上就是 只有两张图中都是白色的才会为白色)
import cv2
import numpy as np
# 创建一张图片 (1是白色,0是黑色)
img = np.zeros((200, 200), np.uint8) # 200x200黑白色图片
newimg = np.zeros((200, 200), np.uint8)
img[20:120, 20:120] = 255 # 见numpy1
newimg[80:180, 80:180] = 255
# 与 (两位同时为“1”,结果才为“1”,否则为0)
img2 = cv2.bitwise_and(img, newimg)
cv2.imshow('img', img)
cv2.imshow('newimg', newimg)
cv2.imshow('img2', img2)
cv2.waitKey(0)
左边两张是进行相与的两张图,最右边的是与后的结果,发现都为白的才为白,符合预期。
图像的或 异或 操作
或:bitwise_or(img1,img2)
只要是有一个真(非0)就是真(反应到图象上就是 只有两张图中只要出现白色的就会为白色)
异或:bitwise_xor(img1,img2)
交集的部分为0,非交集的部分为1
import cv2
import numpy as np
# 创建一张图片 (1是白色,0是黑色)
img = np.zeros((200, 200), np.uint8) # 200x200黑白色图片
newimg = np.zeros((200, 200), np.uint8)
img[20:120, 20:120] = 255 # 见numpy1
newimg[80:180, 80:180] = 255
# 或 (运算的两个对象只要有一个为1,其值为1)
img3 = cv2.bitwise_or(img, newimg)
# 异或(相同为0 相异为1)(0是黑,1是白)
img4 = cv2.bitwise_xor(img, newimg)
cv2.imshow('img', img)
cv2.imshow('newimg', newimg)
cv2.imshow('img3', img3)
cv2.imshow('img4', img4)
cv2.waitKey(0)
上面两张为原图,下面两张分别是或操作得到的和异或操作得到的(大家思考是否和我们猜测的相同)。
添加水印
任务
(1)引入一张图片
(2)设计一个logo
(3)计算图片在什么地方添加,在添加的地方变成黑色
(4)利用add,把图片叠加在一起
import cv2
import numpy as np
# 1.引入一张图片
# 2.设计一个logo
# 3.计算图片在什么地方添加,再添加的地方变成黑色
# 4.利用add 把图片叠加在一起
import cv2
import numpy as np
# 导入图片
ww = cv2.imread('../MM/preview.jpg')
# 创建logo和掩码
logo = np.zeros((200, 200, 3), np.uint8)
mask = np.zeros((200, 200), np.uint8)
# 绘制logo
logo[20:120, 20:120] = [0, 0, 255]
logo[80:180, 80:180] = [0, 255, 0]
mask[20:120, 20:120] = 255
mask[80:180, 80:180] = 255
# 对mask按位求反
newmask = cv2.bitwise_not(mask)
# 选择ww添加logo的位置
roi = ww[0:200, 0:200]
# 与newmask进行与操作
wl = cv2.bitwise_and(roi, roi, mask=newmask)
# 把水印贴在扣出的图上
dst = cv2.add(wl, logo)
# 把添加水印后的图放到原图中
ww[0:200, 0:200] = dst
cv2.imshow('logo', logo)
cv2.imshow('mask', mask)
cv2.imshow('newmask', newmask)
cv2.imshow('wl', wl)
cv2.imshow('dst', dst)
cv2.imshow('wwl', ww)
cv2.waitKey(0)
最终设计出的添加logo的图案。