图像处理——基于opencv和python(五)

1 色彩空间转换

在数字图像中,最常见的彩色模型是RGB模型(红、绿、蓝,在OpenCV中彩色图像组织 的顺序是B-G-R,仍然是RGB模型。

这种模型是硬件处理的常用模型,比如采集图像的 CCD传感器、显示图像的显示器等等。

符合描述人类眼睛观察的则是HSV(色度、饱和度、亮度)模型。

OpenCV中有374种颜色空间转换方法。我们只研究两种最广泛使用的转换方法, BGR↔Gray和BGR↔HSV。

import cv2
flags=[i for i in dir(cv2) if i.startswith('COLOR_')]
len(flags)

586e6a8180f94961bf3770da92e583da.png

1.1 转换GRAY色彩空间

GRAY色彩空间:GRAY(灰度图像)通常指8位灰度图,其具有256个灰度级,像素值的 范围是[0,255]。

当图像由RGB色彩空间转换为GRAY色彩空间时,其处理方式如下: Gray=0.299R+0.587G+0.114*B

对于颜色转换,使用函数cv.cvtColor(input_image,flag),其中flag确定转换类型。

对于BGR→Gray转换,我们使用标志cv.COLOR_BGR2GRAY。 类似地,对于BGR→HSV,我们使用标志cv.COLOR_BGR2HSV。

import cv2
img_src = cv2.imread("./images/lena.jpg")
img_gray = cv2.cvtColor(img_src,cv2.COLOR_BGR2GRAY) #彩色转灰度
print(img_gray.shape) #单通道
img_color = cv2.cvtColor(img_gray,cv2.COLOR_GRAY2BGR) #灰度转彩色
print(img_color.shape) #3通道
cv2.imshow('img_src',img_src)
cv2.imshow('img_color',img_color)
cv2.imshow('img_gray',img_gray)
cv2.waitKey()
cv2.destroyAllWindows() 

0422b097fad0460680c92c65da4b66ff.png

在彩色图像转换到灰度图像后,再用该灰度图转换回彩色图像只是名义上多通道的彩色图像,人眼看到的却不是“彩 色”了。 applyColorMap(),它可以将灰度图像转换成彩色图像,转换的模式达22种之多。

import cv2
img_gray = cv2.imread("./images/lena.jpg",0)
for i in range(22):
 dst = cv2.applyColorMap(img_gray,i)
 cv2.imshow('map',dst)
 cv2.waitKey(500)
 # cv2.imwrite("map-"+str(i)+".jpg",dst) 
cv2.destroyAllWindows() 

1.2 转换到HSV空间

HSV色彩空间 RGB是从硬件的角度提出的颜色模型,在与人眼匹配的过程中可能存在一定的差异,

HSV色彩空间是一种面向视觉感知的颜色模型 指出人眼的色彩知觉主要包含三要素:色调(Hue,也称为色相)、饱和度 (Saturation)、亮度(Value)。

注意 HSV的色相范围为[0,179],饱和度范围为[0,255],值范围为 [0,255]。

不同的软件使用不同 的规模。因此,如果你要将OpenCV值 和它们比较,你需要将这些范围标准化。

色调指光的颜色,饱和度是指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。

import warnings
warnings.filterwarnings("ignore")
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (8,8)
plt.rc('font', size=14)
plt.rc('axes', labelsize=14, titlesize=14)
plt.rc('legend', fontsize=14)
plt.rc('xtick', labelsize=10)
plt.rc('ytick', labelsize=10) 
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def plot_multiple_imgs(titles,images,hspace=0.1):
    import math
    for i in range(len(titles)):
        plt.subplot(2, math.ceil(len(titles)/2), i + 1), plt.imshow(cv2.cvtColor
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
    plt.subplots_adjust(wspace =0.1, hspace =hspace)#调整子图间距
    plt.show()
import cv2
import matplotlib.pyplot as plt

# 定义plot_multiple_imgs函数
def plot_multiple_imgs(images, titles):
    fig, axes = plt.subplots(1, len(images), figsize=(15, 5))
    for i, ax in enumerate(axes):
        ax.imshow(images[i])
        ax.set_title(titles[i])
        ax.axis('off')
    plt.show()

# 读取图像
img = cv2.imread("./images/lena.jpg")

# 将图像从BGR颜色空间转换为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 显示图像
plot_multiple_imgs([img, img[:,:,::-1], hsv], ['RGB', 'img', 'HSV'])

755c4a37be9943ae9780c9155d3f1bd6.png

1.3 HSV空间-物体跟踪

通过cv2.inRange()可以将图像内指定范围的值标注出来,在返回到mask中。

如果图像的值位于该区间,则mask对应位置上的值为255,反之为0。 通过掩摸按位与运算将指定颜色取出来。

bitwise_and有了第3个参数mask,利用掩摸(mask)进行“与”操作 即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔 除。

图片下载地址:点击

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 定义plot_multiple_imgs函数
def plot_multiple_imgs(images, titles):
    fig, axes = plt.subplots(1, len(images), figsize=(15, 5))
    for i, ax in enumerate(axes):
        ax.imshow(images[i])
        ax.set_title(titles[i])
        ax.axis('off')
    plt.subplots_adjust(hspace=0.5)  # 调整子图之间的垂直间距
    plt.show()

img = cv2.imread("./images/qiu.jpg")

# 定蓝色的阈值
lower_1 = np.array([102, 100, 100])
upper_1 = np.array([122, 255, 255])

#黄色-乒乓球
lower = np.array([15, 100, 100])
upper = np.array([30, 255, 255])

# 换到 HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 根据阈值构建掩模
mask = cv2.inRange(hsv, lower_1, upper_1)

# 对原图像和掩模位运算
res = cv2.bitwise_and(img, img, mask=mask)

# 显示图像
plot_multiple_imgs([img, hsv, mask, res], ['Original', 'HSV', 'Mask', 'Result'])

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值