Python+opencv学习记录4:像素运算

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()          # 释放所有窗口

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值