B站python+opencv3.3视频教学笔记 06-07像素运算

import cv2 as cv
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 multiply_demo(m1, m2):
    dst = cv.multiply(m1, m2)
    cv.imshow("multiply_demo", dst)


def divide_demo(m1, m2):
    dst = cv.divide(m1, m2)
    cv.imshow("divide_demo", dst)


def others(m1,m2):
    M1, dev1 = cv.meanStdDev(m1)
    M2, dev2 = cv.meanStdDev(m2)
    print(M1)
    print(dev1)
    print(M2)
    print(dev2)


    h, w = m1.shape[:2]
    image = np.zeros([h, w], np.uint8)
    m, dev = cv.meanStdDev(image)
    print(m)
    print(dev)


def logic_demo(m1, m2):
    dst_and = cv.bitwise_and(m1, m2)
    cv.imshow("and", dst_and)
    dst_or = cv.bitwise_or(m1, m2)
    cv.imshow("or", dst_or)
    dst_not1 = cv.bitwise_not(m1)
    cv.imshow("not1", dst_not1)
    dst_not2 = cv.bitwise_not(m2)
    cv.imshow("not2", dst_not2)


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("contrast_brightness_demo", dst)


print("--------- Hello, Python ---------")
src1 = cv.imread("D:/opencv/linux.jpg")
src2 = cv.imread("D:/opencv/windows.jpg")
cv.namedWindow("image1", cv.WINDOW_AUTOSIZE)
print(src1.shape)
print(src2.shape)
cv.imshow("image1", src1)
cv.imshow("image2", src2)
src = cv.subtract(src1, src2)
cv.imwrite("D:/opencv/subtract.jpg", src)


add_demo(src1, src2)
ubtract_demo(src1, src2)
multiply_demo(src1, src2)
divide_demo(src1, src2)
others(src1, src2)
logic_demo(src1, src2)
src = cv.imread("D:/opencv/red.jpeg")
cv.imshow("red", src)
contrast_brightness_demo(src, 1.2, 10)

cv.waitKey(0)
cv.destroyAllWindows()

该教程将像素运算分为算数运算与逻辑运算

算数运算

包括像素的加减乘除,可以用来调节亮度、调节对比度
加-add
减-subtract
乘-multiply
除-divide
利用上述命令可直接对像素进行运算

m = cv.mean(image)

利用mean可以得到图片像素的均值

M1, dev1 = cv.meanStdDev(m1)

cv.meanStdDev()返回图片像素的均值及标准差
标准差是方差的算数平方根
image.shape得到的是一个包含三个元素的数组,其中这三个元素依次代表图片的垂直尺寸、水平尺寸、通道数目

因此在新建一张黑色图片时,需要先利用image.shape[:2]得到该数组的前两个元素,即垂直与水平尺寸,然后再利用np.zeros()创建图片,需注意此处要对类型进行定义
需对image.shape[:2]进行注意:
举例说明:

a = [1, 2, 3, 4, 5]
>>> a[2]
3
>>> a[0]
1
>>> a[:2]
[1, 2]
>>> a[2:5]
[3, 4, 5]
>>> a[5]
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    a[5]
IndexError: list index out of range
>>> 

注意a[2:5]时并不计算到5,只计算2,3,4

逻辑运算

任何书与0相与都为0,任何数与1相或都为1,任何数与0相或都保持不变
与 cv.bitwise_and(m1, m2)
或 cv.bitwise_or(m1, m2)
非 cv.bitwise_not(m1)
注意到与、或是对两个对象进行操作,而非则是对一个对象进行操作
bitwise的谷歌翻译意思为:按位

在进行与操作时得到了类似抠图的效果,255(白色)与非零数(如128)相与后得到的数为128

>>> 12 and 5
5
>>> 111 and 1111
1111
>>> 1 and 2
2
>>> 1 and 0.1
0.1
>>> 0.1 and 0.01
0.01
>>> 5 and 5.5
5.5

由上述代码可知,两个非零数相与得到的是第二个数

mask

在上一节的mask里,最终得到的是黑白图像,要想得到彩色图像,可利用bitwise_and命令

mask = cv.inRange(frame, lowerb=lower_hsv, upperb=upper_hsv)
dst = cv.bitwise_and(frame, frame, mask=mask)

bitewise_and包含4个参数:

bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray())

调整对比度与亮度

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("contrast_brightness_demo", dst)

利用image.shape可以得到图片的三个参数
利用np.zeros()可以创建一个新图片

addWeighted

addWeighted()实现图像线性混合效果,就像是PPT的动画效果那样,两层图像融合在一起,注意叠加混合和线性混合是不同的,叠加像是个logo直接粘过去,而线性混合是将两幅图融合在一起,朦朦胧胧那种,并且addWeighted函数要求两个图像的尺寸和类型都一样

   beta = ( 1.0 - alpha );
   addWeighted( src1, alpha, src2, beta, 0.0, dst);

这个函数的原型如上所示,可以看出这个函数最小需要6个参数。
1、 第1个参数,输入图片1,
2、第2个参数,图片1的融合比例(对比度)
3、第3个参数,输入图片2
4、第4个参数,图片2的融合比例(对比度)
5、第5个参数,偏差(亮度)
6、第6个参数,输出图片
第六个参数可作为参数值返回
python中,函数内参数如果是None的话,可作为返回值进行返回

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值