Хобрук: Ваш путь к мастерству в программировании

NumPy конвертирует 8-битное изображение в 16/32-битное

Я использую OpenCV 2 для некоторых манипуляций с изображениями в цветовом пространстве YCbCr. На данный момент я могу обнаружить некоторый шум из-за преобразования RGB -> YCbCr, а затем YCbCr -> RGB, но, как сказано в документация:

Если вы используете cvtColor с 8-битными изображениями, при преобразовании будет потеряна некоторая информация. Для многих приложений это не будет заметно, но рекомендуется использовать 32-битные изображения в приложениях, которым нужен полный диапазон цветов или которые перед операцией конвертируют изображение, а затем обратно.

Итак, я хотел бы преобразовать свое изображение в 16 или 32 бита, но я не нашел, как это сделать с помощью NumPy. Некоторые идеи?

img = cv2.imread(imgNameIn)
# Here I want to convert img in 32 bits
cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB, img)
# Some image processing ...
cv2.cvtColor(img, cv2.COLOR_YCR_CB2BGR, img)
cv2.imwrite(imgNameOut, img, [cv2.cv.CV_IMWRITE_PNG_COMPRESSION, 0])

  • Подсказку см. на странице stackoverflow.com/q/8976502/2379410. 27.06.2014
  • Если это решит вашу проблему, напишите это как ответ и примите его, чтобы он был помечен как РЕШЕНО. 27.06.2014
  • Извините, я не вижу кнопки, чтобы принять ответ и отметить проблему как решенную, что мне делать? 27.06.2014
  • @user3263033 user3263033 вам нужно опубликовать ответ на свой вопрос, затем нажмите на галочку рядом с вашим ответом, чтобы принять его 29.06.2014

Ответы:


1

Благодаря @moarningsun проблема решена:

i = cv2.imread(imgNameIn, cv2.CV_LOAD_IMAGE_COLOR) # Need to be sure to have a 8-bit input
img = np.array(i, dtype=np.uint16) # This line only change the type, not values
img *= 256 # Now we get the good values in 16 bit format
30.06.2014

2

Принятый ответ не точен. 16-битное изображение имеет 65536 уровней интенсивности (2^16), следовательно, значения варьируются от 0 до 65535.

Если кто-то хочет получить 16-битное изображение из изображения, представленного в виде массива float в диапазоне от 0 до 1, нужно умножить каждый коэффициент этого массива на 65535.

Кроме того, хорошей практикой является приведение типа конечного результата к самому последнему шагу выполняемых операций. В основном это происходит по двум причинам: - Если вы выполняете деление или умножение на float, результатом будет float, и вам нужно будет снова изменить тип. - В целом (в математическом смысле этого слова) преобразование числа с плавающей запятой в целое число может привести к ошибкам. Приведение типа в самом конце операций предотвращает распространение ошибок.

25.08.2017
  • результат умножения... обычно возвращает число с плавающей запятой` -- Не могли бы вы продемонстрировать, как это происходит? 26.08.2017
  • @DanMašek Я имел в виду вообще в математическом смысле этого слова - хотя бы раз. Я переписал то, что имел в виду, в более ясной форме. Спасибо, что указали, что мой ответ был запутанным. 28.08.2017
  • вы также можете использовать cv2.normalize(img, dst=None, alpha=0, beta=65535, norm_type=cv2.NORM_MINMAX) для получения правильных 16-битных значений 05.01.2021
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..