OpenCV学习笔记(二)——图像运算及色彩空间类型转换

一. 图像运算

1.1 图像加法运算
1.1.1+

使用加号运算符“+”对图像a(像素值为a)和图像b(像素值为b)进行求和运算时,遵循以下规则:
在这里插入图片描述
式中,mod()是取模运算,“mod(a+b, 256)”表示计算“a+b 的和除以256 取余数”。

1.1.2.计算结果=cv2.add(像素值a,像素值b)

使用函数cv2.add()对像素值a 和像素值b 进行求和运算时,会得到像素值对应图像的饱和值(最大值)。
在这里插入图片描述
需要注意,函数cv2.add()中的参数可能有如下三种形式。

  • 形式 1:计算结果=cv2.add(图像1,图像2),两个参数都是图像,此时参与运算的图像大小和类型必须保持一致。
  • 形式 2:计算结果=cv2.add(数值,图像),第1 个参数是数值,第2 个参数是图像,此时将超过图像饱和值的数值处理为饱和值(最大值)。
  • 形式 3:计算结果=cv2.add(图像,数值),第1 个参数是图像,第2 个参数是数值,此时将超过图像饱和值的数值处理为饱和值(最大值)。
1.2 图像加权和

dst=cv2.addWeighted(src1, alpha, src2, beta, gamma)

  • 该函数实现的功能是dst = src1×alpha + src2×beta + gamma。可以将上式理解为“结果图像=图像1×系数1+图像 2×系数2+亮度调节量”。
  • 参数alpha 和beta 是src1 和src2 所对应的系数,它们的和可以等于1,也可以不等于1。
#例:使用函数cv2.addWeighted()将一幅图像的ROI 混合在另外一幅图像内
import cv2
lena=cv2.imread("lena512.bmp",cv2.IMREAD_UNCHANGED)
dollar=cv2.imread("dollar.bmp",cv2.IMREAD_UNCHANGED)
cv2.imshow("lena",lena)
cv2.imshow("dollar",dollar)
face1=lena[220:400,250:350]
face2=dollar[160:340,200:300]
add=cv2.addWeighted(face1,0.6,face2,0.4,0)
dollar[160:340,200:300]=add
cv2.imshow("result",dollar)
cv2.waitKey()
cv2.destroyAllWindows()

在本例中,face1 是图像lena 中的面部部分,face2 是图像dollar 中的面部部分。通过函数cv2.addWeighted()将lena 图像内的面部face1 与dollar 图像内的面部face2 进行了混合计算。
在这里插入图片描述

1.3 按位逻辑运算

在这里插入图片描述

1.4 掩膜

OpenCV中的很多函数都会指定一个掩模,也被称为掩码,例如:计算结果=cv2.add(参数1 , 参数2 , 掩模)。当使用掩模参数时,操作只会在掩模值为非空的像素点上执行,并将其他像素点的值置为0(按位逻辑运算中四个函数都可选掩膜这一参数)。

1.5 数字水印

按位逻辑运算的应用。

二. 色彩空间类型转换

2.1 色彩空间基础

比较常见的色彩空间包括GRAY 色彩空间、XYZ 色彩空间、YCrCb 色彩空间、HSV 色彩空间、HLS 色彩空间、CIELab色彩空间、CIELuv色彩空间、Bayer 色彩空间等,点击此处查看每种色彩空间的详细含义。

2.2 类型转换函数

dst = cv2.cvtColor( src, code [, dstCn] )

  • dst 表示输出图像,与原始输入图像具有同样的数据类型和深度。
  • src 表示原始输入图像。可以是8 位无符号图像、16 位无符号图像,或者单精度浮点数等。
  • code 是色彩空间转换码,常用转换吗如下表所示。
  • dstCn 是目标图像的通道数。如果参数为默认的0,则通道数自动通过原始输入图像和code 得到。

在这里插入图片描述

2.3 HSV色彩空间讨论
2.3.1 HSV基础知识

链接

2.3.2 标记指定颜色

dst = cv2.inRange( src, lowerb, upperb )

  • dst 表示输出结果,大小和src 一致。
  • src 表示要检查的数组或图像。
  • lowerb 表示范围下界。
  • upperb 表示范围上界。

返回值dst与src等大小,其值取决于src中对应位置上的值是否处于区间[lowerb,upperb]内:

  • 如果src值处于该指定区间内,则dst中对应位置上的值为255。
  • 如果src值不处于该指定区间内,则dst中对应位置上的值为0。
#例:使用函数cv2.inRange()将某个图像内的在[100,200]内的值标注出来
import cv2
import numpy as np
img=np.random.randint(0,256,size=[5,5],dtype=np.uint8)
min=100
max=200
mask = cv2.inRange(img, min, max)
print("img=\n",img)
print("mask=\n",mask)

运行程序,会显示如下所示的运行结果。
img=
[[129 155 99 51 182]
[ 57 130 235 135 110]
[232 182 194 13 26]
[111 7 136 190 55]
[ 35 144 9 255 187]]
mask=
[[255 255 0 0 255]
[ 0 255 0 255 255]
[ 0 255 255 0 0]
[255 0 255 255 0]
[ 0 255 0 0 255]]
2.3.3 显示特定颜色值

分别提取OpenCV 的logo 图像内的红色、绿色、蓝色。

需要注意,在实际提取颜色时,往往不是提取一个特定的值,而是提取一个颜色区间。例如,在OpenCV 中的HSV 模式内,蓝色在H 通道内的值是120。在提取蓝色时,通常将“蓝色值120”附近的一个区间的值作为提取范围。该区间的半径通常为10 左右,例如通常提取[120−10,120+10]范围内的值来指定蓝色。相比之下,HSV 模式中S 通道、V 通道的值的取值范围一般是[100,255],这主要是因为,当饱和度和亮度太低时,计算出来的色调可能就不可靠了。

根据上述分析,各种颜色的HSV 区间值分布在[H−10,100,100]和[H+10,255,255]之间。因此,各种颜色值的范围为:

  • 蓝色:值分布在[110,100,100]和[130,255,255]之间。
  • 绿色:值分布在[50,100,100]和[70,255,255]之间。
  • 红色:值分布在[0,100,100]和[10,255,255]之间。

根据前述例题的相关介绍,首先利用函数cv2.inRange()查找指定颜色区域,然后利用基于掩码的按位与运算将指定颜色提取出来。

import cv2
import numpy as np
opencv=cv2.imread("opencv.jpg")
hsv = cv2.cvtColor(opencv, cv2.COLOR_BGR2HSV)
cv2.imshow('opencv',opencv)
#=============指定蓝色值的范围=============
minBlue = np.array([110,50,50])
maxBlue = np.array([130,255,255])
#确定蓝色区域
mask = cv2.inRange(hsv, minBlue, maxBlue)
#通过掩码控制的按位与运算,锁定蓝色区域
blue = cv2.bitwise_and(opencv,opencv, mask= mask)
cv2.imshow('blue',blue)
#=============指定绿色值的范围=============
minGreen = np.array([50,50,50])
maxGreen = np.array([70,255,255])
#确定绿色区域
mask = cv2.inRange(hsv, minGreen, maxGreen)
#通过掩码控制的按位与运算,锁定绿色区域
green = cv2.bitwise_and(opencv,opencv, mask= mask)
cv2.imshow('green',green)
#=============指定红色值的范围=============
minRed = np.array([0,50,50])
maxRed = np.array([30,255,255])
#确定红色区域
mask = cv2.inRange(hsv, minRed, maxRed)
#通过掩码控制的按位与运算,锁定红色区域
red= cv2.bitwise_and(opencv,opencv, mask= mask)
cv2.imshow('red',red)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

2.3.4 显示肤色

在标记特定颜色的基础上,可以将标注范围进一步推广到特定的对象上。例如,通过分析可以估算出肤色在HSV色彩空间内的范围值。在HSV空间内筛选出肤色范围内的值,即可将图像内包含肤色的部分提取出来。

这里将肤色范围划定为:

  • 色调值在[5, 170]之间
  • 饱和度值在[25, 166]之间
import cv2
img=cv2.imread("lesson2.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h,s,v=cv2.split(hsv)
minHue=5
maxHue=170
hueMask=cv2.inRange(h, minHue, maxHue)
minSat=25
maxSat=166
satMask = cv2.inRange(s, minSat, maxSat)
mask = hueMask & satMask
roi = cv2.bitwise_and(img,img, mask= mask)
cv2.imshow("img",img)
cv2.imshow("ROI",roi)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

2.4 alpha 通道

在 RGB 色彩空间三个通道的基础上,还可以加上一个A 通道,也叫alpha 通道,表示透明度。这种4 个通道的色彩空间被称为RGBA 色彩空间,PNG 图像是一种典型的4 通道图像。alpha 通道的赋值范围是[0, 1],或者[0, 255],表示从透明到不透明。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值