Как получить и отобразить уровни на цветном или растровом изображении - PullRequest
1 голос
/ 26 апреля 2011

В фотошопе есть инструмент, позволяющий регулировать уровни изображения. Я хотел бы иметь возможность сделать то же самое. В Интернете я видел примеры, которые показывают уровни, но они есть для каждого отдельного цветового канала (красный, зеленый, синий или альфа или CMYK), но не для комбинированного представления, как в Входных уровнях Photoshop (см. Ниже).

Кроме того, в качестве бонуса есть способ найти наилучшие настройки уровня входного сигнала тени и подсветки, в основном настройки, которые определяет кнопка Автоуровня? Photoshop Adjustment Levels Dialog

Обновление:

Я думаю, что я ближе, но я не уверен. Вот метод, который я собрал. Первое изображение - мои результаты, а второе - результаты Photoshop, анализирующие логотип Google:

Обновление 2:

Хорошо, я думаю, что понял. Код ниже. Это в основном работает все время, в основном.

Дополнительные кредиты: https://pixelero.wordpress.com/2008/06/19/flash-10-bitmapdatahistogram/#comment-448

Мои результаты:
My results

Результаты фотошопа:
Photoshop Results

Метод уровней:

        /**
         * Get a histogram of the grayscale levels
         * */

        private function drawGrayscaleHistogram(bitmapImage:BitmapImage, sprite:Sprite):BitmapData {
            var grayScale:Array = [0.3086, 0.3086, 0.3086, 0, 0, 0.3086, 0.3086, 0.3086, 0, 0, 0.3086, 0.3086, 0.3086, 0, 0, 0, 0, 0, 1, 0];
            var color:Array = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0];
            var filter:ColorMatrixFilter = new ColorMatrixFilter(grayScale);
            var histogram:Vector.<Vector.<Number>>;
            var graphWidth:int = sprite.width;
            var graphHeight:int = sprite.height;
            var g:Graphics = sprite.graphics;
            var vector:Vector.<Number>;
            var bitmapData:BitmapData;
            var maxValue:int;
            var value:int;
            var i:int;

            // clone the bitmap
            bitmapData = bitmapImage.bitmapData.clone();

            // convert it to gray scale
            bitmapData.applyFilter(bitmapImage.bitmapData, bitmapImage.bitmapData.rect, new Point(), filter);

            // get histogram
            histogram = bitmapData.histogram();

            // since it's grayscale the red green and blue are all the same
            vector = histogram[0];

            // get the max value for drawing the graph
            for (var s:* in vector) {
                if (vector[s]>maxValue) {
                    maxValue = vector[s];
                }
            }

            //trace(maxValue);
            //maxValue = 300;

            // create white background
            g.clear();
            g.beginFill(0xFFFFFF, 1.0);
            g.drawRect(0, 0, graphWidth, graphHeight);

            // draw each line
            for each (value in vector) {
                g.lineStyle(1, 0);
                g.moveTo(i, graphHeight);
                g.lineTo(i++, Math.max(0.0, graphHeight-value * graphHeight/maxValue));
            }

            // assign it to bitmap data 
            // so we can resize easily if we want
            bitmapData = new BitmapData(graphWidth, graphHeight, true, 0x00000000);
            bitmapData.draw(sprite);

            return bitmapData;
        }

Использование:

levelsBitmapImage.source = drawGrayscaleHistogram (selectedPicture, sprite1);



1 Ответ

1 голос
/ 06 мая 2011

Для каждого пикселя изображения получите значение яркости, используя формулу, затем увеличьте соответствующий счетчик (один из 256). Вы получите распределение уровней по этим 256 счетчикам. Нарисуйте эти значения в виде линий, и вы получите изображение уровней, как показано выше.
(скопировано из комментариев для правильного ответа)

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