python_opencv图像算术运算(cv2.bitwise_and(),cv2.bitwise_not())按位运算

图像算术运算(加法、减法、按位运算)

目标:

  • 算术运算:加法,减法,按位运算原理

  • 主要函数:cv2.add(), cv2.addWeighted()…

1、图像加法

​ 使用opencv的函数,cv2.add(img1, img2),也可以使用numpy数组的加法操作,res = img1+img2,两幅图像大小、类型必须一致,或者第二个图像是一个简单的标量值。

Opencv的加法和Numpy的加法是不一样的,看下面列子

python_opencv图像算术运算(cv2.bitwise_and(),cv2.bitwise_not())按位运算_第1张图片

​ 可以看到Opencv中的加法,溢出后取的是饱和值也就是最大范围值,而numpy中加法饱和后重新计数(模操作),所以一般用Opencv的加法比较好。

  • 图像混合

    • 图像混合是加法的一种特例,只是不是直接相加而是有一个权重,这样可以塑造混合或者透明的效果。

    • 混合的数学公式如下:
      g ( x ) = ( 1 − α ) f 0 ( x ) + α f 1 ( x ) g(x)=(1-\alpha)f_0(x)+\alpha f_1(x) g(x)=(1α)f0(x)+αf1(x)
      通过修改 α \alpha α 的值(0—〉1)来调节混合度。

    • 函数cv2.addWeighted(img1, α \alpha α, img2, (1- α \alpha α))

    代码如下:

    # -*- encoding: utf-8 -*-
    import cv2
    import numpy as np
    
    
    def callback(object):
        pass
    
    
    cv2.namedWindow('image')
    img1 = cv2.imread('empire.jpg')
    [x, y, z] = img1.shape
    # 创建一个相同规格的图像,可以自己读取一张图用切片工具
    # 选出相同大小的矩阵
    img2 = np.zeros([x, y, z], img1.dtype)
    B, G, R = 10, 88, 21  # 自己调色
    img2[:, :, 0] = np.uint8(B)
    img2[:, :, 1] = np.uint8(G)
    img2[:, :, 2] = np.uint8(R)
    cv2.createTrackbar('alpha', 'image', 0, 100, callback)
    
    while True:
        Alpha = cv2.getTrackbarPos('alpha', 'image')/100
        img3 = cv2.addWeighted(img1, Alpha, img2, 1-Alpha, 0)
        cv2.imshow('image', img3)
        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
    cv2.destroyAllWindows()
    
    
    • sorry录制效果欠佳

按位运算

  • 按位操作有: AND, OR, NOT, XOR 等,在我们提取ROI时,通常不是矩形或者椭圆形的,而是根据图像的某些特征选取,这时巧妙运用这些按位操作是很方便的。

  • 例如我项想把下面的图像放在另一个图像上面,如果使用前面的混合选项,会造成两个图像变得透明(变得范白不清楚),而我只想把logo部分添加上去其他部分不需要。

python_opencv图像算术运算(cv2.bitwise_and(),cv2.bitwise_not())按位运算_第2张图片

import cv2
import numpy as np
img1 = cv2.imread('opencvlogo.jpg')
img2 = cv2.imread('fisherman.png')
rows, cols, channels = img1.shape
roi = img2[0:rows, 0:cols]
img2gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
ret, Mask = cv2.threshold(img2gray, 170, 255, cv2.THRESH_BINARY)
Mask_inv = cv2.bitwise_not(Mask)
img1_bg = cv2.bitwise_and(roi, roi, mask=Mask)
img1_fg = cv2.bitwise_and(img1, img1, mask=Mask_inv)
dst = cv2.add(img1_bg, img1_fg)
img2[0:rows, 0:cols] = dst
cv2.imshow('res', Mask)
cv2.imshow('das', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 效果

你可能感兴趣的:(pycv学习)