2.2.2 按位或 cv2.bitwise_or()
使用按位或运算对图像操作可以取得与按位与相反的处理结果。
import cv2 import numpy as np img1 = cv2.imread("pic.jpg") mask = np.zeros(img1.shape, np.uint8) # 横着的白色区域 mask[490:600, :, :] = 255 # 竖着的白色区域 mask[:, 470:545, :] = 255 img2 = cv2.bitwise_or(img1, mask) cv2.imshow("img", img2) cv2.waitKey() cv2.destroyAllWindows()
2.2.3 按位取反 cv2.bitwise_not()
按位取反是仅对一个图像做的操作,根据二进制,如果某位置上数值为0,则改为1;如果为1则该为0。
import cv2 img1 = cv2.imread("pic.jpg") img2 = cv2.bitwise_not(img1) cv2.imshow("img", img2) cv2.waitKey() cv2.destroyAllWindows()
处理结果如下图所示:
2.2.4 按位异或 cv2.bitwise_xor()
对二进制位进行判断,如果两个运算数的同一位上的数字相同,则运算结果的相同位数字取0,否则取1。
这个描述有些抽象。可以简单理解为,催掩码匹配到的区域做取反运算,掩码匹配不到的区域保持图像原状。具体见下方图像:
import cv2 import numpy as np img1 = cv2.imread("pic.jpg") mask = np.zeros(img1.shape, np.uint8) # 横着的白色区域 mask[490:600, :, :] = 255 # 竖着的白色区域 mask[:, 470:545, :] = 255 img = cv2.bitwise_xor(img1, mask) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
效果呈现:
2.3 图像加密
通过按位异或运算,还可以实现对图像的加密。使用numpy创建随机数组的方法,创建一个随机像素值图像作为密匙,进而实现对原图像的加密和解密。结果因图片过大不再展示。
import cv2 import numpy as np # 定义加密、解密方法 def encode_img(img, img_key): result = img = cv2.bitwise_xor(img, img_key) return result # 原图 img = cv2.imread("pic.jpg") rows, colmns, channel = img.shape # 创建大小相等的密钥图像 img_key = np.random.randint(0, 256, (rows, colmns, 3), np.uint8) cv2.imshow("img", img) cv2.imshow("img_key", img_key) Encryption_result = encode_img(img, img_key) cv2.imshow("After Encryption", Encryption_result) Decryption_result = encode_img(Encryption_result, img_key) cv2.imshow("After Decryption", Decryption_result) cv2.waitKey() cv2.destroyAllWindows()
3.图像的合并
图像合并也是图像处理的一种常用操作,图像合并可以分为加权合并和覆盖合并。
再找一张与pic.jpg相同尺寸、名为“pic2.jpg”的图片如下图所示:
将该图片与pic.jpg分别按照0.2和0.8的权重进行合并,代码即执行效果如下:
3.1加权合并
import cv2 img1 = cv2.imread("pic.jpg") img2 = cv2.imread("pic2.jpg") rows, colmns, channel = img1.shape img3 = cv2.resize(img2, (colmns, rows)) img = cv2.addWeighted(img1, 0.8, img3, 0.2, 0) cv2.imshow("new_pic", img) cv2.waitKey() cv2.destroyAllWindows()
3.2 覆盖合并
OpenCV没有直接提供覆盖操作的方法,因此要实现覆盖还需要自己动手。
以下边这张金底白字的标签图片为例(pic3.png),
将其贴在pic.jpg上(覆盖)
import cv2 img1 = cv2.imread("pic.jpg") img2 = cv2.resize(cv2.imread("pic3.png"), dsize=None, fx=2, fy=2) y, x, z = img2.shape X = 180 Y = 70 img1[Y:Y+y, X:X+x, :] = img2 cv2.imshow("new_pic", img1) cv2.waitKey() cv2.destroyAllWindows()
效果呈现如下