作者:Xiou
针对图像的加法运算、位运算都是比较基础的运算。但是,很多复杂的图像处理功能正是借助这些基础的运算来完成的。所以,牢固掌握基础操作,对于更好地实现图像处理是非常有帮助的。
简单介绍一下加减法运算、逻辑运算,并使用它们实现了位平面分解、图像异或加密、数字水印、脸部打码/解码等实例。
实例原图所示:
test.jpg
res.jpg
在图像处理过程中,经常需要对图像进行加法运算。可以通过加号运算符“+”对图像进行加法运算,也可以通过cv2.add()函数对图像进行加法运算。
通常情况下,在灰度图像中,像素用8个比特位(一个字节)来表示,像素值的范围是[0,255]。两个像素值在进行加法运算时,求得的和很可能超过255。上述两种不同的加法运算方式,对超过255的数值的处理方式是不一样的。
函数cv2.add()可以用来计算图像像素值相加的和,其语法格式为:
计算结果=cv2.add(像素值a,像素值b)
两张图像相加实例代码:
import cv2 as cvdef add(image1, image2):"""相加"""result = cv.add(image1, image2)cv.imshow("add_demo", result)cv.waitKey(0)cv.destroyAllWindows()return resultif __name__ == "__main__":# 读取图片img1 = cv.imread("test.jpg")img2 = cv.imread("res.jpg")print(img1.shape,img2.shape)# 获得相加的图片add = add(img1, img2)# 保存图片cv.imwrite("add.jpg", add)
切记:img1和img2大小要一样,否则会报错!!
Traceback (most recent call last):File "C:\Users\mjl\Desktop\CV-test\CV2.py", line 19, in add = add(img1, img2)File "C:\Users\mjl\Desktop\CV-test\CV2.py", line 5, in addresult = cv.add(image1, image2)
cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\arithm.cpp:650: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'cv::arithm_op'
输出结果:
代码实例:
import cv2def subtract(image1, image2):"""相减"""result = cv2.subtract(image1, image2)cv2.imshow("add_demo", result)cv2.waitKey(0)cv2.destroyAllWindows()return resultif __name__ == "__main__":# 读取图片img1 = cv2.imread("test.jpg")img2 = cv2.imread("res.jpg")# 获取相减图片subtract = subtract(img1, img2)# 保存图片cv2.imwrite("subtract.jpg", subtract)
输出结果:
代码实例:
import cv2def multiply(image1, image2):"""相成"""result = cv2.multiply(image1, image2)cv2.imshow("add_demo", result)cv2.waitKey(0)cv2.destroyAllWindows()return resultif __name__ == "__main__":# 读取图片img1 = cv2.imread("test.jpg")img2 = cv2.imread("res.jpg")# 获取相乘图片multiply = multiply(img1, img2)# 保存图片cv2.imwrite("multiply.jpg", multiply)
输出结果:
代码实例:
import cv2def divide(image1, image2):"""相除"""result = cv2.divide(image1, image2)cv2.imshow("add_demo", result)cv2.waitKey(0)cv2.destroyAllWindows()return resultif __name__ == "__main__":# 读取图片img1 = cv2.imread("test.jpg")img2 = cv2.imread("res.jpg")# 获取相除图片divide = divide(img1, img2)# 保存图片cv2.imwrite("divide.jpg", divide)
输出结果:
逻辑运算是一种非常重要的运算方式,图像处理过程中经常要按照位进行逻辑运算,简单介绍OpenCV中的按位逻辑运算,简称位运算。
在OpenCV中,可以使用cv2.bitwise_and()函数来实现逻辑与运算,其语法格式为:
dst = cv2.bitwise_and( src1, src2[, mask]] )
代码实例:
import cv2def logic_and(image1, image2):"""逻辑与"""result = cv2.bitwise_and(image1, image2)# 结果展示cv2.imshow("result", result)cv2.waitKey(0)cv2.destroyAllWindows()return resultif __name__ == "__main__":# 读取图片img1 = cv2.imread("test.jpg")img2 = cv2.imread("res.jpg")# 获取逻辑与后的图片logic_and = logic_and(img1, img2)# 保存图片cv2.imwrite("logic_and.jpg", logic_and)
输出结果:
在OpenCV中,可以使用cv2.bitwise_or()函数来实现按位或运算,其语法格式为:
dst = cv2.bitwise_or( src1, src2[, mask]] )
代码实例:
import cv2def logic_or(image1, image2):"""逻辑或"""result = cv2.bitwise_or(image1, image2)# 结果展示cv2.imshow("result", result)cv2.waitKey(0)cv2.destroyAllWindows()return resultif __name__ == "__main__":# 读取图片img1 = cv2.imread("test.jpg")img2 = cv2.imread("res.jpg")# 获取逻辑或后的图片logic_or = logic_or(img1, img2)# 保存图片cv2.imwrite("logic_or.jpg", logic_or)
输出结果:
在OpenCV中,可以使用函数cv2.bitwise_not()来实现按位取反操作,cv2.bitwise_not()可以帮助我们实现像素取反.,其语法格式为:
dst = cv2.bitwise_not( src[, mask]] )
代码实例:
import numpy as np
import cv2def logic_not(image):"""逻辑非"""result = cv2.bitwise_not(img)# 合并result = np.hstack((img, result))# 结果展示cv2.imshow("result", result)cv2.waitKey(0)cv2.destroyAllWindows()return resultif __name__ == "__main__":# 读取图片img = cv2.imread("test.jpg")# 获取取反图片logic_not = logic_not(img)# 保存图片cv2.imwrite("logic_not.jpg", logic_not)
输出结果:
上一篇:常见Java生产问题排查面试题
下一篇:MapBox测量组件