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

1.编写程序,演示图像通道拆分及通道值改变对彩色图像的影响。

# 编写程序,演示图像通道拆分及通道值改变对彩色图像的影响。
import cv2

lena = cv2.imread("20170701031428774.jpg")
cv2.imshow("lena", lena)
b = lena[:, :, 0]
g = lena[:, :, 1]
r = lena[:, :, 2]
cv2.imshow("b", b)
cv2.imshow("g", g)
cv2.imshow("r", r)
lena[:, :, 0] = 0
cv2.imshow("lenab", lena)
lena[:, :, 1] = 0
cv2.imshow("lenab0g0", lena)
cv2.waitKey()
cv2.destroyAllWindows()

.2.编写程序,使用函数cv2.split()拆分图像通道。

# 编写程序,使用函数cv2.split()拆分图像通道。
import cv2

lena = cv2.imread("20170701031428774.jpg")
b, g, r = cv2.split(lena)
cv2.imshow("b", b)
cv2.imshow("g", g)
cv2.imshow("r", r)
cv2.waitKey()
cv2.destroyAllWindows()

.3.编写程序,演示使用函数cv2.merge()合并通道。

# 编写程序,演示使用函数cv2.merge()合并通道。
import cv2

lena = cv2.imread("20170701031428774.jpg")
b, g, r = cv2.split(lena)
bgr = cv2.merge([b, g, r])
rgb = cv2.merge([r, g, b])
cv2.imshow("b", bgr)
cv2.imshow("g", rgb)
cv2.waitKey()
cv2.destroyAllWindows()

.4.shape:如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或者灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断一幅图像是灰度图像(或二值图像)还是彩色图像。● size:返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道数为1。

编写程序,观察图像的常用属性值

import cv2

color = cv2.imread("20170701031428774.jpg")
gray = cv2.imread("22986182_173540093000_2.jpg", 0)
print("图像gray属性")
print("gray.shape=\n", gray.shape)
print("gray.size=\n", gray.size)
print("gray.dtype=\n", gray.dtype)
print("图像color属性")
print("color.shape=\n", color.shape)
print("color.size=\n", color.size)
print("color.dtype=\n", color.dtype)

.5.● 如果两个图像对应像素值的和小于或等于255,则直接相加得到运算结果。例如,像素值28和像素值36相加,得到计算结果64。

● 如果两个图像对应像素值的和大于255,则将运算结果对256取模。例如255+58=313,大于255,则计算(255+58)% 256=57,得到计算结果57。

使用随机数数组模拟灰度图像,观察使用“+”对像素值求和的结果。分析:通过将数组的数值类型定义为dtype=np.uint8,可以保证数组值的范围在[0,255]之间。

import numpy as np

img1 = np.random.randint(low=0, high=256, size=[3, 3], dtype=np.uint8)
img2 = np.random.randint(low=0, high=256, size=[3, 3], dtype=np.uint8)
print("img1=\n", img1)
print("img2=\n", img2)
print("img1+img2=\n",img1+img2)

.6.使用函数cv2.add()对像素值a和像素值b进行求和运算时,会得到像素值对应图像的饱和值(最大值)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

函数cv2.add()中的参数可能有如下三种形式。

● 形式1:计算结果=cv2.add(图像1,图像2),两个参数都是图像,此时参与运算的图像大小和类型必须保持一致。

● 形式2:计算结果=cv2.add(数值,图像),第1个参数是数值,第2个参数是图像,此时将超过图像饱和值的数值处理为饱和值(最大值)。

● 形式3:计算结果=cv2.add(图像,数值),第1个参数是图像,第2个参数是数值,此时将超过图像饱和值的数值处理为饱和值(最大值)。

使用随机数数组模拟灰度图像,观察使用“+”对像素值求和的结果。分析:通过将数组的数值类型定义为dtype=np.uint8,可以保证数组值的范围在[0,255]之间

import numpy as np
import cv2

img1 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)
img2 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)
print("img1=\n", img1)
print("img2=\n", img2)
img3 = cv2.add(img2, img1)
print("相加结果是:\n", img3)
cv2.waitKey()
cv2.destroyAllWindows()

.7.分别使用加号运算符和函数cv2.add()计算两幅灰度图像的像素值之和,观察处理结果。

import cv2

a = cv2.imread("22986182_173540093000_2.jpg", 0)
b = a
result1 = a + b
result2 = cv2.add(a, b)
cv2.imshow("original", a)
cv2.imshow("result1", result1)
cv2.imshow("result2", result2)
cv2.waitKey()
cv2.destroyAllWindows()

● 使用加号运算符计算图像像素值的和时,将和大于255的值进行了取模处理,取模后大于255的这部分值变得更小了,导致本来应该更亮的像素点变得更暗了,相加所得的图像看起来并不自然。

● 使用函数cv2.add()计算图像像素值的和时,将和大于255的值处理为饱和值255。图像像素值相加后让图像的像素值增大了,图像整体变亮。

8.所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为:dst=saturate(src1×α+src2×β+γ)

saturate()表示取饱和值(最大值)。图像进行加权和计算时,要求src1和src2必须大小、类型相同,但是对具体是什么类型和通道没有特殊限制。它们可以是任意数据类型,也可以有任意数量的通道(灰度图像或者彩色图像),只要二者相同即可。

结果图像=图像1×系数1+图像2×系数2+亮度调节量

使用数组演示函数cv2.addWeighted()的使用。

import cv2
import numpy as np

img1 = np.ones(shape=(3, 3), dtype=np.uint8) * 100
img2 = np.ones(shape=(3, 3), dtype=np.uint8) * 10
gamma = 3
img3 = cv2.addWeighted(img1, 0.6, img2, 5, gamma=gamma)
print(img3)

9.使用函数cv2.addWeighted()对两幅图像进行加权混合,观察处理结果。

import cv2

a = cv2.imread("th.jfif")
b = cv2.imread("th (1).jfif")
result = cv2.addWeighted(a, 0.6, b, 0.4, 0)
cv2.imshow("a", a)
cv2.imshow("b", b)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

10.使用函数cv2.addWeighted()将一幅图像的ROI混合在另外一幅图像内。

import cv2

a = cv2.imread("th.jfif", cv2.IMREAD_UNCHANGED)
b = cv2.imread("th (1).jfif", cv2.IMREAD_UNCHANGED)
cv2.imshow("a", a)
cv2.imshow("b", b)
face1 = a[220:400, 250:350]
face2 = b[160:340, 200:300]
add = cv2.addWeighted(face1, 0.6, face2, 0.4, 0)
b[160:340, 200:300] = add
cv2.imshow("result", b)
cv2.waitKey()
cv2.destroyAllWindows()

11.按位逻辑运算

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

dst表示与输入值具有同样大小的array输出值。

● src1表示第一个array或scalar类型的输入值。

● src2表示第二个array或scalar类型的输入值。

● mask表示可选操作掩码,8位单通道array。

按位与操作有如下特点:

● 将任何数值N与数值0进行按位与操作,都会得到数值0。

● 将任何数值N(这里仅考虑8位值)与数值255(8位二进制数是11111111)进行按位与操作,都会得到数值N本身。

使用数组演示与掩模图像的按位与运算。

import cv2
import numpy as np

a = np.random.randint(0, 255, size=(5, 5), dtype=np.uint8)
b = np.zeros((5, 5), dtype=np.uint8)
b[0:3, 0:3] = 255
b[4, 4] = 255
c = cv2.bitwise_and(a, b)
print("a=\n", a)
print("b=\n", b)
print("c=\n", c)

编辑

添加图片注释,不超过 140 字(可选)

and 255的会显示原来的像素,0会显示0,相当于加了一个掩码。

12.构造一个掩模图像,使用按位与运算保留图像中被掩模指定的部分。

import cv2
import numpy as np

a = cv2.imread("th (1).jfif", 0)
b = np.zeros(shape=a.shape, dtype=np.uint8)
b[100:400, 200:400] = 255
b[100:500, 100:200] = 255
c = cv2.bitwise_and(a, b)
cv2.imshow("a", a)
cv2.imshow("b", b)
cv2.imshow("c", c)
cv2.waitKey()
cv2.destroyAllWindows()

13.构造一个掩模图像,使用按位与操作保留图像内被掩模所指定的部分。

import cv2
import numpy as np

a = cv2.imread("th (1).jfif", 1)
b = np.zeros(shape=a.shape, dtype=np.uint8)
b[100:400, 200:400] = 255
b[100:500, 100:200] = 255
c = cv2.bitwise_and(a, b)
print("a.shape=\n", a.shape)
print("b.shape=\n", b.shape)
cv2.imshow("a", a)
cv2.imshow("b", b)
cv2.imshow("c", c)
cv2.waitKey()
cv2.destroyAllWindows()

编辑切换为居中

添加图片注释,不超过 140 字(可选)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值