Увеличение контрастности изображения в MATLAB - PullRequest
3 голосов
/ 02 августа 2011

У меня есть изображение в оттенках серого, значения пикселей которого находятся в диапазоне от 1.000 до 1.003.

Я бы хотел увеличить контраст между различными пикселями.Я пробовал imcontrast в imtool, но визуально улучшения не наблюдается.

Возможно, идея состоит в том, чтобы увеличить значения пикселей> 1.000.Например, было бы здорово, если бы я мог отобразить 1.001 на 10, 1.002 на 20 и т. Д. Это увеличит контраст?

Ответы [ 4 ]

11 голосов
/ 02 августа 2011

Попробуйте

newRange = 1.0;  %// choose the new maximum. (new minimum always at 0.0)
imgMin = double(min(image(:)));
imgMax = double(max(image(:)));
image = (image - imgMin) / (imgMax - imgMin) * newRange;

Затем вам все еще нужно следить за вероятностью того, что изображение может быть пустым (что может вызвать проблему деления на ноль).

Еслижелаемый диапазон, который вы хотите усилить, не является истинным минимумом или максимумом, вы можете установить значения imgMin и imgMax вручную.

5 голосов
/ 08 августа 2014

Я понимаю, что это не совсем то, что здесь задают, но название вопроса может привести к тому, что другие, как и я, придут сюда в поисках способа (неразрушающего) увеличения контраста в изображении даже послеон нормализован - аналогично тому, что можно сделать с функцией кривых в Photoshop, установив для нее сигмоид форму:

sigmoid curve on photoshop

Простой способчтобы сделать это (предполагая, что у нас есть изображение, нормализованное в диапазоне [0,1], например, после прохождения его через функцию mat2gray MATLAB), нужно использовать функцию косинуса.Вот как: сначала мы отражаем косинусную кривую так, чтобы ее самая низкая точка была на нуле, а самая высокая - на π, а не наоборот;затем мы масштабируем входное значение на π, так что самая высокая точка возникает, когда входное значение имеет максимальное значение, 1;и, наконец, мы нормализуем результат до выходного диапазона [0,1] (из оригинала косинуса [-1,1]), добавив 1 и разделив на 2. В результате получается простая формула ниже:

img_contrast = ( -cos( pi * mat2gray( img_original ) ) + 1 ) / 2;

Надеюсь, что это поможет!

1 голос
/ 02 августа 2011

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

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

0 голосов
/ 03 августа 2011

Если вы используете imshow(image, [lowerBound upperBound]) для отображения изображения, оно должно отображаться с линейным масштабированием между lowerBound, который будет казаться черным, и upperBound, который будет казаться белым. Итак, для вашего примера вы бы использовали что-то вроде imshow(image, [1.000 1.003]) для отображения вашего изображения.

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