实践-给图片右下角加opencv-logo
目录
实践-给图片右下角加opencv-logo
读取大图和logo原图
lena = cv2.imread('D:\lene02.png',1) # 选择了一张分辨率更大的图片,更改图片路径
logo = cv2.imread('D:\cv-log.png',1)
用
到
的
图片
:
裁剪
过
的
lena
提取大图右下角ROI
h1, w1, c1 = lena.shape
h2, w2, c2 = logo.shape
# 定位大图右下角区域roi,使其具有logo的尺寸
roi = lena[h1-h2:h1,w1-w2:w1]
# 注意:对roi的操作就是对lena原图的操作
cv2.imwrite('D:\lene02.png',roi)
plt.imshow(roi[:,:,::-1])
把logo原图转换为灰度图
图片
:
opencv
的
logo
利用
cv2.cvtColor
得到灰度图gray
gray = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)
cv2.imwrite('D:\cv-log.png',gray)
plt.imshow(gray, cmap='gray')
通过二值化获取抛弃logo前景的掩码图
使用OTSU二值化方法进行二值化ret, mask1 =
ret, mask1 = cv2. threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imwrite('D:\cv-log.png',mask1)
plt.imshow(mask1, cmap='gray')
二值化
也就是
保留
黑白
通过按位与获得只有大图背景而logo前景挖空的局部图
mask1与roi进行按位与,fg1 = cv2.bitwise_and()
fg1 = cv2.bitwise_and(roi,roi,mask=mask1)
cv2.imwrite('D:\cv-log.png',fg1)
plt.imshow(fg1[:,:,::-1])
其实也就是图片
的
像素
叠层
,
logo
的
前景
像素
覆盖掉
lena
图片
的
对应
像素
通过二值化获取保留logo前景的掩码图
使用
BINARY_INV方法
进行二值化ret, mask2 =
ret, mask2 = cv2.threshold(gray,220,255,cv2.THRESH_BINARY_INV)
cv2.imwrite('D:\cv-log.png',mask2)
plt.imshow(mask2, cmap='gray')
通过
按位与
获得只有logo前景而背景挖空的局部图
mask2与logo进行按位与,fg2 = cv2.bitwise_and
fg2 = cv2.bitwise_and(logo,logo,mask=mask2)
cv2.imwrite('D:\cv-log.png',fg2)
plt.imshow(fg2[:,:,::-1])
提取
过后
的
logo
通过
add()函数
把两个局部图相加
roi[:]=cv2.add
roi[:]=cv2.add(fg1,fg2) #加上“:”是为了确保原图的提取
cv2.imwrite('D:\cv-log.png',roi)
plt.imshow(roi[:,:,::-1])
提取
后
的
roi
视图
把合成照片放回Lena照片的右下角
lena[h1-h2:h1,w1-w2:w1] = roi
plt.imshow(lena[:, :, ::-1])
plt.xticks([]), plt.yticks([])
不打印
坐标
,
这是
原图
视图
使用掩码对lena图像的脸部进行打码、解码
lena = cv2.imread(image_path)
h,w, _ = lena.shape # 图片的行(高)h、列(宽)w
只显示lena脸部,其他部分打码
mask1 = np.zeros((h,w), dtype=np.uint8) #生成一个掩膜图像(任何一个数与0与运算都是0,任何一个数与1与运算都是这个数本身)
mask1[200:400, 200:380]=255 #这个掩膜图像大小是lena.shape的大小,像素值是0或255
# # 或者用cv2.selectROI自己选取ROI区域
# TODO: lena_face = cv2.bitwise_and()
lena_face = cv2.bitwise_and(lena,lena,mask = mask1)
imgs = np.hstack([lena, lena_face])
plt.imshow(imgs[:, :, ::-1])
去掉Lena脸部
mask2 = np.ones((h,w), dtype=np.uint8)*255
mask2[200:400, 200:380]=0
# TODO:lena_no_face = cv2.bitwise_and()
lena_no_face = cv2.bitwise_and(lena ,lena , mask=mask2)
imgs = np.hstack([lena, lena_no_face])
plt.imshow(imgs[:, :, ::-1])
给lena脸部打彩色码
lena_no_face_color = lena.copy()
ROI =np.random.randint(0,
256,
size=(400-200,380-200,3),
dtype = np.uint8)
lena_no_face_color[200:400, 200:380] = ROI
imgs = np.hstack([lena, lena_no_face_color])
plt.imshow(imgs[:, :, ::-1])
原理
是
随机
的
生成
0
2
5
5
的
像素
值
(点)
ROI
=
np
.
random
.
randint
(
0
,
256
,
size
=
(
400
200
,
380
200
,
3
),
dtype
=
np
.
uint8
)
给图像加密/解密
随机生成密钥图像,尺寸跟lena图像相同
#生成一个随机密钥图像
key = np.random.randint(0,
256,
size=(h,w,3),
dtype = np.uint8)
#1、使用密钥key对lena整体加密
lena_encryption = cv2.bitwise_xor(lena,key) # 在逻辑异或中,如果两个比特位相同,则结果为0;如果不同,则结果为1
plt.imshow(lena_encryption[:, :, ::-1])
只对lena脸部应用密钥进行解密(逻辑异或操作)
face_only = lena_encryption.copy()
# face_only[200:400, 200:380] = lena_face[200:400, 200:380]
face_only[200:400, 200:380] = cv2.bitwise_xor(face_only[200:400, 200:380],key[200:400, 200:380])
plt.imshow(face_only[:, :, ::-1])
使用密钥key对lena整体解密
lena_decryption = cv2.bitwise_xor(lena_encryption,key)
plt.imshow(lena_decryption[:, :, ::-1])