一、引言

在《OpenCV-Python图像乘法运算cv2.multiply函数详解及像素值溢出归一化处理》详细介绍了OpenCV-Python的乘法运算,本文将介绍图像乘法的逆运算图像除法。

对于两个图像矩阵A、B来说:

python两个矩阵相chu python两个矩阵相除_python两个矩阵相chu


OpenCV两个图像矩阵的除法计算方法如下:

python两个矩阵相chu python两个矩阵相除_opencv_02

二、图像语法divide语法

调用语法:

divide(src1, src2, dst=None, scale=None, dtype=None)

参数说明:

对比乘法语法,除法语法的参数完全相同,OpenCV手册介绍的除法相关语法内容解读如下:

  1.  src1:作为被除数的图像数组
  2. src2:作为乘除数的图像数组,大小和类型与src1相同
  3. dst:可选参数,输出结果保存的变量,默认值为None,如果为非None,输出图像保存到dst对应实参中,其大小和通道数与输入图像相同,图像的深度(即图像像素的位数)由dtype参数或输入图像确定
  4. scale:可选的结果图像缩放因子,即图像计算过程是src1*scale/src2
  5. mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0
  6. dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如RGB用三个字节表示,则为24位)。
  7. 返回值:相除的结果图像

三、图像除法使用场景

图像除法使用场景中,关于src1和src2两个输入数据与乘法一样,在OpenCV文档中说明是二者必须大小和类型相同,没有说可以其中一个为标量,经老猿实际验证和乘法一样可以使用四元组,其他方面包括scale的使用等都一样,具体可以参考在OpenCV-Python图像乘法运算cv2.multiply函数详解及像素值溢出归一化处理》中的介绍,因此下面介绍只介绍两个真正图像相除的场景。

查阅相关资料介绍,两个图像相除可以用于纠正由于照明或传感器的非均匀性造成的图像灰度阴影,还可用于产生比率图像。关于这两个用途老猿暂时还没有理解,也未查到实例。但老猿做了个测试,两个近似图像相除也可以用于发现二者的差异。下面举例来介绍一下:

案例原图

下面为两张图片shape1.png和shape2.png:

python两个矩阵相chu python两个矩阵相除_python_03


这两张图片大小完全一致,只是有局部在形状或颜色不同。

使用如下代码进行除法处理:

import numpy as np
import cv2
def main():
    img1 = cv2.imread(r'F:\pic\shape1.png').astype(np.float32)
    img2 = cv2.imread(r'F:\pic\shape2.png').astype(np.float32)
    img1DivImg2 = cv2.divide(img1, img2)
    img2DivImg1 = cv2.divide(img2, img1)

    imgNormalize1 = cv2.normalize(img1DivImg2,None,0,255,cv2.NORM_MINMAX)
    imgNormalize2 = cv2.normalize(img2DivImg1, None, 0, 255, cv2.NORM_MINMAX)  # opencv归一化处理

    cv2.imshow('shape1', img1.astype(np.uint8))
    cv2.imshow('shape2', img2.astype(np.uint8))
    cv2.imshow('img1DivImg2', img1DivImg2.astype(np.uint8))
    cv2.imshow('imgNormalize1', imgNormalize1.astype(np.uint8))
    cv2.imshow('imgNormalize2', imgNormalize2.astype(np.uint8))

    cv2.waitKey(0)


main()

运行结果截图:

python两个矩阵相chu python两个矩阵相除_python两个矩阵相chu_04


上面图片中下面两张是原图,上面第一张为shape1.png除shape2.png后进行归一化处理的结果,上面第二张为shape2.png除shape1.png后进行归一化处理的结果,上面第三张为shape1.png除shape2.png未进行归一化处理的结果。

关于图像除法的使用上有如下三点需要注意:

  1. 由于两张图像相除后的结果矩阵元素值大部分都很小,因此必须进行归一化才能正常显示;
  2. 图像除法必须基于np.float32进行,否则会导致精度丢失后再进行归一化处理结果矩阵元素会大量出现0;
  3. 由于除数不能为0,因此用作除数的图像如果出现黑色,则会导致矩阵会出现numpy的nan值,出现了nan值后矩阵后续的归一化处理和图像显示都会不正常,因此要选择无黑色内容的图像作为除数

三、小结

本文详细介绍了OpenCV-Python图像除法运算cv2.divide函数的语法,divide函数的语法与乘法的multiply函数基本相同,二者在使用场景上也相同。图像的除法与乘法一样可以调节图像的明亮度,图像间的除法则与减法一样可以发现图像的异同点,只是使用上存在些限制,一般情况下效果也没有减法那么好。