Как изменить значения пикселей изображения RGB в MATLAB? - PullRequest
0 голосов
/ 31 августа 2018

Итак, мне нужно применить операцию, подобную

(x(i,j)-min(x)) / max(x(i,j)-min(x))

, который в основном преобразует значение каждого пикселя так, чтобы значения находились в диапазоне от 0 до 1.

Прежде всего, я понял, что Matlab сохраняет наше изображение (строки * col * color) в 3D-матрице при использовании imread,

Image = imread('image.jpg')

Итак, простая операция max на изображении не дает мне максимальное значение в пикселях, и я не совсем уверен, что он возвращает (другой многомерный массив?). Поэтому я попытался использовать что-то вроде

max_pixel = max(max(max(Image)))

Я думал, что это работает нормально. Точно так же я использовал мин трижды. Моя логика заключалась в том, что я получал минимальное значение пикселя во всех трех цветовых плоскостях.

После выполнения вышеупомянутой операции масштабирования я получил изображение, которое, казалось, имело только 0 или 1 значение, и между ними нет значения, которое кажется неправильным. Это как-то связано с округлением до целого числа / с плавающей точкой?

image = imread('cat.jpg')
maxI = max(max(max(image)))
minI = min(min(min(image)))
new_image = ((I-minI)./max(I-minI))

Это дает вывод только 1 и 0, что кажется неправильным.

Другой подход, который я пробую, - это работать на всех цветовых плоскостях отдельно, как это сделано здесь . Но это правильный способ сделать это?

Я также мог бы перебрать все пиксели, но я предполагаю, что это займет время. Очень новичок в этом, любая помощь будет отличной.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

У вас есть uint8 RGB изображение.

Просто конвертируйте его в двойное изображение по

I=imread('https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Cat_poster_1.jpg/1920px-Cat_poster_1.jpg')

I=double(I)./255;

альтернативно

I=im2double(I); %does the scaling if needed

Читать о типах данных изображений


Что ты делаешь не так?

Если вы хотите преобразовать RGB-изображение в диапазон [0-1], вы плохо подходите к проблеме, независимо от правильности кода MATLAB. Позвольте мне привести пример того, почему:

Скажем, у вас есть изображение с 2 цветами.

темно-красный (20,0,0): enter image description here

Средний синий (0,0,128) enter image description here

Теперь вы хотите, чтобы это значение было изменено на [0-1]. Как вы масштабируете это? Предлагаемый подход заключается в том, чтобы сделать значение 128->1 и либо 20->20/128, либо 20->1 (не имеет значения). Однако когда вы делаете это, вы меняете цвет! Вы делаете средний синий цвет интенсивным синим (максимальный канал B, enter image description here) и делаете способ R более интенсивным (вместо 20/255, 20/128, двойной яркости! enter image description here). Это плохо, так как это с простыми цветами, но с объединенными значениями RGB вы можете даже изменить цвет сами по себе, а не только интенсивность. Следовательно, единственный правильный способ преобразования в диапазон [0-1] состоит в том, чтобы предположить, что ваши мин и макс равны [0, 255].

0 голосов
/ 31 августа 2018

Если вы не уверены, что возвращает функция MATLAB или почему, вы всегда должны сначала выполнить одно из следующих действий:

Введите help >functionName< или doc >functionName< в командном окне, в вашем случае: doc max. Это покажет вам необходимую обязательную информацию об этой конкретной функции, например, что нужно вставить и что будет выводиться.

В случае функции max это дает следующие результаты:

M = max (A) возвращает максимальное количество элементов массива.

Если A - вектор, то max (A) возвращает максимум A.

Если A - матрица, то max (A) - это вектор строки, содержащий максимум значение каждого столбца.

Если A - многомерный массив, то max (A) действует вдоль первого измерение массива, размер которого не равен 1, рассматривая элементы как векторы. Размер этого измерения становится равным 1, а размеры всех другие размеры остаются прежними. Если A пустой массив, первый измерение имеет нулевую длину, тогда max (A) возвращает пустой массив с такой же размер как A

Другими словами, если вы используете max() для матрицы, она выведет вектор, который содержит максимальное значение каждого столбца (первое не-одноэлементное измерение). Если вы используете max() для матрицы A размера m x n x 3, это приведет к матрице максимальных значений размера 1 x n x 3. Так что это отвечает на ваш вопрос:

Я не совсем уверен, что он возвращает (другой многомерный массив?)

Двигаемся дальше:

Я думал, что это работает нормально. Точно так же я использовал мин трижды. Моя логика заключалась в том, что я получал минимальное значение пикселя во всех трех цветовых плоскостях.

Это правильно. Кроме того, вы можете использовать max(A(:)) и min(A(:)), что эквивалентно, если вы просто ищете значение.

И после выполнения описанной выше операции я получил изображение, которое, казалось, имело только 0 или 1 значение, и между ними нет значения, которое кажется неправильным. Это как-то связано с округлением до целого числа / с плавающей точкой?

Мы не можем знать, почему это происходит, если вы не публикуете минимальный, полный и проверяемый пример вашего кода. Это может быть потому, что ваши переменные имеют определенный тип, или это может быть из-за ошибки в ваших вычислениях.

Другой подход, который я пробую, - это работать на всех цветовых плоскостях отдельно, как здесь. Но так ли это правильно?

Это зависит от того, каков конечный результат. Нормализация каждого цвета (красный, зеленый, синий) приведет к другому результату по сравнению с одновременной нормализацией значений (во всяком случае, в 99% случаев).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...