Как выполнить пороговое изображение и нормализацию в OpenCV? - PullRequest
0 голосов
/ 03 мая 2019

У меня есть 16-битное изображение, которое я хочу преобразовать в 8-битное изображение. Однако я хочу сделать фильтрацию до этого. Все значения ниже некоторого значения (скажем, P1) должны стать 0. И все значения выше другого значения (скажем, P2) должны стать 255. Все значения между этими значениями должны быть масштабированы в соответствии с их расстоянием до P1 и P2.

Следующий код делает это:

def transform(value):
    if value < P1:
        value = 0
    elif value > P2:
        value = 255
    else:
        value = (value - P1) * (255.0 / (P2 - P1))
    return value

А затем используя исходное 16-битное изображение в качестве ввода:

newImage= [[transform(value) for value in row] for row in originalImage]

Однако это невероятно медленно ... Я пытался сделать то же самое, используя cv2.convertScaleAbs, что быстро, но не совсем то, что я хочу. В частности, функция «Abs» в этой функции делает невозможным использование.

Существуют ли разные функции, которые я могу использовать, чтобы быстрее получить нужную вещь?

1 Ответ

0 голосов
/ 03 мая 2019

Я нашел решение, которое использует cv2.convertScaleAbs

Сначала масштабируйте исходное изображение, которое будет интерпретироваться как int32:

originalImage = numpy.array(originalImage, dtype=np.int32)

Затем вычтите значение P1, сделав все значения меньше P1 отрицательными:

newImage = np.array(originalImage - P1)

Затем обрежьте отрицательные значения до 0:

newImage = newImage.clip(min=0)

Наконец, используйте convertScaleAbs с правильной альфа:

alpha = 255.0 / (P2 - P1)
newImage= cv2.convertScaleAbs(newImage, alpha=alpha)
...