如何在nrrd文件中将灰度转换为RGB

时间:2019-06-17 05:32:26

标签: python image opencv image-processing

我尝试将3D灰度图像转换为RGB 3D图像。

现在我可以获取每个切片的数组了。此数组值的灰度像素值。

但是我不知道如何隐秘RGB值。

我尝试使用opencv函数转换颜色。

import numpy as np
import nrrd
import cv2

data = nrrd.read('C:\\Users\\admin\\Desktop\\sample data\\sample_nrrd.nrrd')
print(data[0][442][376])
cv2.cvtColor(data,cv2.COLOR_GRAY2BGR)

但是它不起作用...

我第一次使用nrrd文件。

如何将灰色转换为rgb。

此数组是我的数据的示例。

谢谢。

[-1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000  -1000 -1000 -1000 -1000 -1000 80236 1830 1901 1852 1742 1430   1147 1088 1285 1240 989 969 787 791 1073 1098 1380 1320   1125 1075 1209 1433 1505 1349 1114 1261 1463 1454 1696 1435   1301 1448 1384 1146 1220 1054 829 1189 1245 1319 1293 986    695672594709583503601562562440418764967   1275 911 842 761 652 479 691 715 505 442 768 650    705 938 1079 1076 969 936 907 902 755 588 614 770    738646971971802625890 1020929941824800803    920843793834834937877737494621605763825    642548527427552529572345442442455603614    712521603687770770665744604642791971980   1059 1020 842 781 793 845 860 982 916 1077 907491    806 533 327 709 817 913 977 735 958 624 547 651    952 1171 1184 1033 1262 2015 2193 2444 2830 2678 2650 2473   2528 2766 2915 2991 2654 2403 2700 2646 2302 2276 2706 3003   2639 2499 2414 1948 1456 1908 1409 852500946747715    864899960977977954 1348 1053 1242 1346 1732 1634   1600 1690 1730 1797 1833 1963 1795 1775 2016 2182 2260 2132   1912 1651 1380 1576 1768 2275 1934 1790 1740 1908 2061 2068   1879 1714 1801 1678 1588 1669 1717 1596 1573 2080 1869 1922   2080 1701 2003 1617 1917 1810 1437 1292 1110 813 1079 1166   1037 1111 1518 1417 1037 603 120 137 15 -30 -197 -409   -133 -72 80 7 10 -7 -28 29 -219 -12 3 18    144120 -89 -4 101143143 -162 96218153120     36188275 58 -64 28 9 -77 89202206243    349 234 54 163 262 313 282 131 175 234 102 263    109 93 57 143 282 235 175 189 217 200 297 345    314150 -24105111202 -58 20 -67 -175 -39 271    292 -2 -153 -181 -41 200 67 104128 91 -154 -171    -42 -125 67 -172 -101 -59 -130 -94 -146 -175 23 -51    23010491 -16 -75 -169 -246 -203 -90 45 -99 11     72287149 57 111 79 -12 -104 206 0 41 68     78 -65 -255 -136 -115 53 52 61 -30 119 -155 -229   -190 -36 -163 -240 98 84 85 -17 1 54 81 -173   -205 -172 -351 -19 -86 -172 -98 -90 -169 257 126 83    171284297297159 50 -150 -94 -45 -39 -12230201    215328144 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000  -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000  -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000  -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000  -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000]

1 个答案:

答案 0 :(得分:2)

您的问题不是非常精确和准确,可能会有多种理解。

首先,没有实际的1D颜色到3D颜色的转换,COLOR_GRAY2BGR仅将1通道的灰度转换为3通道的灰度。此转换不会添加任何颜色,只需更改内部图像表示即可,以便我们将其保存在视频中。颜色无法恢复。由于它是3D深度图,我想您想要的是颜色映射功能,如下图所示。

enter image description here

不确定您的数据是最终的差异还是最终的深度。因此,您稍后必须自己弄清楚。但是一般的想法是将其包含在cv :: Mat中,并使用opencv颜色映射功能进行着色。

假设data_image_1D是np数组

import numpy as np 
import cv2
data_image_1D # this is the np array that you got it from somewhere
bw_img = np.reshape(data_image_1D,(rows,cols))
#rows and cols are the size of the depth image that you have. Try to see if you can get this convetsion working. 
im_color = cv2.applyColorMap(bw_img, cv2.COLORMAP_JET)
cv2.imshow("im_color",im_color)
cv2.imshow("bw_img",bw_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

但是,您仍然必须处理负面差异,最小差异和最大差异问题。那一个我可以留给你

更多 数据映射或自定义颜色映射,您可以按照本指南https://www.learnopencv.com/applycolormap-for-pseudocoloring-in-opencv-c-python/

修改

我认为您想要的可能只是一个简单的合并功能。看到这个

import numpy as np
import nrrd
######you orginal code put it here###
bw_img = np.reshape(data_image_1D,(rows,cols))
im_color = cv2.merge([bw_img, bw_img, bw_img])
nrrd.write(filename, im_color)# Write to a NRRD file