如何从.las文件的16位值中过滤颜色



我有一个包含内容的.las文件,如下所示:

array([( 860297,  472942, 67187, 11051, 73, 0, 0, 0, 1, 12079, 11051,  9252),
( 859318,  473132, 67336,  8995, 73, 0, 0, 0, 1,  9252,  8995,  9509),
( 859941,  473665, 67550, 12079, 73, 0, 0, 0, 1, 12079, 12850, 10023),
...,
(1057593, 1184341, 75212, 19018, 73, 0, 0, 0, 1, 20303, 19275, 16191),
(1057764, 1184161, 74734, 14906, 73, 0, 0, 0, 1, 15934, 14906, 13878),
(1057548, 1184058, 74881, 26214, 73, 0, 0, 0, 1, 28784, 25957, 21074)],
dtype=[('X', '<i4'), ('Y', '<i4'), ('Z', '<i4'), ('intensity', '<u2'), ('bit_fields', 'u1'),
('raw_classification', 'u1'), ('scan_angle_rank', 'i1'), ('user_data', 'u1'),
('point_source_id', '<u2'), ('red', '<u2'), ('green', '<u2'), ('blue', '<u2')])

正如我在.las文件中发现的,RGB中的值以16位颜色存储。我写了2个函数-将颜色转换为8位:

opened_file = open("my.las") #example
colors = opened_file.points[["red", "green", 'blue']]
>>> array([(12079, 11051,  9252), (9252,  8995,  9509), (12079, 12850, 10023), ...])
def eightbitify(colour):
return colour/256

接下来我将尝试将颜色转换为HSV,因此我将有可能过滤特定的颜色:

def to_hsv(rgb: np.ndarray):
empty_image = np.zeros((1, 1, 3), dtype=np.uint8)
empty_image[0, 0] = list(reversed(rgb))
hsv = cv2.cvtColor(empty_image, cv2.COLOR_RGB2HSV)
return list(reversed(hsv[0, 0]))

我没能找到更好的解决方案,因为OpenCV需要图像,所以我为1个像素创建图像并进行转换(太难看了:/(。问题是,我收到的值与任何互联网RGB-HSV计算器的结果都不匹配。我以这种方式使用这些功能:

def convert_color(rgb_16: np.ndarray)->np.ndarray:
converted_color = np.array([int(eightbitify(rgb_16[0])), int(eightbitify(rgb_16[1])), int(eightbitify(rgb_16[2]))])
converted_hsv = to_hsv(converted_color)
return converted_hsv
for color in colors:
converted = convert_color(color)

所以我的问题是:
1。将RGB值从opened_file.points初始数组转换为HSV的最佳方法是什么
2.如何仅使用numpy从opened_file.points中筛选特定颜色?我可以对RGB值应用一些转换函数吗
不幸的是,我和numpy的经历很小,所以我需要帮助。非常感谢。

我不熟悉您的图像类型,但希望能在Numpy和OpenCV方面为您提供帮助。

#!/usr/bin/env python3
import pylas
import cv2
import numpy as np
# Open file
las = pylas.read('W2.las')
# Extract all the red values into a Numpy array, likewise green and blue
R = las.points["red"]
G = las.points["green"]
B = las.points["blue"]
# Make a Numpy image by stacking the RGB values and converting to uint8
BGR = (np.dstack((B,G,R))>>8).astype(np.uint8)
# Convert to HSV
HSV = cv2.cvtColor(BGR, cv2.COLOR_BGR2HSV)
# Define lower and uppper limits of what we call "green"
range_lo = np.array([70,30,30])
range_hi = np.array([90,255,255])
# Mask image to only select greens
mask = cv.inRange(HSV,range_lo,range_hi)
# Change image to red where we found green
image[mask>0]=(0,0,255)
cv.imwrite("result.png",image)

目前,我不知道图像的形状,所以它是一条4400万像素的长线,但它只需要一个reshape()来使其正确。请注意,mask中的每个True/False值都将是像素列表的索引,并指示该像素是否为绿色。

您可能需要处理range参数的下限值和上限值,请参阅此处的答案。

Stack Overflow用户@nathancy在这里用滑块制作了一个相当整洁的HSV颜色选择器。

最新更新