一、在OpenCV中,加减乘除等数学运算可以用于图像处理和计算机视觉任务中的各种应用。以下是它们的主要用途:
1. 加法cv2.add():
- 图像亮度调整:通过对每个像素的数值进行加法操作,可以实现对图像的亮度调整。
- 图像融合:将两幅图像进行加权相加,可以实现图像融合效果。
2. 减法cv2.subtract():
- 图像差分:用于图像处理中的背景减除、运动目标检测等任务。
- 图像增强:通过减法操作可以突出图像中的细节或特定区域。
3. 乘法cv2.multiply():
- 对比度调整:通过对每个像素的数值进行乘法操作,可以实现对图像的对比度调整。
- 图像混合:与加法类似,可以用于图像的混合操作。
4. 除法cv2.divide():
- 用于一些特殊的图像处理任务,例如频域滤波等。
这些数学运算在图像处理和计算机视觉领域中具有广泛的应用,可以帮助实现图像增强、图像融合、特效处理等功能。配合其他图像处理算法,这些数学运算可以发挥更大的作用,实现更多复杂的图像处理任务。
注意:
两图片运算前,维度尺寸必须一致,超过255的部分被赋值为255,不足0的部分直接赋值0。
图片和单数字相加,数组内所有元素都加上该数字,超出部分对256取模。
二、在OpenCV中,逻辑运算与(AND)、非(NOT)、或(OR)和异或(XOR)有着广泛的应用。以下是它们的主要用途:
1. 与运算 cv2.bitwise_and():
- 用于图像蒙版。通过与操作,可以保留图像中指定区域内的像素,将其他区域置为0。
- 对图像中的特定区域进行遮罩处理。
2. 非运算 cv2.bitwise_not():
- 用于图像反转。对图像进行按位取反操作,将白色变为黑色,黑色变为白色。
- 可以用于提取图像的边缘信息。
3. 或运算 cv2.bitwise_or():
- 用于图像合并。可以将两幅图像进行合并,产生新的图像。
- 用于图像融合和叠加。
4. 异或运算 cv2.bitwise_xor():
- 在图像加密和解密中有一定的应用。
- 可以用于检测图像中的变化区域。
这些逻辑运算在图像处理中非常有用,可以帮助实现图像的分割、特征提取、图像融合等任务。通过适当地组合这些逻辑运算,可以实现复杂的图像处理操作。
注意:与、或、异或是先十进制转二进制,进行运算,在转回十进制,非是对数值在255的基础上取反(255-原值),以下是与和异或举例。
11001100 (204) 11001100 (204) & 11010101 (213) ^ 11010101 (213) ----------- ----------- 11000100 (196) 00011001 (25)
import cv2
import numpy as np
def img_logical_operation(img,img1):
# opencv 的加减乘除
# 两图片运算前,维度,尺寸必须一致,且超过255的部分被赋值为255,不足0的部分直接赋值0
# 图片和单数字相加,数组内所有元素都加上该数字,超出部分对256取模
print(img.shape,img1.shape)
img_add=cv2.add(img,img1) # 加
img_substract=cv2.subtract(img,img1) # 减
img_multiply=cv2.multiply(img,img1) # 乘
img_divide=cv2.divide(img,img1) # 除
cv2.imshow("asmd",np.hstack((img_add,img_substract,img_multiply,img_divide)))
# 图像的融合 Y=A1*x1+A2*x2+B A1+A2最好是等于1
img_addWeighted = cv2.addWeighted(img,0.5,img1,0.5,0)
cv2.imshow("img_addWeighted",img_addWeighted)
# opencv的逻辑运算-- 与、非、或、异或
# 与、或、异或是先十进制转二进制,进行运算,在转回十进制,非是对数值在255的基础上取反(255-原值)
# 11001100 (204) 11001100 (204)
# & 11010101 (213) ^ 11010101 (213)
# ----------- -----------
# 11000100 (196) 00011001 (25)
img_bitwise_and=cv2.bitwise_and(img,img1)
img_bitwise_not=cv2.bitwise_not(img)
img_bitwise_or=cv2.bitwise_or(img,img1)
img_bitwise_xor=cv2.bitwise_xor(img,img1)
cv2.imshow("anox",np.hstack((img_bitwise_and,img_bitwise_not,img_bitwise_or,img_bitwise_xor)))
cat = cv2.imread("cat.jpg")
dog = cv2.imread("dog.jpg")
# img_logical_operation(cat[0:414,0:499],dog[0:414,0:499])
img_logical_operation(cv2.resize(cat,(300,200)),cv2.resize(dog,(300,200)))
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()
三、图像基本变换
import cv2
import numpy as np
#图像的基本变换
def img_Basic_transformation(img):
#图像,修改后的尺寸,dst输出图片,x轴变化比例,y轴变化比例,插值算法
#方法一,: 直接修改至固定尺寸
img1 = cv2.resize(img,(300,300))
#方法二: dsize为None,x,y按比例放大或缩小
img2 = cv2.resize(img,dsize=None,fx=0.5,fy=0.5,interpolation=cv2.INTER_AREA)
cv2.imshow("sc",img1)
cv2.imshow("resize_dog",img2)
#图像的翻转 flipCode 0,>0,<0分别表示上下,左右,上下左右翻转
cv2.imshow("flipCode",np.hstack((cv2.flip(img1,0),cv2.flip(img1, 1),cv2.flip(img1, -1))))
#图像的旋转
i1 = cv2.rotate(img1,rotateCode=cv2.ROTATE_90_CLOCKWISE) #顺时针旋转90
i2 = cv2.rotate(img1, rotateCode=cv2.ROTATE_90_COUNTERCLOCKWISE) #逆时针旋转90
i3 = cv2.rotate(img1, rotateCode=cv2.ROTATE_180) #旋转180
cv2.imshow("rotateCode",np.hstack((i1,i2,i3)))
#仿射变换
#变换矩阵M
# [ x+i [ 1 0 i [ x
# y+j = 0 1 j y
# 1 ] 0 0 1 ] 1 ]
M = np.float32([[1,0,200],[0,1,0]])
h,w,r=img.shape
#图像,变换矩阵,图片尺寸,插值算法,便捷外推法标志,填充边界值
a = cv2.warpAffine(img, M, dsize=(w, h)) #图像平移
cv2.imshow("a",a)
#获取变换矩阵 中心点,角度,缩放比例
M1 = cv2.getRotationMatrix2D((w/2,h/2),0,0.8)
a1 = cv2.warpAffine(img,M1,dsize=(w,h))
cv2.imshow("a1",a1)
#透视变换
print(img.shape)
src = np.float32([[10,10],[420,10],[10,490],[420,490]])
dst = np.float32([[0,0],[400,0],[0,450],[400,450]])
M2 = cv2.getPerspectiveTransform(src,dst)
b = cv2.warpPerspective(img,M2,(400,450))
cv2.imshow("b",b)
cat = cv2.imread("cat.jpg")
dog = cv2.imread("dog.jpg")
# img_logical_operation(cat[0:414,0:499],dog[0:414,0:499])
img_Basic_transformation(dog)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()