a.OpenCV中的很多函数都会指定一个掩模,也被称为掩码,例如:计算结果=cv2.add(参数1,参数2,掩模)当使用掩模参数时,操作只会在掩模值为非空的像素点上执行,并将其他像素点的值置为0。
演示掩码的使用
import cv2
import numpy as np
img1 = np.ones((4, 4), dtype=np.uint8) * 3
img2 = np.ones((4, 4), dtype=np.uint8) * 5
mask = np.zeros((4, 4), dtype=np.uint8)
mask[2:4, 2:4] = 1
img3 = np.ones((4, 4), dtype=np.uint8) * 66
print("img1=\n", img1)
print("img2=\n", img2)
print("mask=\n", mask)
print("初始值img3=\n", img3)
img3 = cv2.add(img1, img2, mask=mask)
print("求和后img3=\n", img3)
添加图片注释,不超过 140 字(可选)
b.构造一个掩模图像,将该掩模图像作为按位与函数的掩模参数,实现保留图像的指定部分。
import cv2
import numpy as np
a = cv2.imread("th.jfif", 1) # 读入一副彩色图片,忽略alpha通道,可用1作为实参替代
# 「Alpha 通道」储存一个值,其外在表现是「透明度」,Alpha 和透明度没啥关系
w, h, c = a.shape
mask = np.zeros((w, h), dtype=np.uint8)
mask[100:400, 200:400] = 255
mask[100:500, 100:200] = 255
c = cv2.bitwise_and(a, a, mask)
print("a.shape=", a.shape)
print("mask.shape=", mask.shape)
cv2.imshow("a", a)
cv2.imshow("mask", mask)
cv2.imshow("c", c)
cv2.waitKey()
cv2.destroyAllWindows()
c.在加法运算和按位运算中,参与运算的两个算子(参数)既可以是两幅图像,也可以是一幅图像与一个数值。
import cv2
import numpy as np
img1 = np.ones((4, 4), dtype=np.uint8) * 3
img2 = np.ones((4, 4), dtype=np.uint8) * 5
img3 = cv2.add(img1, img2)
img4 = cv2.add(img1, 6)
imgs = cv2.add(6, img2)
print(img1)
print(img2)
print(img3)
print(img4)
print(imgs)
d.对字符串 str_1 和 str_2 进行相加,得到一个新的字符串;
将 str_1 乘以 2 ,得到一个新的字符串;
将 str_1 切片,得到该字符串索引 1 至 4 的数据,即索引 1,2,3的部分,得到新的字符串。
def add_repeat_slicing(str_1: str, str_2: str) -> tuple:
"""
:param str_1: The first source string
:param str_2: The Second source string
:return: tuple: A tuple containing three new strings
"""
# -- write your code here --
return str_1+str_2,str_1*2,str_1[1:4]
e.编写程序,观察灰度图像的各个位平面
import cv2
import numpy as np
lena = cv2.imread("th.jfif", 0)
cv2.imshow("lena", lena)
r, c = lena.shape # 获取图像的长宽
x = np.zeros((r, c, 8), dtype=np.uint8) # 其中八通道用来提取灰度图像的8个位平面,例如[:.:.0]用来提取灰度图像的8个位平面
for i in range(8):
x[:, :, i] = 2 ** i # 用来提取各个位平面的提取矩阵的值
r = np.zeros((r, c, 8), dtype=np.uint8)
for i in range(8):
r[:, :, i] = cv2.bitwise_and(lena, x[:, :, i])
mask = r[:, :, i] > 0
r[mask] = 255
cv2.imshow(str(i), r[:, :, i])
cv2.waitKey()
cv2.destroyAllWindows()
添加图片注释,不超过 140 字(可选)
将灰度图像中处于同一比特位上的二进制像素值进行组合,得到一幅二进制值图像,该图像被称为灰度图像的一个位平面,这个过程被称为位平面分解。
f.图像加密和解密
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
[例3.14]编写程序,通到图像按位异或实现加密和解密过程
在具体实现中,甲乙双方可以通过协商预先确定一幅密钥图像,并且双方各保存一份备用。在此基础上,甲乙双方就可以利用该密钥图像进行图像的加密和解密处理了。例如,甲通过密钥对原始图像加密后,原始图像变得杂乱无章,其他人无法解读图像内容。而乙可以通过预先保存的密钥图像,将加密图像解密,获取原始图像内容。
在加密过程中,可以选择一幅有意义的图像作为密钥,也可以选择一幅没有意义的图像作为密钥。在本例中,将随机生成一幅图像作为密钥。
import cv2
import numpy as np
lena = cv2.imread("th.jfif", 0)
cv2.imshow("lena", lena)
r, c = lena.shape # 获取图像的长宽
key = np.random.randint(0, 256, size=[r, c], dtype=np.uint8)
encryption = cv2.bitwise_xor(lena, key)
decryption = cv2.bitwise_xor(encryption, key)
cv2.imshow("lena", lena)
cv2.imshow("key", key)
cv2.imshow("encryption",encryption)
cv2.imshow("decryption",decryption)
cv2.waitKey()
cv2.destroyAllWindows()
g.最低有效位(Least Signifcant Bit,LSB)指的是一个二进制数中的第0位(即最低位)。
数字水印的原理
import cv2
import numpy as np
# 原始图像
lena = cv2.imread("th.jfif", 0)
# 水印图像
watermark = cv2.imread("th (1).jfif", 0)
# 将水印图像内的值255处理为1,方面嵌入
w = watermark[:, :] > 0
watermark[w] = 1
# 读取原始的图片数据值
r, c = lena.shape
# 嵌入过程
t254 = np.ones((r, c), dtype=np.uint8) * 254
# 获取图像的高7位
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()
h.实现splitlines函数功能:将一段文字按行边界符拆分为列表,参数src是一段包含 0 个或多个行边界符的字符串,在函数体中编写代码,在出现行边界符的位置拆分传入的src字符串, 最后返回按照行边界符拆分后的所有字符串中长度最大的字符串,如果出现多个结果,则返回第一个匹配字符串。
def splitlines(src: str) -> str:
"""
:param src: The source string needs to be processed
:return: The maximum length of the string
"""
# -- write your code here --
#return max(src.splitlines(), key=lambda i :len(i))
lits_1=src.splitlines()
a=lits_1[0]
lenmax=len(lits_1[0])
for i in lits_1:
if lenmax<len(i):
lenmax=len(i)
a=i
return a
i.统计字符 a 在字符串中出现的次数;
统计字符 going 在字符串 0 到 40 范围之间的次数。
return str_1.count("a"),str_1[:40].count("going")
k.给定一个字符串变量str_1,一个整型数字变量num_1,请你定义一个列表,包含这两个变量,并打印出来
list_1=[str_1,num_1]
print(list_1)
l.本题有一个列表 list_1。我们需要你在 solution.py 中完善代码来实现:
修改列表 list_1 中第三个元素为 1999;
给列表 list_1 添加一个元素 'jiuzhang';
删除列表 list_1 中的第一个元素。
list_1[2]=1999
list_1.append('jiuzhang')
list_1.pop(0)
m.将灰度图像转换为BGR图像
import cv2
import numpy as np
img = np.random.randint(0, 256, size=[2, 4, 3], dtype=np.uint8)
set = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print(set)
n.什么是元组(tuple)
定义与列表(list)一样,元组(tuple)也是序列,唯一的区别在于元组是不能修改的
)中获取一个整型数字变量num_1,一个字符串变量num_2,请你定义一个元组,包含这两个变量,并打印出来这个元组和它的类型。
tuple=(num_1,num_2)
print(tuple)
print(type(tuple))
元组可以具有任意数量的项,并且它们可以具有不同的类型(整数(int),浮点数(float),列表(list),字符串(string)等)。
添加图片注释,不超过 140 字(可选)
元组相比于列表的优势
由于元组与列表非常相似,因此它们在类似情况下也都使用。
但是,在列表上实现元组具有某些优点。下面列出了一些主要优点:
我们通常将元组用于异构(不同)数据类型,将列表用于同类(相似)数据类型。
由于元组是不可变的,因此遍历元组要比使用list更快。因此,性能略有提升。
包含不可变元素的元组可以用作字典的键。对于列表,这是不可能的。
如果您拥有不变的数据,则将其实现为元组可以确保其保持写保护。
输入一个长度为偶数的元组my_tuple,输出两个元组,一个是元组的前一半,一个是元组的后一半。
i=int(len(my_tuple)/2)
print(my_tuple[:i])
print(my_tuple[i:])
输入一个由整数组成的元组my_tuple和一个整数x,输出元组内x的个数。
count=0
for i in my_tuple:
if x==i:
count+=1
print(count)
o.将图像在BGR和RGB模式之间相互转换
import cv2
import numpy as np
img = np.random.randint(0, 256, size=[2, 4, 3], dtype=np.uint8)
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
BGR = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)
print(rgb)
print(BGR)
![](https://img-blog.csdnimg.cn/img_convert/31e050533dc832451f69ec15d1dbd96f.png)
编辑
添加图片注释,不超过 140 字(可选)
RGB是竖着算。
p.将图像在 BGR模式和灰度图像之间相互转换
import cv2
import numpy as np
lena = cv2.imshow("th.jfif", -1)
gray = cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY)
rgb = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
cv2.imshow("lena", lena)
cv2.imshow("gray", gray)
cv2.imshow("rgb", rgb)
cv2.waitKey()
cv2.destroyAllWindows()
q.
![](https://img-blog.csdnimg.cn/img_convert/25ba79547c66f82885d6a2f3523d4bb8.png)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
将图像从BGR模式转换为RGB模式
import cv2
import numpy as np
lena = cv2.imread("th.jfif")
rgb = cv2.cvtColor(lena, cv2.COLOR_BGR2RGB)
cv2.imshow("lena", lena)
cv2.imshow("rgb", rgb)
cv2.waitKey()
cv2.destroyAllWindows()