C/C++教程

OpenCV基础入门——图像运算

本文主要是介绍OpenCV基础入门——图像运算,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、加法运算

在图像处理过程中,经常需要对图像进行加法运算。可以通过加号运算符“+”对图像进行加法运算,也可以通过cv2.add()函数对图像进行加法运算。

  • 使用加号进行图像的运算代码如下(示例):
import cv2 
import numpy as np
img1=cv2.imread("LinuxLogo.jpg")
img2=cv2.imread("WindowsLogo.jpg")
img3=img1+img2
cv2.imshow("add",img3)
cv2.waitKey()
cv2.destroyAllWindows()

函数cv2.add()可以计算图像像素值相加的和

  • 使用随机数组模拟灰度图,观察cv2.add()对像素值求和的结果代码如下(示例):

二、逻辑运算与运用

逻辑运算是一种非常重要的运算方式,图像处理过程中经常要按照位进行逻辑运算,简称位运算。在OpenCV内,常见的位运算函数有:

函数名 基本含义 cv2.bitwise_and() 按位与 cv2.bitwise_or() 按位或 cv2.bitwise_xor() 按位异或 cv2.bitwise_not() 按位取反

相对应函数使用代码如下(示例):

按位与 按位或

def logic_demo(m1, m2):
    dst1 = cv2.bitwise_and(m1, m2)
    dst2 = cv2.bitwise_or(m1, m2)
    cv2.imshow("logic_demo_and", dst1)
    cv2.imshow("logic_demo_or",dst2)

按位非运算 按位异或

def logic_demo2(m1,m2):
    dst1=cv2.bitwise_not(m1,m2)
    dst2=cv2.bitwise_xor(m1,m2)
    cv2.imshow("logic_demo_not", dst1)
    cv2.imshow("logic_demo_xor",dst2)

实现

img1=cv2.imread("LinuxLogo.jpg")
img2=cv2.imread("WindowsLogo.jpg")
cv2.imshow("image1", img1)
cv2.imshow("image2", img2)
logic_demo(img1,img2)
#logic_demo2(img2,img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.图像加密和解密

通过图像按位异或实现加密和解密的过程代码如下(示例):

import cv2
import numpy as np
 
demo = cv2.imread("shenmi.jpg", 0)
r, c = demo.shape
key = np.random.randint(0, 256, size=(r, c), dtype=np.uint8)   # 生成随机的密钥图像
 
cv2.imshow("shenmi", demo)              # 显示原始图像
cv2.imshow("key", key)                # 显示密钥图像
 
encryption = cv2.bitwise_xor(demo, key)   # 加密
decryption = cv2.bitwise_xor(encryption, key)  # 解密
 
cv2.imshow("jiami", encryption)      # 显示密文图像
cv2.imshow("jiemi", decryption)      # 显示解密后的图像
 
cv2.waitKey(-1)
cv2.destroyAllWindows()

2.面部打码

将图片进行面部打码代码如下(示例):

import cv2
import numpy as np 
img = cv2.imread("shenmi.jpg",0)
height,width=img.shape
mask=np.zeros((height,width),dtype=np.uint8)
mask[31:124,63:111]=1
key=np.random.randint(0,256,size=(height,width),dtype=np.uint8)
shenmi=cv2.bitwise_xor(img,key)
face=cv2.bitwise_and(shenmi,mask*255)
noface = cv2.bitwise_and(img,(1-mask)*255)
final=face+noface

mask[45:130,125:191]=1
key=np.random.randint(0,256,size=(height,width),dtype=np.uint8)
shenmi=cv2.bitwise_xor(img,key)
face=cv2.bitwise_and(shenmi,mask*255)
noface2 = cv2.bitwise_and(img,(1-mask)*255)

cv2.imshow("img",img)
cv2.imshow("noface ",noface )
cv2.imshow("noface2 ",noface2 )
cv2.waitKey()
cv2.destroyAllWindows()

效果如下(示例):

3.数字水印

图片进行数字水印代码如下(示例):

import cv2 
import numpy as np
lena=cv2.imread("lena.bmp",0)
watermark=cv2.imread("watermark.bmp",0)
w=watermark[:,:]>0
watermark[w]=1
r,c=lena.shape
#============嵌入过程============
t254=np.ones((r,c),dtype=np.uint8)*254
lenaH7=cv2.bitwise_and(lena,t254)
e=cv2.bitwise_or(lenaH7,watermark)
#============提取过程============
t1=np.ones((r,c),dtype=np.uint8)
wm=cv2.bitwise_and(e,t1)
print(wm)
w=wm[:,:]>0
wm[w]=255
#============显示============
cv2.imshow("lena",lena)
cv2.imshow("watermark",watermark*255)  
cv2.imshow("e",e)
cv2.imshow("wm",wm)
cv2.waitKey()
cv2.destroyAllWindows()
这篇关于OpenCV基础入门——图像运算的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!