图像的逻辑运算
参考书籍:《智能图像处理:Python和OpenCV实现》赵云龙 葛广英编著
以下代码由Jupyter Notebook实现
图像的逻辑运算包括按位与、或、非
1.按位与
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1 = cv2.cvtColor(cv2.imread('./pics/lena.jpg'), cv2.COLOR_BGR2RGB)
img2 = np.zeros(img1.shape, dtype=np.uint8) # 构建掩膜
img2[50:150,50:150] = 255
result = cv2.bitwise_and(img1, img2) # 按位与
imgname = ['img1', 'img2', 'result']
plt.figure(figsize = (8,3))
plt.suptitle("bitwise_and", fontsize = 15)
for i in range(3):
plt.subplot(1,3,i+1)
plt.title(imgname[i])
plt.imshow(eval(imgname[i])) # 字符串转成变量名,参考http://t.csdn.cn/0WrId
plt.xticks([])
plt.yticks([])
plt.show()
2.按位或
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1 = cv2.cvtColor(cv2.imread('./pics/lena.jpg'), cv2.COLOR_BGR2RGB)
img2 = np.zeros(img1.shape, dtype=np.uint8) # 构建掩膜
img2[50:150,50:150] = 255
result = cv2.bitwise_or(img1, img2) # 按位或
imgname = ['img1', 'img2', 'result']
plt.figure(figsize = (8,3))
plt.suptitle("bitwise_or", fontsize = 15)
for i in range(3):
plt.subplot(1,3,i+1)
plt.title(imgname[i])
plt.imshow(eval(imgname[i])) # 字符串转成变量名,参考http://t.csdn.cn/0WrId
plt.xticks([])
plt.yticks([])
plt.show()
3.按位非
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1 = cv2.cvtColor(cv2.imread('./pics/lena.jpg'), cv2.COLOR_BGR2RGB)
result = cv2.bitwise_not(img1) # 按位非
imgname = ['img1', 'result']
plt.figure(figsize = (8,3))
plt.suptitle("bitwise_or", fontsize = 15)
for i in range(2):
plt.subplot(1,2,i+1)
plt.title(imgname[i])
plt.imshow(eval(imgname[i])) # 字符串转成变量名,参考http://t.csdn.cn/0WrId
plt.xticks([])
plt.yticks([])
plt.show()
4.按位异或(相同为0,不同为1)
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1 = cv2.cvtColor(cv2.imread('./pics/lena.jpg'), cv2.COLOR_BGR2RGB)
img2 = np.zeros(img1.shape, dtype=np.uint8) # 构建掩膜
img2[50:150,50:150] = 255
result = cv2.bitwise_xor(img1, img2) # 按位异或
imgname = ['img1', 'img2', 'result']
plt.figure(figsize = (8,3))
plt.suptitle("bitwise_xor", fontsize = 15)
for i in range(3):
plt.subplot(1,3,i+1)
plt.title(imgname[i])
plt.imshow(eval(imgname[i])) # 字符串转成变量名,参考http://t.csdn.cn/0WrId
plt.xticks([])
plt.yticks([])
plt.show()
5.综合实例
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1 = cv2.cvtColor(cv2.imread('./pics/grassland.png'), cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(cv2.imread('./pics/opencv-logo-white.png'), cv2.COLOR_BGR2RGB)
plt.subplot(2,4,1)
plt.title('origin')
plt.imshow(img1) # 字符串转成变量名,参考http://t.csdn.cn/0WrId
plt.xticks([])
plt.yticks([])
# 把logo放在图像的右上角,创建ROI(Region Of Interest)
rows1, cols1, channels1 = img1.shape
rows, cols, channels = img2.shape
roi = img1[0:rows,(cols1 - cols):cols1]
# 创建logo的掩码,同时创建其反掩码
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 240,255,cv2.THRESH_BINARY)
# mask背景依然是白色,彩色logo是黑色
mask_inv = cv2.bitwise_not(mask)
# 现在将ROI中logo的区域涂黑
img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
# 仅从logo图像中提取logo区域
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
# 将logo放入ROI并修改主图像
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows,(cols1 - cols):cols1] = dst
imgname = ['img2','mask', 'mask_inv','img1_bg','img2_fg','dst', 'img1']
for i in range(7):
plt.subplot(2,4,i+2)
plt.title(imgname[i])
plt.imshow(eval(imgname[i])) # 字符串转成变量名,参考http://t.csdn.cn/0WrId
plt.xticks([])
plt.yticks([])
plt.show()