文章目录
1.算术运算
注:进行算术运算的两幅图的像素大小须一致
我们可以从opencv解压出来的文件夹里找到两张图片,目录为opencv\sources\samples\data,里面的LinuxLogo.jpg和WindowsLogo.jpg这两张图片的像素大小是一样的,分别为:
1.1像素加法运算
代码为:
def add_demo(m1, m2): # 像素加法运算
dst = cv.add(m1, m2)
cv.imshow("add_demo", dst)
产生的效果为:
在图像中,黑色部分的值为0,白色部分是255,因此在相加后,除了linuxlogo白色部分的地方都是windowslogo的原样,而白色部分再次相加后超过了255,因此就等于255。
1.2像素减法运算
代码为:
def subtract_demo(m1, m2): # 像素减法运算
dst = cv.subtract(m1, m2)
cv.imshow("subtract_demo", dst)
产生的效果为:
在图像中,0减去像素值后的结果为0,所以为黑色,白色255减去windowslogo中的颜色为其他彩色,所以产生了上图所示的效果。
1.3像素除法运算
代码为:
def divide_demo(m1, m2): # 像素除法运算
dst = cv.divide(m1, m2)
cv.imshow("divide_demo", dst)
产生的效果为:
1.4像素乘法运算
代码为:
def multiply_demo(m1, m2): # 像素乘法运算
dst = cv.multiply(m1, m2)
cv.imshow("multiply_demo", dst)
产生的效果为:
1.5像素平均值运算
代码为:
M1 = cv.mean(m1) # 像素平均值运算
M2 = cv.mean(m2)
print(M1)
print(M2)
结果为:
linuxlogo图片由于只有黑和白两种颜色,所以计算出来的均值不高,windowslogo图片由于充满了各种颜色,所以计算出来的均值较高。
1.6像素均值和方差运算
代码为:
M1, dev1 = cv.meanStdDev(m1) # 像素RGB标准方差运算
M2, dev2 = cv.meanStdDev(m2)
print(M1)
print(M2)
print(dev1)
print(dev2)
结果为:
前两组数据为平均值,后两组数据为标准方差。
linuxlogo的方差要比windowslogo的方差要大。
2.逻辑运算
注:进行逻辑运算的两幅图的像素大小须一致
2.1逻辑与运算
代码为:
dst = cv.bitwise_and(m1, m2) # 逻辑运算:与
cv.imshow("logic_demo", dst)
结果为:
在逻辑运算中,0与任何非0区域的值为0,1与任何非0区域的值为原图像的值。
2.2逻辑或运算
代码为:
dst = cv.bitwise_or(m1, m2) # 逻辑运算:或
cv.imshow("logic_demo", dst)
结果为:
在逻辑运算中,0或任何非0区域的值为原图像的值,1或任何非0区域的值为255,也就是白色。
2.3逻辑非运算
代码为:
image = cv.imread("D:/opencv3/image/LinuxLogo.jpg")
dst = cv.bitwise_not(image) # 逻辑运算:非
cv.imshow("logic_demo", dst)
结果为:
逻辑非运算是对一张图像的逻辑运算。
3.调节图像亮度和对比度
代码为:
src = cv.imread("D:/opencv3/image/snow girl5.png")
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
contrast_brightness_demo(src, 1.1, 15)
def contrast_brightness_demo(image, c, b): # 调节图片对比度和亮度
h, w, ch = image.shape
blank = np.zeros([h, w, ch], image.dtype)
dst = cv.addWeighted(image, c, blank, 1-c, b)
cv.imshow("contr_bri_demo", dst)
其中c为对比度,b为亮度。
首先,我们要得到原图像的长,宽和通道数,然后创建一张和原图大小类型一样的图像,接着我们在通过相应的API来调节亮度和对比度。
原图为:
经过对比度和亮度调节后的效果为:
完整代码
import cv2 as cv # 导入opencv模块
import numpy as np # 导入数学函数库
def add_demo(m1, m2): # 像素加法运算
dst = cv.add(m1, m2)
cv.imshow("add_demo", dst)
def subtract_demo(m1, m2): # 像素减法运算
dst = cv.subtract(m1, m2)
cv.imshow("subtract_demo", dst)
def divide_demo(m1, m2): # 像素除法运算
dst = cv.divide(m1, m2)
cv.imshow("divide_demo", dst)
def multiply_demo(m1, m2): # 像素乘法运算
dst = cv.multiply(m1, m2)
cv.imshow("multiply_demo", dst)
def logic_demo(m1, m2):
# dst = cv.bitwise_and(m1, m2) # 逻辑运算:与
# dst = cv.bitwise_or(m1, m2) # 逻辑运算:或
image = cv.imread("D:/opencv3/image/LinuxLogo.jpg")
dst = cv.bitwise_not(image) # 逻辑运算:非
cv.imshow("logic_demo", dst)
def contrast_brightness_demo(image, c, b): # 调节图片对比度和亮度
h, w, ch = image.shape
blank = np.zeros([h, w, ch], image.dtype)
dst = cv.addWeighted(image, c, blank, 1-c, b)
cv.imshow("contr_bri_demo", dst)
def others(m1, m2):
# M1 = cv.mean(m1) # 像素平均值运算
# M2 = cv.mean(m2)
M1, dev1 = cv.meanStdDev(m1) # 像素RGB标准方差运算
M2, dev2 = cv.meanStdDev(m2)
# h, w = m1.shape[:2] # 只取图像的高、宽,不取通道
print(M1)
print(M2)
print(dev1)
print(dev2)
# img = np.zeros([h, w], np.uint8)
# m, dev = cv.meanStdDev(img)
# print(m)
# print(dev)
print("------------hello python!------------")
src1 = cv.imread("D:/opencv3/image/LinuxLogo.jpg")
src2 = cv.imread("D:/opencv3/image/WindowsLogo.jpg")
# print(src1.shape)
# print(src2.shape)
cv.namedWindow("input_image1", cv.WINDOW_AUTOSIZE)
cv.namedWindow("input_image2", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image1", src1)
cv.imshow("input_image2", src2)
# add_demo(src1, src2)
# subtract_demo(src1, src2)
# divide_demo(src1, src2)
# multiply_demo(src1, src2)
# others(src1, src2)
# logic_demo(src1, src2)
src = cv.imread("D:/opencv3/image/snow girl5.png")
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
contrast_brightness_demo(src, 1.1, 15)
cv.waitKey(0)
cv.destroyAllWindows() # 释放所有窗口