需要源码请点赞关注收藏后评论区留言私信~~~
位运算是二进制数特有的运算操作,图像由像素组成,每个像素可以用十进制数表示,十进制整数又可以转化为二进制数,所以图像也可以做位运算,并且位运算是图像数字化技术中一项重要的运算的操作
OpenCV提供了几种常见的位运算方法 如下图所示
一、按位与运算
与运算就是按照二进制位进行判断,如果同一位的数组都是1,则运算结果的相同位数取1,否则取0
图像做与运算时,会把每一个像素值都转为二进制数,然后让两幅图像相同位置的两个像素值做与运算,最后把运算结果保存在新图像的相同位置上
与运算有两个特点,如果某像素与纯白像素做与运算,结果仍然是某像素的原值
如果某像素与纯黑像素做与运算,结果为纯黑像素
由此可以得出,如果原图像与掩模进行与运算,原图像仅保留掩模中白色区域覆盖的内容,其他区域变成黑色
如下图所示
代码如下
import cv2 import numpy as np flower = cv2.imread("amygdalus triloba.png") # 花原始图像 mask = np.zeros(flower.shape, np.uint8) # 与花图像大小相等的掩模图像 mask[120:180, :, :] = 255 # 横着的白色区域 mask[:, 80:180, :] = 255 # 竖着的白色区域 img = cv2.bitwise_and(flower, mask) # 与运算 cv2.imshow("flower", flower) # 展示花图像 cv2.imshow("mask", mask) # 展示掩模图像 cv2.imshow("img", img) # 展示与运算结果 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
二、按位或运算
或运算也是按照二进制位进行判断,如果同一位的数组都是0,则运算结果的相同位数据取0,否则取1
如果某像素与纯白像素做或运算,结果仍然是纯白像素
如果某像素与纯黑像素做或运算,结果仍然是某像素的原值
由此可以得出,如果原图像与掩模进行或运算,原图像仅保留掩模中黑色区域覆盖的内容,其他区域变成白色
代码如下
import cv2 import numpy as np flower = cv2.imread("amygdalus triloba.png") # 花原始图像 mask = np.zeros(flower.shape, np.uint8) # 与花图像大小相等的掩模图像 mask[120:180, :, :] = 255 # 横着的白色区域 mask[:, 80:180, :] = 255 # 竖着的白色区域 img = cv2.bitwise_or(flower, mask) # 或运算 cv2.imshow("flower", flower) # 展示花图像 cv2.imshow("mask", mask) # 展示掩模图像 cv2.imshow("img", img) # 展示或运算结果 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
三、按位取反运算
取反运算是一种单目运算,仅需一个数字参与运算就可以得出结果,取反运算也是按照二进制位进行判断
图像经过取反运算后呈现与原图颜色完全相反的效果
import cv2 flower = cv2.imread("amygdalus triloba.png") # 花原始图像 img = cv2.bitwise_not(flower) # 取反运算 cv2.imshow("flower", flower) # 展示花图像 cv2.imshow("img", img) # 展示取反运算结果 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
四、按位异或运算
异或运算也是按照二进制位进行判断,如果两个运算数同一位上的数字相同,则运算结果的相同位数字取0,否则取1
如果某像素与纯白像素做异或运算,结果位原像素的取反结果
如果某像素与纯黑像素做异或运算,结果仍然是某像素的原值
如果原图像与掩模进行异或运算,掩模白色区域覆盖的内容呈现取反效果,黑色区域覆盖内容保持不变
代码如下
import cv2 import numpy as np flower = cv2.imread("amygdalus triloba.png") # 花原始图像 m = np.zeros(flower.shape, np.uint8) # 与花图像大小相等的0值图像 m[120:180, :, :] = 255 # 横着的白色区域 m[:, 80:180, :] = 255 # 竖着的白色区域 img = cv2.bitwise_xor(flower, m) # 两章图像做异或运算 cv2.imshow("flower", flower) # 展示花图像 cv2.imshow("mask", m) # 展示零值图像 cv2.imshow("img", img) # 展示异或运算结果 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
异或运算还有一个特点,执行一次异或运算得到一个结果,再对这个结果执行第二次异或运算,则还原成最初的值,利用这个特点可以实现对图像内容的加密和解密
下面利用异或运算的特点对图像进行加密和解密
从右到左分别是原图像 密匙图像 加密图像和解密图像 可以看到图像进行了加密
代码如下
import cv2 import numpy as np def encode(img, img_key): # 加密、解密方法 result = img = cv2.bitwise_xor(img, img_key) # 两图像做异或运算 return result flower = cv2.imread("amygdalus triloba.png") # 花原始图像 rows, colmns, channel = flower.shape # 原图像的行数、列数和通道数 # 创建与花图像大小相等的随机像素图像,作为密钥图像 img_key = np.random.randint(0, 256, (rows, colmns, 3), np.uint8) cv2.imshow("1", flower) # 展示花图像 cv2.imshow("2", img_key) # 展示秘钥图像 result = encode(flower, img_key) # 对花图像进行加密 cv2.imshow("3", result) # 展示加密图像 result = encode(result, img_key) # 对花图像进行解密 cv2.imshow("4", result) # 展示加密图像 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
创作不易 觉得有帮助请点赞关注收藏~~~