Как получить и отобразить уровни на цветном или черно-белом растровом изображении

#flash #actionscript-3 #flex4

#flash #actionscript-3 #flex4

Вопрос:

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

Также, в качестве бонуса, есть ли способ найти наилучшие настройки уровня ввода теней и подсветки, в основном настройки, определяемые кнопкой автоматического уровня? Диалоговое окно уровней настройки Photoshop

Обновить:

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

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

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

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

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

Результаты фотосъемки:
Результаты Photoshop

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

         /**
         * 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 = Нарисовать гистограмму в оттенках серого (выбранное изображение, sprite1);

<s: идентификатор растрового изображения = «Выбранное изображение» width=»100%» height =»100%» scaleMode= «почтовый ящик» />
<mx: идентификатор пользовательского компонента=»sprite1″/>
<s: идентификатор растрового изображения=»thresholdGraph» width=»100%» height =»45″ />

Комментарии:

1. Возможно, объединенные уровни относятся к яркости (значение в пикселях после преобразования в черно-белое), например 0.299 * R 0.587 * G 0.114 * B .

2. Я не уверен, что делать, что это. Графика не является моей сильной стороной.

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

4. Я думаю, что понимаю. Я опубликую обратно то, что найду.

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

Ответ №1:

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