OpenCV轻松入门读书笔记(四)

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)

编辑

添加图片注释,不超过 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.

编辑切换为居中

添加图片注释,不超过 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()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值