OpenCV入门(八)快速学会OpenCV7图像运算
OpenCV入门(八)快速学会OpenCV7图像运算
作者:Xiou
针对图像的加法运算、位运算都是比较基础的运算。但是,很多复杂的图像处理功能正是借助这些基础的运算来完成的。所以,牢固掌握基础操作,对于更好地实现图像处理是非常有帮助的。
简单介绍一下加减法运算、逻辑运算,并使用它们实现了位平面分解、图像异或加密、数字水印、脸部打码/解码等实例。
实例原图所示:
test.jpg
res.jpg
1.加减法运算
在图像处理过程中,经常需要对图像进行加法运算。可以通过加号运算符“+”对图像进行加法运算,也可以通过cv2.add()函数对图像进行加法运算。
通常情况下,在灰度图像中,像素用8个比特位(一个字节)来表示,像素值的范围是[0,255]。两个像素值在进行加法运算时,求得的和很可能超过255。上述两种不同的加法运算方式,对超过255的数值的处理方式是不一样的。
1.1 加法运算
函数cv2.add()可以用来计算图像像素值相加的和,其语法格式为:
计算结果=cv2.add(像素值a,像素值b)
两张图像相加实例代码:
import cv2 as cv
def add(image1, image2):
"""相加"""
result = cv.add(image1, image2)
cv.imshow("add_demo", result)
cv.waitKey(0)
cv.destroyAllWindows()
return result
if __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 <module>
add = add(img1, img2)
File "C:\Users\mjl\Desktop\CV-test\CV2.py", line 5, in add
result = 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'
输出结果:
1.2 减法运算
代码实例:
import cv2
def subtract(image1, image2):
"""相减"""
result = cv2.subtract(image1, image2)
cv2.imshow("add_demo", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
return result
if __name__ == "__main__":
# 读取图片
img1 = cv2.imread("test.jpg")
img2 = cv2.imread("res.jpg")
# 获取相减图片
subtract = subtract(img1, img2)
# 保存图片
cv2.imwrite("subtract.jpg", subtract)
输出结果:
1.3乘法运算
代码实例:
import cv2
def multiply(image1, image2):
"""相成"""
result = cv2.multiply(image1, image2)
cv2.imshow("add_demo", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
return result
if __name__ == "__main__":
# 读取图片
img1 = cv2.imread("test.jpg")
img2 = cv2.imread("res.jpg")
# 获取相乘图片
multiply = multiply(img1, img2)
# 保存图片
cv2.imwrite("multiply.jpg", multiply)
输出结果:
1.4除法运算
代码实例:
import cv2
def divide(image1, image2):
"""相除"""
result = cv2.divide(image1, image2)
cv2.imshow("add_demo", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
return result
if __name__ == "__main__":
# 读取图片
img1 = cv2.imread("test.jpg")
img2 = cv2.imread("res.jpg")
# 获取相除图片
divide = divide(img1, img2)
# 保存图片
cv2.imwrite("divide.jpg", divide)
输出结果:
2.逻辑运算
逻辑运算是一种非常重要的运算方式,图像处理过程中经常要按照位进行逻辑运算,简单介绍OpenCV中的按位逻辑运算,简称位运算。
2.1逻辑与运算
在OpenCV中,可以使用cv2.bitwise_and()函数来实现逻辑与运算,其语法格式为:
dst = cv2.bitwise_and( src1, src2[, mask]] )
代码实例:
import cv2
def logic_and(image1, image2):
"""逻辑与"""
result = cv2.bitwise_and(image1, image2)
# 结果展示
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
return result
if __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)
输出结果:
2.1逻辑或运算
在OpenCV中,可以使用cv2.bitwise_or()函数来实现按位或运算,其语法格式为:
dst = cv2.bitwise_or( src1, src2[, mask]] )
代码实例:
import cv2
def logic_or(image1, image2):
"""逻辑或"""
result = cv2.bitwise_or(image1, image2)
# 结果展示
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
return result
if __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)
输出结果:
2.3逻辑反
在OpenCV中,可以使用函数cv2.bitwise_not()来实现按位取反操作,cv2.bitwise_not()可以帮助我们实现像素取反.,其语法格式为:
dst = cv2.bitwise_not( src[, mask]] )
代码实例:
import numpy as np
import cv2
def logic_not(image):
"""逻辑非"""
result = cv2.bitwise_not(img)
# 合并
result = np.hstack((img, result))
# 结果展示
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
return result
if __name__ == "__main__":
# 读取图片
img = cv2.imread("test.jpg")
# 获取取反图片
logic_not = logic_not(img)
# 保存图片
cv2.imwrite("logic_not.jpg", logic_not)
输出结果: