cvtColor() 转换为 HSV 色彩空间后的 Numpy 8/16/32 位图像数据类型

2023-12-02

我正在使用以下方法将图像从 RGB 表示形式转换为 HSV 表示形式cv2.cvtColor。但是当转换结果图像时np.float32数据类型为np.uint16 and np.uint8通过重新缩放然后投射,使用时生成的图像cv2.imshow整数版本看起来有所不同。因此,我现在想知道我是否正确完成了转换,或者这实际上是由于转换过程中丢失了一些信息造成的?我试图了解发生了什么事,但无法弄清楚为什么。

import cv2
import numpy as np

im = cv2.imread(r'C:\Users\310293649\Desktop\photo.png')
print(im.dtype)
print(im)
cv2.namedWindow('im', cv2.WINDOW_NORMAL)
cv2.imshow('im',im)

#Conversion from 8uint to float32 before cvtColor()
im = im.astype(np.float32)          #Cast Image data type        
im *= 1./255                         #Scale value to float32 range 0-1
print(im.dtype)                     #Print to check data type
print(im)                           #Print pixel value
#Colour Space Conversion to HSV
im = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
cv2.namedWindow('im1', cv2.WINDOW_NORMAL)
cv2.imshow('im1',im)

#Conversion from float32 to uint16
im *= 65535                         #Scale value to uint16 range 0-65535
print(im)                           #Check Value
im = im.astype(np.uint16)           #Cast Image data type
print(im.dtype)
cv2.namedWindow('im2', cv2.WINDOW_NORMAL)
cv2.imshow('im2', im)

#Conversion from uint16 to uint8
im = im*(255./65535)                #Scale value to uint8 range 0-255
print(im)                           #Check Value
im = im.astype(np.uint8)            #Cast Image data type    
print(im.dtype)
cv2.namedWindow('im3', cv2.WINDOW_NORMAL)
cv2.imshow('im3', im)

Sample Images: enter image description here

Result for each conversion: enter image description here

每次打印的数据:

>>> 
========== RESTART: C:\Users\310293649\Desktop\DatatypeLearning.py ==========
uint8
[[[ 6  4  4]
  [15 13 13]
  [13 11 11]
  ..., 
  [43 45 45]
  [43 45 45]
  [34 36 36]]

 [[ 9  7  7]
  [22 20 20]
  [19 17 17]
  ..., 
  [49 51 51]
  [47 49 49]
  [36 38 38]]

 [[24 22 22]
  [28 26 26]
  [23 21 21]
  ..., 
  [45 47 47]
  [41 43 43]
  [28 30 30]]

 ..., 
 [[11 12 16]
  [ 6  7 11]
  [ 1  2  6]
  ..., 
  [ 7  7  7]
  [ 7  7  7]
  [ 7  7  7]]

 [[10 11 15]
  [ 6  7 11]
  [ 2  3  7]
  ..., 
  [ 7  7  7]
  [ 7  7  7]
  [ 7  7  7]]

 [[ 8  9 13]
  [ 6  7 11]
  [ 4  5  9]
  ..., 
  [ 7  7  7]
  [ 7  7  7]
  [ 7  7  7]]]
float32
[[[ 0.02352941  0.01568628  0.01568628]
  [ 0.05882353  0.0509804   0.0509804 ]
  [ 0.0509804   0.04313726  0.04313726]
  ..., 
  [ 0.16862746  0.17647059  0.17647059]
  [ 0.16862746  0.17647059  0.17647059]
  [ 0.13333334  0.14117648  0.14117648]]

 [[ 0.03529412  0.02745098  0.02745098]
  [ 0.08627451  0.07843138  0.07843138]
  [ 0.07450981  0.06666667  0.06666667]
  ..., 
  [ 0.19215688  0.20000002  0.20000002]
  [ 0.18431373  0.19215688  0.19215688]
  [ 0.14117648  0.14901961  0.14901961]]

 [[ 0.09411766  0.08627451  0.08627451]
  [ 0.10980393  0.10196079  0.10196079]
  [ 0.09019608  0.08235294  0.08235294]
  ..., 
  [ 0.17647059  0.18431373  0.18431373]
  [ 0.16078432  0.16862746  0.16862746]
  [ 0.10980393  0.11764707  0.11764707]]

 ..., 
 [[ 0.04313726  0.04705883  0.0627451 ]
  [ 0.02352941  0.02745098  0.04313726]
  [ 0.00392157  0.00784314  0.02352941]
  ..., 
  [ 0.02745098  0.02745098  0.02745098]
  [ 0.02745098  0.02745098  0.02745098]
  [ 0.02745098  0.02745098  0.02745098]]

 [[ 0.03921569  0.04313726  0.05882353]
  [ 0.02352941  0.02745098  0.04313726]
  [ 0.00784314  0.01176471  0.02745098]
  ..., 
  [ 0.02745098  0.02745098  0.02745098]
  [ 0.02745098  0.02745098  0.02745098]
  [ 0.02745098  0.02745098  0.02745098]]

 [[ 0.03137255  0.03529412  0.0509804 ]
  [ 0.02352941  0.02745098  0.04313726]
  [ 0.01568628  0.01960784  0.03529412]
  ..., 
  [ 0.02745098  0.02745098  0.02745098]
  [ 0.02745098  0.02745098  0.02745098]
  [ 0.02745098  0.02745098  0.02745098]]]
[[[  1.57284000e+07   2.18448906e+04   1.54200012e+03]
  [  1.57284000e+07   8.73798047e+03   3.85500024e+03]
  [  1.57284000e+07   1.00822871e+04   3.34100024e+03]
  ..., 
  [  3.93204025e+06   2.91266455e+03   1.15650000e+04]
  [  3.93204025e+06   2.91266455e+03   1.15650000e+04]
  [  3.93204025e+06   3.64082983e+03   9.25200000e+03]]

 [[  1.57284000e+07   1.45632822e+04   2.31300000e+03]
  [  1.57284000e+07   5.95771875e+03   5.65400000e+03]
  [  1.57284000e+07   6.89840918e+03   4.88300000e+03]
  ..., 
  [  3.93204025e+06   2.56999805e+03   1.31070010e+04]
  [  3.93204025e+06   2.67490112e+03   1.25930010e+04]
  [  3.93204025e+06   3.44920728e+03   9.76600000e+03]]

 [[  1.57284000e+07   5.46124707e+03   6.16800049e+03]
  [  1.57284000e+07   4.68106592e+03   7.19600049e+03]
  [  1.57284000e+07   5.69868750e+03   5.91100000e+03]
  ..., 
  [  3.93204025e+06   2.78872144e+03   1.20790000e+04]
  [  3.93204025e+06   3.04813696e+03   1.10510000e+04]
  [  3.93204025e+06   4.36899463e+03   7.71000049e+03]]

 ..., 
 [[  7.86415812e+05   2.04796504e+04   4.11200000e+03]
  [  7.86415250e+05   2.97885508e+04   2.82700000e+03]
  [  7.86415125e+05   5.46122266e+04   1.54200012e+03]
  ..., 
  [  0.00000000e+00   0.00000000e+00   1.79900012e+03]
  [  0.00000000e+00   0.00000000e+00   1.79900012e+03]
  [  0.00000000e+00   0.00000000e+00   1.79900012e+03]]

 [[  7.86415062e+05   2.18449570e+04   3.85500024e+03]
  [  7.86415250e+05   2.97885508e+04   2.82700000e+03]
  [  7.86415250e+05   4.68105117e+04   1.79900012e+03]
  ..., 
  [  0.00000000e+00   0.00000000e+00   1.79900012e+03]
  [  0.00000000e+00   0.00000000e+00   1.79900012e+03]
  [  0.00000000e+00   0.00000000e+00   1.79900012e+03]]

 [[  7.86415062e+05   2.52057109e+04   3.34100024e+03]
  [  7.86415250e+05   2.97885508e+04   2.82700000e+03]
  [  7.86415125e+05   3.64082109e+04   2.31300000e+03]
  ..., 
  [  0.00000000e+00   0.00000000e+00   1.79900012e+03]
  [  0.00000000e+00   0.00000000e+00   1.79900012e+03]
  [  0.00000000e+00   0.00000000e+00   1.79900012e+03]]]
uint16
[[[ 254.07003891   84.99610895    6.        ]
  [ 254.07003891   33.99610895   15.        ]
  [ 254.07003891   39.22957198   13.        ]
  ..., 
  [ 254.53696498   11.3307393    45.        ]
  [ 254.53696498   11.3307393    45.        ]
  [ 254.53696498   14.16342412   36.        ]]

 [[ 254.07003891   56.66536965    9.        ]
  [ 254.07003891   23.17898833   22.        ]
  [ 254.07003891   26.84046693   19.        ]
  ..., 
  [ 254.53696498    9.99610895   51.        ]
  [ 254.53696498   10.40466926   49.        ]
  [ 254.53696498   13.42023346   38.        ]]

 [[ 254.07003891   21.24902724   24.        ]
  [ 254.07003891   18.21400778   28.        ]
  [ 254.07003891   22.17120623   23.        ]
  ..., 
  [ 254.53696498   10.84824903   47.        ]
  [ 254.53696498   11.85992218   43.        ]
  [ 254.53696498   16.99610895   30.        ]]

 ..., 
 [[ 254.93774319   79.6848249    16.        ]
  [ 254.93774319  115.90661479   11.        ]
  [ 254.93774319  212.49805447    6.        ]
  ..., 
  [   0.            0.            7.        ]
  [   0.            0.            7.        ]
  [   0.            0.            7.        ]]

 [[ 254.93774319   84.99610895   15.        ]
  [ 254.93774319  115.90661479   11.        ]
  [ 254.93774319  182.14007782    7.        ]
  ..., 
  [   0.            0.            7.        ]
  [   0.            0.            7.        ]
  [   0.            0.            7.        ]]

 [[ 254.93774319   98.07392996   13.        ]
  [ 254.93774319  115.90661479   11.        ]
  [ 254.93774319  141.66536965    9.        ]
  ..., 
  [   0.            0.            7.        ]
  [   0.            0.            7.        ]
  [   0.            0.            7.        ]]]
uint8

出现差异并不是因为转换为整数时精度降低。事实上,问题在于你期望HSV相当于工作RGB表示。但是,虽然当表示为 float32 时 RGB 三元组中的所有分量都在 0 和 1 之间,但对于 HSV 三元组来说,这不再适用。对于 HSV,第二个和第三个分量(即 S 和 V)仍然介于 0 和 1 之间,但第一个分量 H(ue) 是 0 到 360 之间的角度(请参阅的文档cv2.cvtColor).

这对您的转换以及您的转换都是有问题的cv2.imshow()它也期望 0 到 1 之间的三个分量。当您将数据类型转换为时,转换会导致溢出np.uint8将所有值乘以 65535 后。读取后的文档cv2.imshow当调用时,人们可能期望内部转换得到相同的结果cv2.imshow but as imshow将传递的数组解释为 RGB 图像,它只是将所有大于 1 的值减少到 1。

如果您在转换之前手动执行相同的操作,您将获得相同的图像三次:

import cv2
import numpy as np

im = cv2.imread(r'C:\Users\310293649\Desktop\photo.png')
cv2.namedWindow('im', cv2.WINDOW_NORMAL)
cv2.imshow('im', im)

#Conversion from 8uint to float32 before cvtColor()
im = im.astype(np.float32)          #Cast Image data type        
im /= 255.                          #Scale value to float32 range 0-1
#Colour Space Conversion to HSV
im = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
cv2.namedWindow('im1', cv2.WINDOW_NORMAL)
cv2.imshow('im1', im)

im[:, :, 0] = np.where(im[:, :, 0]>1.0, 1.0, im[:, :, 0])
im *= 65535                         #Scale value to uint16 range 0-65535
im = im.astype(np.uint16)           #Cast Image data type
cv2.namedWindow('im2', cv2.WINDOW_NORMAL)
cv2.imshow('im2', im)

#Conversion from uint16 to uint8
im = im*(255./65535)                #Scale value to uint8 range 0-255
im = im.astype(np.uint8)            #Cast Image data type
cv2.namedWindow('im3', cv2.WINDOW_NORMAL)
cv2.imshow('im3', im)

这将为np.float32, np.uint16, and np.uint8:

enter image description here

(有趣的是,cv2.imwrite似乎没有进行相同的转换,因为人们得到了不同的结果np.float32版本。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cvtColor() 转换为 HSV 色彩空间后的 Numpy 8/16/32 位图像数据类型 的相关文章

  • Django:NoReverseMatch at /'myapp'不是注册的命名空间

    我在模板渲染期间遇到此错误 我想做的是允许用户上传 csv 然后将数据处理到模型中 第 109 行出错 myapp 不是已注册的命名空间 这是我的第 109 行代码
  • Django 1.6:清除一张表中的数据

    我有一个名为 UGC 的表 想要清除该表中的所有数据 我不想重置整个应用程序 这也会删除所有其他模型中的所有数据 是否可以只清除一个模型 我还为我的应用程序配置了 South 如果这有帮助的话 你可以使用原始 SQL https docs
  • 如何将 typeshed 与 mypy 一起使用?

    我克隆了typeshed https github com python typeshed但我不知道如何告诉 mypy 使用它包含的类型提示 我在 mypy help 中没有看到任何选项 mypy 存储库确实包含对 typeshed 存储库
  • Python TypeError:不支持的操作数类型 -:“int”和“function”

    我是 Python 初学者 正在做一项作业 我不断得到TypeError unsupported operand type s for int and function 即使在研究了错误并应用了建议的修复之后 我并不是在寻找任何人给我一个解
  • 如何在嵌套列表中查找给定元素?

    这是我的迭代解决方案 def exists key arg if not arg return False else for element in arg if isinstance element list for i in elemen
  • os.walk 无需深入研究下面的目录

    我该如何限制os walk只返回我提供的目录中的文件 def dir list self dir name whitelist outputList for root dirs files in os walk dir name for f
  • Plotly:如何在堆叠条形图顶部显示值的总和以及各个条形值?

    我正在尝试在 Python 中的 Plotly Express 中添加每个堆叠条形顶部的总计以及各个条形值 import plotly express as px df px data medals long fig px bar df x
  • 如何为 PyYAML 编写代表程序?

    我想要一个自定义函数来序列化任意 python 对象 就像 json dump 函数有一个名为 default 的可选参数 如果对象不是 json 可序列化的 它应该是 json 转储器将调用的函数 我只是想从 json 包中执行相当于此操
  • 如何在 Google App Engine (Python) 中定义配置变量/常量?

    我是 python GAE 的新手 想知道如何快速定义和使用全局设置变量 所以说你 git 克隆我的 GAE 应用程序 然后打开config yaml 添加更改设置 应用程序就全部连接起来 如下所示 config yaml or whate
  • dask分布式内存错误

    在分布式作业上运行 Dask 时 我在调度程序上遇到以下错误 distributed core ERROR Traceback most recent call last File usr local lib python3 4 dist
  • 识别文本中的多个类别和相关情感

    如果您有一个文本语料库 如何识别所有类别 来自预定义类别列表 以及与之相关的情绪 正面 负面写作 我将在 Python 中执行此操作 但现阶段我不一定要寻找特定于语言的解决方案 让我们用一个例子来看看这个问题 试图澄清我的问题 如果我有一整
  • python请求ssl握手失败

    每次我尝试这样做 requests get https url 我收到这条消息 import requests gt gt gt requests get https reviews gethuman com companies Trace
  • Python - 从一定范围内随机采样,同时避免某些值

    我一直在阅读有关random sample 函数在random模块 但没有看到任何可以解决我的问题的东西 我知道使用random sample range 1 100 5 会给我来自 人群 的 5 个独特样本 我想得到一个随机数range
  • 抓取 Shopee API v4

    我有一个最终项目 其中我想要检索的数据是通过在shopee上抓取数据来获取的 但是当我在隐藏的API上抓取shopee时遇到问题 当我在Insomnia脚本上尝试时 脚本会运行 但是当我尝试时在本地或 google colab 脚本上 这是
  • Python for 循环前瞻

    我有一个 python for 循环 其中我需要向前查看一项以查看在处理之前是否需要执行某项操作 for line in file if the start of the next line 0 perform pre processing
  • matplotlib 后端 - 我关心吗?

    gt gt gt import matplotlib gt gt gt print matplotlib rcsetup all backends u GTK u GTKAgg u GTKCairo u MacOSX u Qt4Agg u
  • pandas groupby 中两个系列的最大值和最小值

    是否可以从 groupby 中的两个系列中获取最小值和最大值 例如下面的情况 分组时c 我怎样才能得到最小值和最大值a and b同时 df pd DataFrame a 10 20 3 40 55 b 5 14 8 50 60 c x x
  • Mac 无法安装 Tensorflow

    我检查了我的 pip3 和 python3 版本 tensorflow MacBook Pro de Hector 2 tensorflow hectoresteban pip3 V pip 10 0 1 from Users hector
  • 合并共享属性的节点

    EDITED 我真的需要 Networkx graph 专家的帮助 假设我有以下数据框 我想将这些数据框转换为图表 然后我想根据描述和优先级属性将两个图映射到相应的节点 df1 From description To priority 10
  • 获取 Flask 中没有端口的请求主机名

    我刚刚设法使用 Flask 获取我的应用程序服务器主机名request host and request url root 但这两个字段都返回请求主机名及其端口 我想使用仅返回请求主机名的字段 方法 而无需进行字符串替换 如果有 没有 We

随机推荐