python 下 opencv 的实现图像的基础数学计算

系列文章目录

第一章 python 下 opencv 接口的参数详解及使用(一)

第一章 python 下 opencv 接口的参数详解及使用(二)

第二章 python 下 opencv 的实现图像的基础数学计算

第三章  python 下 opencv 接口实现图像二值化,并小解二值化原理


 


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、对图像的数学运算

1、图像相加

接口:cv2.add(src1 , src2 , dst = None , mask = None , dtype = None)

作用:用于两张图像或者颜色相机;

参数:

。src1 :需要相加的第一幅图象文件;

。src2 :需要相加的第二幅图像文件,鉴于仅用于两图像的相加,所以需要通道和宽高相同;

。dst :两图相加后的结果图文件;

。mask :掩码(mask),可有可无

。dtype :相加结果图像的景深,此参数可有可无;

实现代码及成像效果:


import cv2
 
filename_1 = "image_1.bmp"
filename_2 = "image_2.bmp"
# 读入图像数据
image_1 = cv2.imread(filename = filename_1 ,flags= 1)
image_2 = cv2.imread(filename = filename_2 ,flags= 1)
 
image = cv2.add(src1 = image_1, src2 = image_2 )
 
# 对图像进行显示
cv2.imshow(winname = "image_1" , mat = image_1)
cv2.imshow(winname = "image_2" , mat = image_2)
cv2.imshow(winname = "image_show" , mat = image)
cv2.waitKey(0)
cv2.destroyAllWindows()

实现效果:

2、图像相加融合

接口:cv2.addWeighted(src1 , alpha , src2 , beta , gamma , dst = None , dtype = None)

作用:用于两张图像相加融合;

参数:

。src1 :需要相加的第一幅图象文件;

。alpha :第一个图文件的权重;

。src2 :需要相加的第二幅图像文件,鉴于仅用于两图像的相加,所以需要通道和宽高相同;

。beta:第二个图文件的权重;

。gamma :两张图相加后要增加的值,不要太大,不然图片一片白。总和等于255以上就是纯白色了;

。dst :两图相加后的结果图文件;

。dtype :相加结果图像的景深,此参数可有可无;

实现原理:

该接口主要实现以下公式内容: 

g(x) = (1 - \alpha )f_{0}(x) + \alpha f_{1}(x)+\gamma 

公式中: f_{0}(x) 代表第一张图像;f_{1}(x) 代表第二张图像;其中 \left (1 -\alpha \right ) 和 \alpha 代表权重值,其中  \gamma 代表需要再增加的值

实现代码及成像效果:


import cv2
 
filename_1 = "image_1.bmp"
filename_2 = "image_2.bmp"
# 读入图像数据
image_1 = cv2.imread(filename = filename_1 ,flags= 1)
image_2 = cv2.imread(filename = filename_2 ,flags= 1)
 
image = cv2.addWeighted(src1 = image_1, alpha  = 0.3 , src2 = image_2 , beta = 0.4 , gamma  = 0.5)
 
# 对图像进行显示
cv2.imshow(winname = "image_1" , mat = image_1)
cv2.imshow(winname = "image_2" , mat = image_2)
cv2.imshow(winname = "image_show" , mat = image)
cv2.waitKey(0)
cv2.destroyAllWindows()

实现效果:

3、图像按比例相加

接口:cv2.scaleAdd(src1 , alpha , src2 , dst = None)

作用:将第一张图像按照比例相加到第二张图像中;

参数:

。src1 :需要相加的第一幅图象文件;

。alpha :第一个图文件的比例系数;

。src2 :需要相加的第二幅图像文件,鉴于仅用于两图像的相加,所以需要通道和宽高相同;

。dst :结果图像;

实现原理:

该接口主要实现以下公式内容: 

g(x) = \alpha *f_{0}(x) + f_{1}(x)

公式中: f_{0}(x) 代表第一张图像;f_{1}(x) 代表第二张图像;其中 \alpha 代表第一张图 src1 的权重值;

实现代码及成像效果:

import cv2 as cv

filename_1 = "image_1.bmp"
filename_2 = "image_2.bmp"

# 读入图像数据
image_1 = cv.imread(filename = filename_1 ,flags= 1)
image_2 = cv.imread(filename = filename_2 ,flags= 1)

image = cv.scaleAdd(src1 = image_1 , src2 = image_2  , alpha = 0.5)

# 对图像进行显示
cv.imshow(winname = "image_1" , mat = image_1)
cv.imshow(winname = "image_2" , mat = image_2)
cv.imshow('image', image)
cv.waitKey()
cv.destroyAllWindows()

实现效果:

4、图像相减

接口:cv2.subtract(src1 , src2 , dst = None , mask , dtype = -1)

作用:将两张图像进行相减;

参数:

。src1 :需要相减的第一幅图象文件;

。src2 :需要相减的第二幅图像文件,鉴于仅用于两图像的相减,所以需要通道和宽高相同;

。dst :结果图像;

。mask :掩膜

。dtype :输出数组的可选深度

实现原理:

将两张图像逐像素点相减;

实现代码及成像效果:

import cv2 as cv

filename_1 = "1.bmp"
filename_2 = "2.bmp"

# 读入图像数据
image_1 = cv.imread(filename = filename_1 ,flags= 1)
# 对图像进行缩放操作
image_1 = cv.resize(src = image_1 , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)

image_2 = cv.imread(filename = filename_2 ,flags= 1)
# 对图像进行缩放操作
image_2 = cv.resize(src = image_2 , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)

image = cv.subtract(src1 = image_1 , src2 = image_2 )
# 对图像进行缩放操作
image = cv.resize(src = image , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)
# 对图像进行显示
cv.imshow(winname = "image_1" , mat = image_1)
cv.imshow(winname = "image_2" , mat = image_2)

cv.imshow('image', image)
cv.waitKey()
cv.destroyAllWindows()

实现效果:

5、图像比例相乘

接口:cv2.multiply(src1 , src2 , scale)

作用:将两张图像进行逐像素点相乘;

参数:

。src1 :需要相乘的第一幅图象文件;

。src2 :需要相乘的第二幅图像文件,鉴于仅用于两图像的相乘,所以需要通道和宽高相同;

。scale:相乘的比例因子

实现原理:

将两张图像逐像素点相乘;

实现代码及成像效果:

import cv2 as cv

filename_1 = "image_1.bmp"
filename_2 = "image_2.bmp"

# 读入图像数据
image_1 = cv.imread(filename = filename_1 ,flags= 1)
# 对图像进行缩放操作
image_1 = cv.resize(src = image_1 , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)

image_2 = cv.imread(filename = filename_2 ,flags= 1)
# 对图像进行缩放操作
image_2 = cv.resize(src = image_2 , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)

image = cv.multiply(src1 = image_1 , src2 = image_2  , scale = 0.5)
# 对图像进行缩放操作
image = cv.resize(src = image , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)
# 对图像进行显示
cv.imshow(winname = "image_1" , mat = image_1)
cv.imshow(winname = "image_2" , mat = image_2)
cv.imshow('image', image)
cv.waitKey()
cv.destroyAllWindows()

实现效果:

6、图像比例因子相除

接口:cv2.divide(scale , src1, src2 , dst = None , dtype)

作用:将两张图像取除法,并以相关乘数因子相乘;

参数:

。src1 :需要逐像素点相除的第一幅图像;

。src2 :需要逐像素点相除的第二幅图像;

。scale :需要使用的比例系数;

。dst :结果图像;

。dtype :输出图像的位深,-1表示与 src2 相同;

实现原理:

(1)该接口主要实现以下公式内容: 

         scale*src1/src2

公式中:式中 src1 表示需要逐像素点被除的图像1 , src2 表示需要逐像素点被除的图像2 , scale 表示乘数因子

实现代码及成像效果:

import cv2 as cv

filename_1 = "divide_1.bmp"
filename_2 = "divide_2.bmp"

# 读入图像数据
image_1 = cv.imread(filename = filename_1 ,flags= 1)
# 对图像进行缩放操作
image_1 = cv.resize(src = image_1 , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)

image_2 = cv.imread(filename = filename_2 ,flags= 1)
# 对图像进行缩放操作
image_2 = cv.resize(src = image_2 , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)

image = cv.divide(scale = 50 , src1 = image_1 , src2 = image_2 , dtype = -1)
# 对图像进行缩放操作
image = cv.resize(src = image , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)

# 对图像进行显示
cv.imshow(winname = "image_1" , mat = image_1)
cv.imshow(winname = "image_2" , mat = image_2)
cv.imshow('image', image)
cv.waitKey()
cv.destroyAllWindows()

实现效果:

(2)该接口主要实现以下公式内容: 

         scale/src2

公式中: src2 表示需要逐像素点取倒数的图像2 , scale 表示乘数因子

实现代码及成像效果:

import cv2 as cv

filename_1 = "divide_1.bmp"

# 读入图像数据
image_1 = cv.imread(filename = filename_1 ,flags= 1)
# 对图像进行缩放操作
image_1 = cv.resize(src = image_1 , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)

image = cv.divide(scale = 50 , src2 = image_1 , dtype = -1)
# 对图像进行缩放操作
image = cv.resize(src = image , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)

# 对图像进行显示
cv.imshow(winname = "image_1" , mat = image_1)
cv.imshow('image', image)
cv.waitKey()
cv.destroyAllWindows()

实现效果:

7、图像的幂次运算

接口:cv2.pow(src , power , dst)

作用:将两张图像进行逐像素点相乘;

参数:

。src :需要进行幂次运算的图象文件;

。power:幂次系数;

。dst:结果图像

实现原理:

将图像逐像素点幂次计算;

实现代码及成像效果:

import cv2 as cv

filename_1 = "divide_1.bmp"

# 读入图像数据
image_1 = cv.imread(filename = filename_1 ,flags= -1)
# 对图像进行缩放操作
image_1 = cv.resize(src = image_1 , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)

image = cv.pow(src = image_1 , power = 2)
# 对图像进行缩放操作
image = cv.resize(src = image , dsize = (500 , 500) , interpolation = cv.INTER_NEAREST)

# 对图像进行显示
cv.imshow(winname = "image_1" , mat = image_1)
cv.imshow('image', image)
cv.waitKey()
cv.destroyAllWindows()

实现效果:

二、对图像的逻辑运算

1、对图像“与”操作

接口:cv2.bitwise_and(src1 , src2 , dst , mask)

作用:将两张图像进行逐像素点相与;

参数:

。src1 :需要逐像素点相与的第一幅图像;

。src2 :需要逐像素点相与的第二幅图像;

。dst :结果图像;

。dtype :掩码;

实现原理:

将两张图像逐像素点相与计算;

实现代码及成像效果:

import cv2 as cv

filename_1 = "divide_1.bmp"
filename_2 = "divide_2.bmp"

# 读入图像数据
image_1 = cv.imread(filename = filename_1 ,flags= 1)
# 对图像进行缩放操作
image_1 = cv.resize(src = image_1 , dsize = (800 , 600) , interpolation = cv.INTER_NEAREST)

image_2 = cv.imread(filename = filename_2 ,flags= 1)
# 对图像进行缩放操作
image_2 = cv.resize(src = image_2 , dsize = (800 , 600) , interpolation = cv.INTER_NEAREST)

image = cv.bitwise_and(src1 = image_1 , src2 = image_2)
# 对图像进行缩放操作
image = cv.resize(src = image , dsize = (800 , 600) , interpolation = cv.INTER_NEAREST)

# 对图像进行显示
cv.imshow(winname = "image_1" , mat = image_1)
cv.imshow(winname = "image_2" , mat = image_2)
cv.imshow('image', image)
cv.waitKey()
cv.destroyAllWindows()

实现效果:

2、对图像“或”操作

接口:cv2.bitwise_or(src1 , src2 , dst , mask)

作用:将两张图像进行逐像素点相与;

参数:

。src1 :需要逐像素点或计算的第一幅图像;

。src2 :需要逐像素点或计算的第二幅图像;

。dst :结果图像;

。dtype :掩码;

实现原理:

将两张图像逐像素点或计算;

实现代码及成像效果:

import cv2 as cv

filename_1 = "divide_1.bmp"
filename_2 = "divide_2.bmp"

# 读入图像数据
image_1 = cv.imread(filename = filename_1 ,flags= 1)
# 对图像进行缩放操作
image_1 = cv.resize(src = image_1 , dsize = (800 , 600) , interpolation = cv.INTER_NEAREST)

image_2 = cv.imread(filename = filename_2 ,flags= 1)
# 对图像进行缩放操作
image_2 = cv.resize(src = image_2 , dsize = (800 , 600) , interpolation = cv.INTER_NEAREST)

image = cv.bitwise_or(src1 = image_1 , src2 = image_2)
# 对图像进行缩放操作
image = cv.resize(src = image , dsize = (800 , 600) , interpolation = cv.INTER_NEAREST)

# 对图像进行显示
cv.imshow(winname = "image_1" , mat = image_1)
cv.imshow(winname = "image_2" , mat = image_2)
cv.imshow('image', image)
cv.waitKey()
cv.destroyAllWindows()

实现效果:

3、对图像“异或”操作

接口:cv2.bitwise_xor(src1 , src2 , dst , mask)

作用:将两张图像进行逐像素点相与;

参数:

。src1 :需要逐像素点异或计算的第一幅图像;

。src2 :需要逐像素点异或计算的第二幅图像;

。dst :结果图像;

。dtype :掩码;

实现原理:

将两张图像逐像素点异或计算;

实现代码及成像效果:

import cv2 as cv

filename_1 = "divide_1.bmp"
filename_2 = "divide_2.bmp"

# 读入图像数据
image_1 = cv.imread(filename = filename_1 ,flags= 1)
# 对图像进行缩放操作
image_1 = cv.resize(src = image_1 , dsize = (800 , 600) , interpolation = cv.INTER_NEAREST)

image_2 = cv.imread(filename = filename_2 ,flags= 1)
# 对图像进行缩放操作
image_2 = cv.resize(src = image_2 , dsize = (800 , 600) , interpolation = cv.INTER_NEAREST)

image = cv.bitwise_xor(src1 = image_1 , src2 = image_2)
# 对图像进行缩放操作
image = cv.resize(src = image , dsize = (800 , 600) , interpolation = cv.INTER_NEAREST)

# 对图像进行显示
cv.imshow(winname = "image_1" , mat = image_1)
cv.imshow(winname = "image_2" , mat = image_2)
cv.imshow('image', image)
cv.waitKey()
cv.destroyAllWindows()

实现效果:

4、对图像“非”操作

接口:cv2.bitwise_not(src , dst , mask)

作用:将图像进行逐像素点非操作;

参数:

。src :需要逐像素点非计算的图像;

。dst :结果图像;

。dtype :掩码;

实现原理:

将图像逐像素点进行非计算;

实现代码及成像效果:

import cv2 as cv

filename_1 = "divide_1.bmp"

# 读入图像数据
image_1 = cv.imread(filename = filename_1 ,flags= 1)
# 对图像进行缩放操作
image_1 = cv.resize(src = image_1 , dsize = (800 , 600) , interpolation = cv.INTER_NEAREST)

image = cv.bitwise_not(src = image_1)
# 对图像进行缩放操作
image = cv.resize(src = image , dsize = (800 , 600) , interpolation = cv.INTER_NEAREST)

# 对图像进行显示
cv.imshow(winname = "image_1" , mat = image_1)
cv.imshow('image', image)
cv.waitKey()
cv.destroyAllWindows()

实现效果:


总结

在本节中对常见的 opencv 图像处理库中的基础数学计算的接口进行了相关介绍和 python+opencv 的接口实现以及图像结果的显示,有哪些不足还请大家指出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值