图像的运算

1.掩模

掩模又叫掩码,就是在图像的规定位置进行操作

其代码如下:

import cv2 as cv
import numpy as np
mask=np.zeros((150,150,3),np.uint8)
mask[50:100,20:80,:]=255
cv.imshow('mask',mask)
mask[:,:,:]=255
mask[50:100,20:80,:]=0
cv.imshow('mask',mask)
cv.waitKey()

修改后

 修改前

 

2.图像的加法:

图像的加法是每个像素点相加

可以使用add方法,还可以使用两个图片直接相加

cv.add(img1,img2)

俩个不同图片相加

实操代码如下

import cv2 as cv
cat=cv.imread(r'img\jmh\cat.jpg')
dog=cv.imread(r'img\jmh\dog.jpeg')
w=800
h=500
W=(w,h)
add=cv.resize(cat,W)
ad=cv.add(add,dog)
cv.imshow('ad',ad)
cv.waitKey()
cv.destroyAllWindows()

 两个相同图片相加

import cv2 as cv
cat=cv.imread(r'img\jmh\cat.jpg')
Cat=cv.add(cat,cat)
cv.imshow('cat',Cat)
cv.waitKey()

 两图片相加保证尺寸一样

直接相加:

import cv2 as cv
cat=cv.imread(r'img\jmh\cat.jpg')
Cat=cat+cat
cv.imshow('cat',Cat)
cv.waitKey()

 

import cv2 as cv
import numpy as np
img1=np.zeros((150,150,3),np.uint8)
img1[:,:,0]=255
img2=np.zeros((150,150,3),np.uint8)
img2[:,:,1]=255
img3=np.zeros((150,150,3),np.uint8)
img3[:,:,2]=255
cv.imshow('img1',img1)
cv.imshow('img2',img2)
cv.imshow('img3',img3)
img=cv.add(img1,img2)
cv.imshow("1+2",img)
img_1=cv.add(img,img3)
cv.imshow('1+2+3',img_1)
cv.waitKey()
cv.destroyAllWindows()

 

 

 

 

 

3.位与运算

与与运算是按照二进制位进行判断,如果同一位的数字都是1,则运算结果的相同位数字取1,否则取0.

例如:00101011&01110011=00100011

dst=cv2.bitwise_and(src1,src2,mask)

src1:第一幅图

src2:第二幅图

mask:可选参数,掩模

与运算的两个特点:

特点1:如果某个像素与纯白像素作为与运算,结果仍然为某像素:

00101011&11111111=00101011

特点二:如果某个像素点与纯黑像素作为与运算,结果为纯黑像素:

00101011&00000000=00000000

实例代码:

import cv2
import cv2 as cv
import numpy as np
img=cv.imread(r'img\jmh\cat.jpg')
mask=np.zeros(img.shape,np.uint8)
mask[120:180:,:]=255
mask[:,80:180,:]=255
cat=cv2.bitwise_and(img,mask)
#cv.imshow('img',img)
#cv.imshow('cat',cat)
cv.imshow('mask',mask)
cv.waitKey()

原图

掩模 

 结果

4.或运算

如果同一位的数字都为0,则运算结果的数字取0,否则取1

例如:00101011 | 01110011=01111011

das=cv.bitwise_or(src1,src2,mask)

src1:第一幅图像 src2:第二幅图像

mask:可选参数掩模

或运算的两个特点:

特点1:如果某图像与白色图像做或运算则结果为纯白像素:

00101011 | 11111111=11111111

特点2:如果某图像与黑色图像做或运算则结果为纯黑像素:

00101011 | 11111111=00101011

实例代码:

import cv2
import cv2 as cv
import numpy as np
img=cv.imread(r'img\jmh\cat.jpg')
mask=np.zeros(img.shape,np.uint8)
mask[120:180:,:]=255
mask[:,80:180,:]=255
cat=cv2.bitwise_or(img,mask)
#cv.imshow('img',img)
#cv.imshow('cat',cat)
cv.imshow('mask',mask)
cv.waitKey()

掩模

 结果

 

5.按位取反运算

取反运算是一种单目运算,仅需一个数字参与运算就可以得出结果。取反运算也是按照二进制位进行判断,如果运算某位上数字是0,则运算结果的相同的数字取1,如果这一位数字是1,则取0

例如:00101011~取反11010100

cv.bitwise_not(src,mask)

src:参与运算的图像

mask:可选参数掩模

图像经过反运算后的效果与原图像完全相反

代码

import cv2 as cv
import matplotlib.pyplot as pl
img=cv.imread(r'img\jmh\dog.jpeg')
dog=cv.bitwise_not(img)
pl.imshow(img[:,:,::-1])
#pl.imshow(dog[:,:,::-1])
pl.show()

原图

 结果图

6.按位异或运算

异或运算也是按照二进制数进行判断,如果两个运算数在同一位上的数字相同,则结果取0,反之取1

例如:

00101011^01110011=01011000

cv2.bitwise_xor(src,mask)

src:参与运算的图像

mask:可选参数,掩模

异或运算的两个特点:

特点1:如果某像素与纯白像素做异或运算,结果为原来像素的相反结果:00101011^00000000=11010100

特点2:如果某像素与纯黑图像做异或运算,结果依然为某像素的原值:00101011^00000000=00101011实例代码如下:

import cv2 as cv
import numpy as np
img=cv.imread(r'img\jmh\cat.jpg')
m=np.zeros(img.shape,np.uint8)
m[120:180,:,:]=255
m[:,80:180,:]=255
cat=cv.bitwise_xor(img,m)
cv.imshow('cat',cat)
cv.waitKey()

掩模部分和按位取反

异或运算还有一个特点,执行一次异或运算得到一个结果,在对这个结果执行第二次异或运算则还原成最初的值。利用这个特点可以对图像进行加密解密

代码如下

import cv2
import numpy as np
def encode(img,img_key):
    result=img=cv2.bitwise_xor(img,img_key)
    return result
cat=cv2.imread(r'img\jmh\cat.jpg')
c,w,h=cat.shape
img_key=np.random.randint(0,256,(c,w,3),np.uint8)
cv2.imshow('2',img_key)
result=encode(cat,img_key)
cv2.imshow('3',result)
result=encode(result,img_key)
cv2.imshow('4',result)
cv2.waitKey()

原图

 钥匙和图片加密

 由于平台不支持5M以上图片上传,顾截取文件夹图片(左钥匙,右图片加密)

解锁的图片

 此博客图片有的有刻度是因为在保存图片的时候使用matplotlib显示图片的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值