18KW13/6-OpenCV入门-关于图像的算数运算

Posted 一步一步学Python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18KW13/6-OpenCV入门-关于图像的算数运算相关的知识,希望对你有一定的参考价值。

图像上的算数运算

包括加法,减法,位运算
cv2.add(),cv2.addWeighted()等

import cv2
import numpy as np

你可以使用函数 cv2.add() 将两幅图像进行加法运算,当然也可以直接使
用 numpy, res=img1+img。两幅图像的大小,类型必须一致,或者第二个
图像可以使一个简单的标量值。

x=np.uint8([250])
y=np.uint8([10])
print(cv2.add(x,y))#[[255]],260->255

print(x+y)#[4],260%256=4

图像混合
这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混
合或者透明的感觉。
g (x) = (1 − α) f0 (x) + αf1 (x)
函数 cv2.addWeighted() 可以按下面的公式对图片进行混合操作
dst = α · img1 + β · img2 + γ

请牢记,如果图片大小也就是水平和竖直方向上的像素数量不同,就会报错的。

我们可以在画图软件中调整一下图片大小。

img1=cv2.imread('pic/wechat.png')
img2=cv2.imread('pic/mongodb.jpg')

dst=cv2.addWeighted(img1,0.7,img2,0.3,0)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

我们来看一下两张图叠加在一起的效果。

按位操作

有: AND, OR, NOT, XOR 等。
当我们提取图像的一部分,选择非矩形 ROI 时这些操作会很有用.
我想把某部分图像放到另一幅图像上。如果使用加法,颜色会改变。
如果使用混合,会得到透明效果,但是不想要透明。
如果这部分图像是矩形,我可以象上一章那样使用 ROI。但是他不是矩形。
所以只能使用按位运算来实现:

我们把绿色的叶子,转移到另一张图上。

后面我们会把所有的图片都截图贴出来,以便大家参考。

import cv2
import numpy as np
#加载图像
img1=cv2.imread('pic/wechat.png')#这是目标图片
img2=cv2.imread('pic/leaf.jpg')#这是我们的绿叶logo
#获取img2的行、列、通道数
rows,cols,channels=img2.shape
#从目标图片中,确定好与leaf大小一致的区域
roi=img1[0:rows,0:cols]
''' # 彩色转灰度   gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)   # 灰度转BGR3通道   color = cv2.cvtColor(grayImg,cv2.COLOR_GRAY2BGR) '''
#转换成灰度照片
img2gray=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

def threshold(src, thresh, maxval, type, dst=None)
The function applies fixed-level thresholding to a multiple-channel array.
-src    input array (multiple-channel, 8-bit or 32-bit floating point).
-dst    output array of the same size and type and the same number of channels as src.
-thresh    threshold value.
-maxval    maximum value to use with the THRESH_BINARY and THRESH_BINARY_INV thresholding types.
这个函数的作用就是将灰度图片以某一个阈值作为区分,黑和白变得很明确
小于175的就是0,其他的是255

ret,mask=cv2.threshold(img2gray,175,255,cv2.THRESH_BINARY)
#not运算就是将上面的图片进行反转,黑和白转换一下
mask_inv=cv2.bitwise_not(mask)

按位求和

我们来看一下按位求和运算的函数
def bitwise_and(src1, src2, dst=None, mask=None)
   .   @param src1 first input array or a scalar.
   .   @param src2 second input array or a scalar.
   .   @param dst output array that has the same size and type as the input
   .   arrays.
   .   @param mask optional operation mask, 8-bit single channel array, that
   .   specifies elements of the output array to be changed.
也就是说mask参数,就是用来指定输出矩阵中要改变的元素。

img1_bg=cv2.bitwise_and(roi,roi,mask=mask)
img2_fg=cv2.bitwise_and(img2,img2,mask=mask_inv)

dst=cv2.add(img1_bg,img2_fg)
img1[0:rows,0:cols]=dst
#cv2.imshow('img2gray',img2gray)
#cv2.imshow('mask',mask)
#cv2.imshow('mask_inv',mask_inv)
cv2.imshow('img1_bg',img1_bg) cv2.imshow('img2_bg',img2_fg) cv2.imshow('dst',dst)
#cv2.imshow('res',img1)
cv2.waitKey(0) cv2.destroyAllWindows()


以上是关于18KW13/6-OpenCV入门-关于图像的算数运算的主要内容,如果未能解决你的问题,请参考以下文章

18KW15/1-OpenCV入门-初识轮廓

18KW13/4-OpenCV入门-制作一个调色板

2018KW13/3-OpenCV入门-鼠标当作画笔

2018KW13/1-OpenCV入门-视频的捕获和存取

《C#零基础入门之百识百例》 算数运算符 -- 圆的面积

关于fpga的数字图像处理的入门问题