opencv图像运算(心得)

本章简单讲解加法运算、位运算,并用他们来实现位平面分解,图像异或加密,数字水印等。

1图像加法运算

1.1加号运算符。

当a+b<=255 时,结果为a+b,否则,对结果取模,mod(a+b,256),才能得到最后的结果。

1.2 cv2.add()                   图像可以曝光。

与加号运算符不同的是,当a+b>255时,取255,成为饱和值(最大值)。

该函数可以图像和图像相加,也可以图像和数值相加。

d= cv2.add(image1,image2)
e = cv2.add(a,50)

 

1.3图像加权和                图像可以重叠。

cv2.addWeighted(image1,num1,image2,num2,余项)

        num1,num2和可以等于一,也可以不等于一。

        像素最大值认为255.

示例:

import cv2

a = cv2.imread('C:\\Users\\kinghge\\Desktop\\pylearn\\opencvlearn\\images\\IMG_5130.jpg')
b = cv2.imread('C:\\Users\\kinghge\\Desktop\\pylearn\\opencvlearn\\images\\IMG_5127.jpg')

result1 = cv2.addWeighted(a, 0.5, b, 0.5, 0)

cv2.imshow('a',a)
cv2.imshow('result1', result1)
cv2.imshow("b",b)

cv2.waitKey()
cv2.destroyAllWindows()

 

2按位逻辑运算

2.1与运算

cv2.bitwise_and() 同时为一的时候为一,其他情况为0.

可以完成抠图工作。

import cv2
import numpy as np
a = cv2.imread('C:\\Users\\kinghge\\Desktop\\pylearn\\opencvlearn\\images\\IMG_5130.jpg')

b=np.zeros(a.shape,dtype=np.uint8)

b[100:250,100:250]=255

c = cv2.bitwise_and(a,b)
cv2.imshow('a',a)
cv2.imshow('b',b)
cv2.imshow('c',c)
print("a.shape=",a.shape)
print("b.shape",b.shape)
cv2.waitKey()
cv2.destroyAllWindows()

 

2.2或运算

cv2.bitwise__or(x,y) 同时为0的时候为0,其他情况为1

2.3非运算

cv2.bitwise_not(x,y) 真为假,假为真。

2.4异或运算

cv2.bitwise_xor(x,y) 两个数不同时为1,否则为0

3掩膜也称掩码

 

b=np.zeros(a.shape,dtype=np.uint8)

b[100:250,100:250]=255

下面图片第二幅为掩码:

可以提取关键特征。

接下来图像以灰度图为例。

4.位平面分解 

一个灰度图像素范围[0,255],可以用八位二进制表示。 

 

图像中像素值的ai值说构成的位平面,成为第i个位平面。

八位灰度图被分为八个位平面:

        a0位平面与原图像关系最小,也称为”最低有效位“位平面,可用于水印,二值图像隐藏。

        a7位平面与原图像关系最大,也称为“最高有效位”位平面。 

4.1提取位平面 

将像素值与一个2**n的数进行与运算。可以使第n位不动,其他为0,就可以得到位平面了。

4.2阈值处理

mask[:,:,i]>0

RD[mask]=255

其中如果mask中有值大于零,则变为255.

示例:位平面

import cv2
import numpy as np

image = cv2.imread("C:\\Users\\kinghge\\Desktop\\pylearn\\opencvlearn\\images\\taylor3.png",0)
cv2.imshow('image', image)

r, c = image.shape

x = np.zeros((r, c, 8), dtype=np.uint8)

for i in range(8):
    x[:, :, i] = 2 ** i

h = np.zeros((r, c, 8), dtype=np.uint8)

for i in range(8):
    h[:, :, i] = cv2.bitwise_and(image, x[:, :, i])
    mask = h[:, :, i] > 0
    h[mask] = 255
    cv2.imshow(str(i), h[:, :, i])

cv2.waitKey()
cv2.destroyAllWindows()

5.图像加密

异或运算:

xor(a,b)=c
xor(b,c)=a
xor(a,c)=b

a为明文,b为密钥,c为密文。

加密过程为

bitwise_xor(a,b)

解密过程为

bitwise_xor(c,b)

示例:

import cv2
import numpy as np

image = cv2.imread("C:\\Users\\kinghge\\Desktop\\pylearn\\opencvlearn\\images\\taylor3.png",0)

r,c=image.shape

key = np.random.randint(0,256,size=[r,c],dtype=np.uint8)
encryption = cv2.bitwise_xor(image,key)
decryption=cv2.bitwise_xor(encryption,key)

cv2.imshow("image",image)
cv2.imshow("key",key)
cv2.imshow("encryption",encryption)
cv2.imshow("decryption",decryption)

cv2.waitKey()
cv2.destroyAllWindows()

6数字水印

用最低有效位位平面来做,因为最低有效位位平面跟原图像关系最小。

嵌入过程为:水印来替代最低有效位位平面,用数值为254的矩阵与原图像与运算,在与水印或运算。

提取过程:提取最低有效位位平面就得到水印了,用数值为1的矩阵与原图像与运算。 

示例:

import cv2
import numpy as np

image = cv2.imread("C:\\Users\\kinghge\\Desktop\\pylearn\\opencvlearn\\images\\taylor3.png", 0)

r, c = image.shape

watermark = np.zeros((r, c), dtype=np.uint8)
watermark[50:100, 50:100] = 255
#  将水印的信息换成1好嵌入
w = watermark[:, :] > 0
watermark[w] = 1

#  嵌入
t254 = np.ones((r, c), dtype=np.uint8) * 254

imageH7 = cv2.bitwise_and(image, t254)

e = cv2.bitwise_or(imageH7, 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("image", image)
cv2.imshow("watermark", watermark)
cv2.imshow("e", e)
cv2.imshow("wm", wm)

cv2.waitKey()
cv2.destroyAllWindows()

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值