4.3 类型转换实例

【例 4.5】将图像从 BGR 模式转换为 RGB 模式。

import cv2
import numpy as np

lena = cv2.imread("/Users/zhaofeier/Desktop/lenacolor.png")
rgb = cv2.cvtColor(lena,cv2.COLOR_BGR2RGB)
cv2.imshow("lena",lena)
cv2.imshow("rgb",rgb)

cv2.waitKey()
cv2.destroyAllWindows()

1.获取制定颜色

【例 4.6】在 OpenCV 中,测试 RGB 色彩空间中不同颜色的值转换到 HSV 色彩空间后的对 应值。

首先,使用 np.zeros([1,1,3],dtype=np.uint8)来生成一幅仅有一个像素点的图像(数组)。 接下来,通过对其中的通道分量赋值,将其设定为指定的颜色。例如:

  • 语句 imgBlue[0,0,0]=255 可以将该像素点的第 0 个通道(即 B 通道)的值设置为 255, 即将该点的颜色指定为蓝色。
  • 语句 imgGreen[0,0,1]=255 可以将该像素点的第 1 个通道(即 G 通道)的值设置为 255, 即将该点的颜色指定为绿色。
  • 语句 imgRed[0,0,2]=255 可以将该像素点的第 2 个通道(即 R 通道)的值设置为 255, 即将该点的颜色指定为红色。
    然后,可以通过语句 cv2.cvtColor(Blue,cv2.COLOR_BGR2HSV)将 Blue 从 BGR 色彩空间 转换到 HSV 色彩空间。
    最后,通过打印 HSV 色彩空间内的像素值,观察转换情况。
    在本例中,对蓝色、绿色、红色三种不同的颜色分别进行转换,将它们从 BGR 色彩空间 转换到 HSV 色彩空间,并观察转换后所得到的 HSV 空间的对应值。
imgBlue = np.zeros([1,1,3],dtype=np.uint8)
imgBlue[0,0,0] = 255
Blue = imgBlue
BlueHSV = cv2.cvtColor(Blue,cv2.COLOR_BGR2HSV)
print("Blue=\n",Blue)
print("BlueHSV=\n",BlueHSV)

2. 标记制定颜色

在 HSV 色彩空间中,H 通道(饱和度 Hue 通道)对应不同的颜色。或者换个角度理解, 颜色的差异主要体现在 H 通道值的不同上。所以,通过对 H 通道值进行筛选,便能够筛选出 特定的颜色。例如,在一幅 HSV 图像中,如果通过控制仅仅将 H 通道内值为 240(在 OpenCV内被调整为 120)的像素显示出来,那么图像中就会仅仅显示蓝色部分。

2.1 通过inRange函数锁定特定值

OpenCV 中通过函数 cv2.inRange()来判断图像内像素点的像素值是否在指定的范围内,其 语法格式为:
dst = cv2.inRange( src, lowerb, upperb )
式中:

  • dst 表示输出结果,大小和 src 一致。  src 表示要检查的数组或图像。
  • lowerb 表示范围下界。
  • upperb 表示范围上界。
    返回值 dst 与 src 等大小,其值取决于 src 中对应位置上的值是否处于区间[lowerb,upperb] 内:
  • 如果 src 值处于该指定区间内,则 dst 中对应位置上的值为 255。
  • 如果 src 值不处于该指定区间内,则 dst 中对应位置上的值为 0。

【例 4.7】使用函数 cv2.inRange()将某个图像内的在[100,200]内的值标注出来。

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)

2.2 通过基于掩码的按位与显示ROI

【例 4.8】正常显示某个图像内的感兴趣区域(ROI),而将其余区域显示为黑色

img=np.ones([5,5],dtype=np.uint8)*9
mask =np.zeros([5,5],dtype=np.uint8)
mask[0:3,0]=1
mask[2:5,2:4]=1
roi=cv2.bitwise_and(img,img, mask= mask)
print("img=\n",img)
print("mask=\n",mask)
print("roi=\n",roi)

2.3 显示特定颜色值

【例 4.9】分别提取 OpenCV 的 logo 图像内的红色、绿色、蓝色。\

opencv = cv2.imread("/Users/zhaofeier/Desktop/源代码及图像/chapter4/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])
#hs 确定蓝色区域
mask = cv2.inRange(hsv,minBlue,maxBlue)
#hs 通过掩码控制的按位与运算,锁定蓝色区域
blue = cv2.bitwise_and(opencv,opencv,mask=mask)
cv2.imshow("blue",blue)

cv2.waitKey()
cv2.destroyAllWindows()

3. 标记肤色

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

  • 色调值在[5, 170]之间
  • 饱和度值在[25, 166]之间

【例 4.10】提取一幅图像内的肤色部分。

img = cv2.imread("/Users/zhaofeier/Desktop/源代码及图像/chapter4/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()

4. 实现艺术效果

【例 4.11】调整 HSV 色彩空间内 V 通道的值,观察其处理结果。

img = cv2.imread("/Users/zhaofeier/Desktop/源代码及图像/chapter4/barbara.bmp")
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv)
v[:,:] = 255
newHSV = cv2.merge([h,s,v])
art = cv2.cvtColor(newHSV,cv2.COLOR_HSV2BGR)
cv2.imshow("img",img)
cv2.imshow("art",art)
cv2.waitKey()
cv2.destroyAllWindows()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮棂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值