利用OpenCV的函数cvtcolor()进行颜色空间转换时需要注意的地方

OpenCV的函数cvtcolor()的原型如下:
C++原型:

void cv::cvtColor(InputArray src,OutputArray dst,int code,int dstCn = 0)

Python原型如下:

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

参数src代表输入图像,图像深度可以为8位无符号,16位无符号,单精度浮点型。
参数dst代表输出图像,它与输入图像有相同的尺寸和深度。
参数code代表作何种转换,即转换码,可以作哪些转换大家直接去下面这个页面查看吧,博主粗略数了下,大约有200种转换,所以这里就不列举了。
https://docs.opencv.org/4.1.2/d8/d01/group__imgproc__color__conversions.html#ga4e0972be5de079fed4e3a10e24ef5ef0
参数dstCn代表输出图像的通道数,如果使用默认值0,则输出图像的通道数由输入图像和转换码共同决定。

接下来,说回标题,即“利用OpenCV的函数cvtcolor()进行颜色空间转换时需要注意的地方”,那需要注意什么呢?在线性变换的情况下,输入图像每一个像素点的取值范围无关紧要。但是在非线性变换的情况下,输入的图像应该被归一化到适当的值范围以获得正确的结果,例如,对于 RGB→LUV 变换最好在变换前进行归一化处理,避免出现由于范围值不当引起的问题。

相关代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
# 图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601
# OpenCV的版本为4.1

import cv2 as cv
import sys
import numpy as np


if __name__ == '__main__':
    # 读取图像并判断是否读取成功
    img = cv.imread('../images/BaoXiaofeng.jpg')
    if img is None:
        print('Failed to read BaoXiaofeng.jpg.')
        sys.exit()
    else:
        # 将图像进行颜色空间转换
        # 颜色空间转换前先进行范围归一化处理,避免后续运算出现莫名其妙的问题
        image = img.astype('float32')
        image *= 1.0 / 255
        # 使用cvtColor()函数进行颜色空间转换
        HSV = cv.cvtColor(image, cv.COLOR_BGR2HSV)
        YUV = cv.cvtColor(image, cv.COLOR_BGR2YUV)
        Lab = cv.cvtColor(image, cv.COLOR_BGR2Lab)
        GRAY = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        

如果需要C++代码,可参看我之前的博文:
利用cvtColor实现图像颜色空间的转换-比如RGB转灰度图等
注意上面链接的博文提供的C++代码在颜色空间转换前是没有进行归一化处理的。

接下来说上面的Python代码中用于数据类型转换的astype()函数。这个函数是Python的numpy库中的,用于对阵列的数据类型进行转换。比如在上面的代码中,实现了从uint8到float32的转换。如下图所示:
在这里插入图片描述
其原型如下:

dst = ndarray.astype(dtype[, order='K'[, casting='unsafe'[, subok=True[, copy=True]]]])

先说下其名称中的字母“as”是怎么来的。这个函数的作用的英文表述为“Copy of the array, cast to a specified type.”取其中的单词array和specified的首字母,就有了“as”。当然,也可理解为取单词“cast”的中间两个字母“as”而来,博主认为后者的可能性要大些。

下面说其参数意义:
dtype—转换后阵列的数据类型。

order—数据在内存中的存储顺序。可取值有‘C’, ‘F’, ‘A’, ‘K’。具体各取值的详细意义,请大家参考我的另一篇博文,链接 https://www.hhai.cc/thread-154-1-1.html

casting—表示什么样的数据转换被允许。可取值有‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’。‘no’表示不允许数据转换;‘equiv’表示只允许按字节顺序更改;‘safe’表示只允许可以保留值的强制转换;‘same_kind’表示只允许安全的转换或同一类型之间的转换(比如float64 to float32);‘unsafe’表求任何类型的转换都被允许。默认值是‘unsafe’,之所以默认值定为‘unsafe’,一个重要原因是为了程序能向后兼容。

subok—表示子类是否也被转换。如果值为True,那么子类也被转换,如果值为False,那么子类不被转换。有点像Linux系统修改文件夹权限属性时是否也应用到子文件和子文件夹中。

copy—表示返回阵列是新分配的内存空间还是就用输入阵列的内存空间。如果是True,则新分配内存空间。如果是False,则用输入阵列的内存空间。

上面就是各个参数的意义,一般情况下,除了dtype参数按自己的需求设定外,其余参数采用默认值即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值