【opencv3 学习记录】第七章 图像上的像素运算

一:图像加法

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

注:OpenCV 中的加法与 Numpy 的加法是有所不同的。OpenCV 的加法 是一种饱和操作,而 Numpy 的加法是一种模操作。

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

这种差别在你对两幅图像进行加法时会更加明显。OpenCV 的结果会更好 一点。所以我们尽量使用 OpenCV 中的函数。

二:图像混合

        这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混 合或者透明的感觉。图像混合的计算公式如下:

          

通过修改 α 的值(0→1),可以实现非常酷的混合

1.函数:cv2.addweighted(img1, α,img2,1- α,\gamma)

\gamma一般为0

2.举例:将两幅图进行混合操作,权重分别为0.7与0.3

import cv2
import numpy as np
img1=cv2.imread('ml.png')
img2=cv2.imread('opencv_logo.jpg')
dst=cv2.addWeighted(img1,0.7,img2,0.3,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindow()

三:按位运算【OpenCV + Python】之bitwise_and、bitwise_not,bitwise_xor等图像基本运算(opencv位操作)_zhouzongzong的博客-CSDN博客_cv2.bitwise_xorhttps://blog.csdn.net/zhouzongzong/article/details/93028651

       这里包括的按位操作有:AND,OR,NOT,XOR 等。当我们提取图像的 一部分,选择非矩形 ROI 时这些操作会很有用(下一章你就会明白)。下面的 例子就是教给我们如何改变一幅图的特定区域。 我想把 OpenCV 的标志放到另一幅图像上。如果我使用加法,颜色会改 变,如果使用混合,会得到透明效果,但是我不想要透明。如果他是矩形我可 以象上一章那样使用 ROI。但是他不是矩形。但是我们可以通过下面的按位运 算实现:

       计算中参数提到mask,下面介绍下mask作用:

图像掩膜用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。
数字图像处理中,掩模为二维矩阵数组,有时也用多值图像,图像掩模主要用于:
①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
④特殊形状图像的制作。
在所有图像基本运算的操作函数中,凡是带有掩膜(mask)的处理函数,其掩膜都参与运算(输入图像运算完之后再与掩膜图像或矩阵运算)。

      如果一个给定的像素的值大于零,那么这个像素会被打开,如果它的值为零,它就会被关闭。按位功能在这些二进制条件下运行。

AND:当且仅当两个像素都大于零时,按位AND才为真,相与取较小值为结果
OR:如果两个像素中的任何一个大于零,则按位“或”为真,相或取较大值为结果
XOR 异或功能:当且仅当两个像素转化为二进制进行异或计算
NOT 取反:倒置图像中的“开”和“关”像素。

import cv2
import numpy as np
#加载图像
img1 = cv2.imread('C:/Users/Desktop/1.JPG')
img2 = cv2.imread('C:/Users/Desktop/opencv.jpg')
#I want to put logo on top-left corner, So I create a ROI
rows,cols,channels = img2.shape
print(img2.shape)
print(img1.shape)
roi = img1[0:rows, 0:cols ]
#Now create a mask of logo and create its inverse mask also
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
#cv2.imshow("img2gray",img2gray)
ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)
cv2.imshow("mask",mask)
mask_inv = cv2.bitwise_not(mask)
#cv2.imshow("mask_inv",mask_inv)
#Now black-out the area of logo in ROI
#取 roi 中与 mask 中不为零的值对应的像素的值,其他值为 0
#注意这里必须有 mask=mask 或者 mask=mask_inv, 其中的 mask= 不能忽略
img1_bg = cv2.bitwise_and(roi,roi,mask = mask)
cv2.imshow("img1_bg",img1_bg)
#取 roi 中与 mask_inv 中不为零的值对应的像素的值,其他值为 0。
#Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
cv2.imshow("img2_fg",img2_fg)
#Put logo in ROI and modify the main image
dst = cv2.add(img1_bg,img2_fg)
cv2.imshow("dst ",dst )
img1[0:rows, 0:cols ] = dst
#cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像位运算的核心: 灰度图由0~255表示,0为黑,255为白,从位操作的角度出发,纯黑色为0,不是纯黑色为1。在此基础上进行相当于布尔逻辑运算。

     所以在一些纯白色,或者纯黑色背景里,可以转为灰度图,利用阈值将非背景色的内容抠出来作为模板,再与原图做位操作,进行抠图。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值