Opencv给图像加水印(图像上的算数运算之位运算)

今天我们来想想如何给图像加水印呢?

图像加水印,就是我们说的图像运算之位运算,位运算简单而言就是加水印,哈哈~

这一章又要给博主的强迫症搞犯了,大家注意:

我把那一整张图包括背景,成为水印;

把水印中的那个标志成为水印标志。

怎么给图像加水印呢?原图像奉上!

Logo
lemongrowup

 

先上一张图

这是我们想要达到的效果图。

我想把opencv的Logo这张水印标志加到我的柠檬苗这张图像上:

先要读取水印与柠檬苗图像,

然后提取出Logo中的标志,

最后把提取出的标志加到柠檬苗这张图像上,

显示图像关闭窗口。

好啦,我们可以开始啦~(因为我们小小的复习一下前几章学过的内容,所以我好方向盘,开车啦)

怎么读取图像呢?

我们要用

  • img1 = cv2.imread(’路径’)
  • img2 = cv2.imread(‘路径’)

我们调用了水印与图像后,若是直接把水印用加法加到图像上,会出现水印图整个加到图像上的情况,而我们仅仅要把标志加到图片上,所以我们要做一些处理。

怎么能把标志分离出来呢?

我们把水印转化成灰度图,创建出一个mask,和一个反向的mask_inv

来看下效果图

(mask效果图)

(mask_inv效果图)

来试着写一下代码

  1. img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

灰度图这个简单~

然而怎么创造mask呢?

  1. ret,mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)

我们重点来说一下这个:

cv2.threshold()

这个函数表示简单阈值,选取一个全局阈值,把整幅图像分成了非黑即白的二值图像。

看到这个10,与255了吗,大家可以改变一下这个数值看看到底阈(yu)值会对图像产生什么样的影响。这里我虽然想给大家展示,不过我忍住了让大家自己去试试。

得到结果可以留言给我~

cv2.threshold函数有四个参数:

(原图像,进行分类的阈值,高于(低于)阈值时赋予的新值,方法选择参数)

方法选择参数有四种情况:

  • cv2.THRESH_BINARY(黑白二值)
  • cv2.THRESH_BINARY_INV(黑白二值反转)
  • cv2.THRESH_TRUNC (得到的图像为多像素值)
  • 还有两种我们暂时不介绍。

 

  1. mask_inv = cv2.bitwise_not(mask)

mask_inv表示反向的,如果原图像为背景黑图像白,这个就是背景白图像黑。

bitwise这个是啥?

当然就是我们说的按位运算啦~

这个按位运算有

bitwise_not,
bitwise_xor,
bitwise_or,
bitwise_and。

今天我们用的bitwise_not实现了将图像变为黑白二值图像。

这个效果是与threshold一样的~

因为我们用threshold()定义了mask,

所以我们用bitwise_not来定义mask_inv。

我把一个定义为图像上水印,一个定义为背景

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

bitwisea_and 就类似图像加法咯~

然后我们该怎么把分离出的标志放在我们想要的地方呢?

我们前几章学过了roi,只要定义的行与列,bingo!

  1. rows,cols,channels = img2.shape
  2. roi = img1[0:rows, 0:cols]

怎么输出图像呢?

  1. dst = cv2.add(img1_bg,img2_fg)
  2. img1[0:rows, 0:cols ] = dst

还记得我们说过的吗?

src表示输入,

dst表示输出。

用dst来写好我们想要加上水印标志的地方吧~

怎么显示图像呢,怎么释放窗口呢?

cv2.imshow()

cv2.destroyAllWindows()

大家还记得吧!

来吧!上所有代码,为了让大家更加明了,我将所有处理的图像都输出。

# -*- coding:utf-8 -*-
"""
Created on Sun Jan 29 大年初二 19:22:24 2017

@author: Y

"""

import cv2
import numpy as np

img1 = cv2.imread('C:\Users\Administrator\Desktop\opencvimg\lemongrowup.png')
img2 = cv2.imread('C:\Users\Administrator\Desktop\opencvimg\Logo.png')

rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]

img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret,mask = cv2.threshold(img2gray, 200, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)

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

dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst

cv2.imshow('res', img1)
cv2.imshow('img2', img2)
cv2.imshow('bg', img1_bg)
cv2.imshow('fg', img2_fg)
cv2.imshow('inv', mask_inv)
cv2.imshow('m', mask)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

上一章所有图像大集合

这是所有的效果图~

今天是大年初二,依旧沉浸在过年的喜庆中,希望大家在这年中有所收获,多关心父母,多关心家中老人,回家看看吧,他们很想你!陪他们唠唠嗑,陪他们散散步,伴他们左右,汇报当年他/她们对我们的爱~祝愿普天下的人们新春快乐,阖家欢乐,幸福美满。我是Y,大家下次见咯,拜拜~

 

 

《Opencv给图像加水印(图像上的算数运算之位运算)》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注