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显示图片的