03 OpenCV图像运算

简介: 03 OpenCV图像运算

1 普通加法


1 加号相加

在 OpenCV 中,图像加法可以使用加号运算符(+)来实现。例如,如果要将两幅图像相加,可以使用以下代码:


import cv2
img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")
dst = img1 + img2
cv2.imshow("Result", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()


使用+相加的计算原理是:


image.png

即当两份图像相加之后超过上限时,其值为除以256之后的余数。(注意与add函数的计算原理区分)


2 add函数


函数cv2.add()可以用来计算图像像素值相加的和,其语法格式为:


计算结果=cv2.add(像素值a,像素值b)


使用add相加的计算原理是:

image.png


通过对比可以看出两个方式的差异


import cv2  
a = cv2.imread("lenacolor.png", 0)  
b = a  
result1 = a + b  
result2 = cv2.add(a, b)  
cv2.imshow("original", a)  
cv2.imshow("+", result1)  
cv2.imshow("add", result2)  
cv2.waitKey()  
cv2.destroyAllWindows()



b09a7ca767b794e754205272a3aa4caf.png

除了两个图像相加之外,图像还可以直接与数字相加:


image.png

执行img2=cv2.add(img1,3)运算后,可得到:

image.png

 


2 加权相加

cv2.addWeighted() 函数是 OpenCV 中的图像加权混合函数。该函数可以将两幅图像按照给定的比例进行混合,得到新的图像。

加权相加的计算方法为:

image.png

该函数的语法格式如下:


cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst
1

参数说明:


src1:第一幅图像。

alpha:第一幅图像的比例系数。

src2:第二幅图像。

beta:第二幅图像的比例系数。

gamma:结果图像的亮度调节,不调节则填0,但不可省略。

dst:结果图像。

dtype:结果图像的数据类型。

3 按位运算

1 按位与运算

OpenCV 中的按位与运算的计算原理是二进制位的位与运算。

在计算机中,图像的像素是以二进制位的形式存储的,因此按位与运算就是对两个图像的对应像素的二进制位进行“与”运算。

按位与运算的结果取决于两个数的二进制位上的值,如果两个二进制位都是 1 11,则结果为 1 11,否则结果为 0 00。

例如,如果 A = 10 A=10A=10(二进制为 1010 10101010),B = 6 B=6B=6(二进制为 0110 01100110),则 A  and  B = 2 A \ \text{and} \ B = 2A and B=2(二进制为 0010 00100010)。

在 OpenCV 中,按位与运算可以应用于图像的二值化、边缘检测、形状分析等。通过按位与运算,可以将图像的某些部分提取出来,从而获得更多有用的信息。

通过这一特性,可以实现图片的按掩膜提取功能。


import cv2  
import numpy as np  
a = cv2.imread("lenacolor.png", 0)  
b = np.zeros(a.shape, dtype=np.uint8)  
b[100:400, 200:400] = 255  
c = cv2.bitwise_and(a, b)  
cv2.imshow("a", a)  
cv2.imshow("b", b)  
cv2.imshow("c", c)  
cv2.waitKey()  
cv2.destroyAllWindows()


39d67ea5ea059b47b02312c1dc168456.png



2 按位或运算、非运算

OpenCV 中的按位或运算(Bitwise Or)和非运算(Bitwise Not)是对图像中的每一个像素进行二进制位上的运算。


按位或运算:按位或运算的结果取决于两个数的二进制位上的值,如果两个二进制位中至少有一个是 1 11,则结果为 1 11,否则结果为 0 00。

非运算:非运算是对图像中每一个像素的二进制位取反,如果原来是 0 00,则结果为 1 11;如果原来是 1 11,则结果为 0 00。

在 OpenCV 中,可以使用 cv2.bitwise_or() 和 cv2.bitwise_not() 函数来实现按位或运算和非运算,其使用方法同与运算。


4 掩膜

除了在按位与运算中执行掩膜操作外,在使用add函数时也可以通过mask信息。


import cv2
import numpy as np
img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")
mask = np.zeros(img1.shape[:2], dtype=np.uint8)
cv2.rectangle(mask, (100, 100), (200, 200), (255, 255, 255), -1)
dst = cv2.add(img1, img2, mask=mask)
cv2.imshow("Result", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()


在上面的代码中,首先创建了一个全黑的掩膜,然后使用 cv2.rectangle() 函数在掩膜上绘制了一个白色的矩形,该矩形代表了加法运算只需要应用到图像的一部分。

最后,在调用 cv2.add() 函数时,将掩膜作为参数传入,从而只对图像的矩形区域进行加法运算。


相关文章
|
2天前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
6 0
|
26天前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
23 1
|
26天前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
20 1
|
26天前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
32 0
|
26天前
|
算法 计算机视觉
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
15 0
|
26天前
|
算法 计算机视觉
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
11 0
|
26天前
|
算法 计算机视觉
【Qt&OpenCV 图像阈值操作 threshold】
【Qt&OpenCV 图像阈值操作 threshold】
15 0
|
26天前
|
资源调度 算法 计算机视觉
【Qt&OpenCV 图像平滑/滤波处理 -- Blur/Gaussian/Median/Bilateral】
【Qt&OpenCV 图像平滑/滤波处理 -- Blur/Gaussian/Median/Bilateral】
22 0
|
26天前
|
算法 计算机视觉
【Qt&OpenCV 图像缩放resize()】
【Qt&OpenCV 图像缩放resize()】
16 0
|
1月前
|
算法 计算机视觉 Python
openCV 3计算机视觉 Python语言实现 笔记 第三章 使用OpenCV 3处理图像
openCV 3计算机视觉 Python语言实现 笔记 第三章 使用OpenCV 3处理图像