接上篇:《Opencv》基础操作详解(1)-CSDN博客
目录
Opencv基础操作
11、B、G、R颜色通道提取
12、显示单个通道颜色
13、 合并颜色通道
14、图像添加马赛克
15、图片区域替换
16、图片的缩放(常用)
17、图像运算
(1)、+运算
(2)、add运算
(3)、图像加权运算
Opencv基础操作
11、B、G、R颜色通道提取
注意:我们这里是显示单个通道的图像,但是所显示的图片确实灰色的,那是因为只显示单个通道时, 实际上是将单个通道作为亮度值,而将其他通道设置为默认的最大值,也就是255。这会导致图像呈现为灰色。 想要展示只包含单个通道信息的彩色图像,可以将图像中的其他通道设为0。
import cv2
# 1. 读取图像
a = cv2.imread(r'./images/img.png')
# 2. 提取颜色通道
a1 = a[:, :, 0] # 蓝色通道(B通道)
a2 = a[:, :, 1] # 绿色通道(G通道)
a3 = a[:, :, 2] # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道
# g 包含绿色通道
# r 包含红色通道
cv2.imshow('result', a2)
# 4. 设置窗口显示时间,单位为毫秒(这里设置为100秒,可以根据需要调整)
cv2.waitKey(0)
# 5. 关闭所有窗口
cv2.destroyAllWindows()
12、显示单个通道颜色
import cv2
a = cv2.imread(r'./images/img.png')
# 复制原始图像以避免更改原始图像
a_new = a.copy()
a_new[:, :, 1] = 0 # 绿色通道设为0
a_new[:, :, 2] = 0 # 红色通道设为0
# 创建一个窗口来显示修改后的图像,并将其命名为'result'
cv2.imshow('result', a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果只将一个通道设为0,保留其他两个保留会有不同效果哦。自己尝试一下把!!
13、 合并颜色通道
import cv2
# 1. 读取图像
a = cv2.imread(r'./images/img.png')
# 2. 提取颜色通道
a1 = a[:, :, 0] # 蓝色通道(B通道)
a2 = a[:, :, 1] # 绿色通道(G通道)
a3 = a[:, :, 2] # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道 g 包含绿色通道 r 包含红色通道
# 使用cv2.merge()函数将三个通道重新合并成一个图像
img = cv2.merge((b, g, r))
# img = cv2.merge((a1,a2,a3)) 或者使用这行代码
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
注意:需要将三个通道放在一个小括号中在传入cv2.merge(),且要保证三个通道数组的形状大小相同。
14、图像添加马赛克
原理:选中图片的一部分将区域,将数组中的数值随机打乱达到马赛克效果
import numpy as np
img = cv2.imread('./images/img.png')
img[100:200,100:200] = np.random.randint(0,256,(100,100,3)) # 0,256 代表取值范围,左闭右开。()内代表数组大小
cv2.imshow('',img)
cv2.waitKey(0)
15、图片区域替换
选中两张图片中大小相同的区域,将其中一个区域的数组赋值给另外一个图片相同的区域,就达到了图片区域替换的效果。
img1 = cv2.imread('./images/img.png')
img2 = cv2.imread('./images/img_1.png')
# 两边数组的大小必须相同
img1[100:200,100:200] = img2[100:200,100:200]
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.waitKey(0)
16、图片的缩放(常用)
图片缩放cv2.resize(src,dsize,fx,fy) 用于调整图像的大小。它有以下几个参数:
src:要调整大小的输入图像,可以是numpy数组、PIL图像或其他类型。
dsize:输出图像的大小,可以是一个元组,例如(宽,高),或者使用整数标量来缩放原始图像。如果dsize为None,则根据scalefx和scalefy缩放原始图像。
fx:沿x轴的缩放系数。
fy:沿y轴的缩放系数。
img3 = cv2.imread('./images/cat.jpg')
# 方法一
img4 = cv2.resize(img3,(400,400))
# 方法二,fx,fy代表x轴和y轴的缩放比例
img5 = cv2.resize(img3,dsize=None,fx=1.5,fy=2)
# 原图
cv2.imshow('yutu',img3)
# dsize方法缩放的图
cv2.imshow('dsize',img4)
# fx、fy方法缩放的图
cv2.imshow('exif',img5)
cv2.waitKey(0)
cv2.destroyAllWindows()
17、图像运算
(1)、+运算
对于+号运算,当对图像a,图像b进行加法求和时,遵循以下规则:
- 当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和
- 当某位置像素相加得到的数值大于255时,该位置数值将截断结果并将其减去 256 例如:相加后是260,实际是260-256= 4
img1 = cv2.imread('./images/img.png')
img2 = cv2.imread('./images/cat.jpg')
# +运算,超过255会减去256
img_jia = img1 + 50
cv2.imshow('yuantu',img1)
cv2.imshow('jia',img_jia)
cv2.waitKey(0)
不仅可以直接加数值还可以两个大小相同的区域相加
img1 = cv2.imread('./images/img.png')
img2 = cv2.imread('./images/cat.jpg')
# 区域加法
img_jia2 = img1[0:200,0:200]+img2[0:200,0:200]
cv2.imshow('jia2',img_jia2)
cv2.waitKey(0)
(2)、add运算
对于cv2.add()运算,当对图像a,图像b进行加法求和时,遵循以下规则:
- 当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和
- 当某位置像素相加得到的数值大于255时,该位置数值为255
img1 = cv2.imread('./images/img.png')
img2 = cv2.imread('./images/cat.jpg')
# 两图相加add,超过255的会以255作为数值
img1 = cv2.resize(img1,(400,400))
img2 = cv2.resize(img2,(400,400))
img_add = cv2.add(img1,img2)
cv2.imshow('add',img_add)
cv2.waitKey(0)
(3)、图像加权运算
cv2.addWeighted(src1, α, src2, β, γ)
就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为dst=src1×α+src2×β+γ
src1、src2:输入的图像
α、β:权重
γ:图像的亮度值(常数),将添加到加权和上
注意:在执行add操作时要保证输入的两张图大小相同
img1 = cv2.imread('./images/img.png')
img2 = cv2.imread('./images/cat.jpg')
img1 = cv2.resize(img1,(400,400))
img2 = cv2.resize(img2,(400,400))
img_add_weight = cv2.addWeighted(img1,0.8,img2,0.2,0)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('weight',img_add_weight)
cv2.waitKey(0)
cv2.destroyAllWindows()