Я работаю некоторое время. Я пишу блог впервые. Я не знаю, как это написать. Давайте просто прочитаем это. Пожалуйста, поправьте меня, если у вас есть неверные слова.
Недавно в работе использовалась функция сжатия изображения. Я нашел несколько инструментов, но хорошего выбора не было. Наконец, я выбрал человека по имени Джадели, но эффективность снова стала проблемой. У меня не было другого выбора, кроме как изучить его исходный код, но я обнаружил, что меня заинтересовало один из его алгоритмов квантования подтракционного определения. Тем не менее, я был смущен тем, что я вообще не понял, что он писал, поэтому у меня была идея реализовать количественный алгоритм цвета самостоятельно.
Я сам нашел некоторую информацию и нашел три более часто используемых алгоритма обработки цветов:
Популярный алгоритм цвета:
Конкретный алгоритм состоит в том, чтобы сначала подсчитать количество раз, когда все цвета появляются в изображении, выберите 256 цветов с наибольшим количеством случаев в качестве цвета палиты изображения, а затем повторяют все пиксели изображения, снова найдите его на рисунок. Реализация этого алгоритма относительно проста, но искажение относительно серьезное. Некоторые изображения появляются с низкой частотой, но визуальный эффект на человеческий глаз весьма очевиден. Информация будет потеряна. Например, высокие места на изображении не могут быть выбраны алгоритмом из-за небольшого количества случаев и будут потеряны.
Средний алгоритм нарезки:
Я не изучал этот алгоритм. Те, кто хочет знать, могут прочитать эту статью, которая содержит введение трех алгоритмов.
Октав дерево
Этот алгоритм является последним алгоритмом, который я выбрал. Его основная идея состоит в том, чтобы преобразовать значение цвета RGB изображения в бинарное распределение в Octree, например: (173,234,144)
Преобразовать в двоичный файл (10101101, 11101010, 10010000), выберите первые биты r, g, b для формирования (111) и служить в качестве дочерних узлов корневого узла, где 111 является индексом корневой массивы деть. Смотрите изображение для деталей.
Одна из вещей, которые я более смущен, - это стратегия слияния узлов листьев. Самый глупый метод, который я использую здесь, - найти самый глубокий узел, а затем слияние. Это немного просто и грубо. Есть и другие лучшие методы. Пожалуйста, оставьте мне сообщение. Картинка слишком большая и не может быть загружена, поэтому я просто загружаю код. Код не был рефактор, поэтому каждый может прочитать его.
пакет com.gys.pngquant.octree; import java.util.arraylist; import java.util.hashmap; import java.util.list; import java.util.map;/** * * * @classname class name: node * @description function Описание: * <p> * octet tree * </p> * 2015-16. ************************************ • piexls = 0; частная карта <integer, list <node >> levelmapping; // хранить взаимосвязь между иерархией и узлом public int getrgbvalue () {int r = this.rnum / this.piexls; int g = this.gnum / this.piexls; int b = this.bnum / this.piexls; b);} public map <integer, list <node >> getlevelmapping () {return levelmapping;} public void aftersetparam () {if (this.getParent () == null && this.depth == 0) {levelmapping = new Hashmap <integer, list <node >>; для (int i = 1; {levelMapping.put (i, new ArrayList <node> ());}}} public int getrnum () {return rnum;} public void setrnum (int rnum) {if (! isleaf) {Throw New UnsupportedoperationException ();} this.rnum = rnum; setGnum (int gnum) {if (! isleaf) {бросить новый UnsupportedOperationException ();} this.gnum = gnum;} public int getBnum () {return bnum;} public void setbnum (int bnum) {if (! isleaf) {shrow unsupportedopereseexexcepteexexcepteex int. getPiexls () {return piexls;} public void setpiexls (int piexls) {if (! ISLeaf) {Throw New UnsupportEdoPerationException ();} this.piexls = piexls;} public int getDepth () {return;} // return aguldsdes MergerLeafNode () {if (this.IsLeaf) {return 1;} this.Setleaf (true); int rnum = 0; int gnum = 0; int bnum = 0; int pixel = 0; int i = 0; для (узел ребенка: this.children) {if gilt = null) {} rnum += = gritgn. child.getgnum (); bnum += child.getbnum (); pixel += child.getpiexls (); i += 1;} this.setrnum (rnum); this.setgnum (gnum); this.setbnum (bnum); this.setpiexls (pixel); this.children = null; Node getDepestNode () {for (int i = 7; i> 0; i--) {list <node> levellist = this.levelmapping.get (i); if (! Levellist.isempty ()) {return levellist.remove (levellist.size ()-1); getLeafnum () {if (isLeaf) {return 1;} int i = 0; for (node child: this.children) {if (child! = null) {i += child.getLeafnum ();}} return i;} public void setdepth (int debul) {this.depth = greep node node getParent () {vaturent () {vaturent () {vaturent () {vaturent () {vaturent () {vaturent () {vaturent () {vaturent (). SetParent (node parent) {this.parent = parent;} public node [] getChildren () {return childs;} public node getChild (int index) {return childs [index];} public void setChild (int index, node node) {дети [index] = node;} public boole isleaf () {return ispeaf; g, int b) {this.rnum += r; this.gnum += g; this.bnum += b; this.piexls += 1;} public void setLeaf (boolean isleaf) {this.isleaf = isleaf;} public void Add8bite2rot (int _taget, int _speed) {if dref! null) {throw new unsupportedOperationexception ();} int speed = 7 + 1-_speed; int r = _taget >> 16 & 0xff; int g = _taget >> 8 & 0xff; int b = _taget & 0xff; + ((g >> i & 1) << 1) + (b >> i & 1); node chiled = drovode.getChild (item); if (child == null) {child = new Node (); child.setDepth (8-i); child.setParent (drotode); child.aftersetParam (); this.levelmapping.get (child.getDepth ()). Добавить (child); пронод.setchild (item, kild);} if (i = speed) {child.setleaf (true); b); break;} drotode = kild;}} public static node build (int [] [] matrix, int speed) {node root = new Node (); root.aftersetParam (); for (int[] row : matrix) {for (int cell : row) {root.add8Bite2Root(cell, speed);}}return root;}public static byte[] mergeColors(Node root, int maxColors){byte[] byteArray = new byte[maxColors * 3];List<byte> result = new ArrayList<byte>();int leafNum = root.getLeafnum (); try {while (leafnum> maxcolors) {int mergerLeafnode = root.getDepestNode (). MergerLeafnode (); Leafnum - = (MergerLeafnode - 1);}} Catch (Exception e) {e.printStChtrace ();} fillArray (ret, rest, rest, rest, rest, rest, rest, result, result, rest, result, rest, rest, rest, rest, rest, rest, 0); : result) {bytearray [i+++] = byte1;} return bytearray;} private static void fillarray (узел узела, список <byte> result, int offset) {if (node == null) {return;} if (node.islef ()) {result.add. node.getpiexls ())); result.add ((byte) (node.getgnum () / node.getpiexls ())); result.add ((byte) (node.getbnum () / node.getpiexls ()); Result.add (byte) (node.getbnum. () node.getx); else {for (node Child: node.getchildren ()) {fillarray (ребенок, результат, смещение);}}}}}Бедная моя единственная структура данных в колледже. Код только реализует Octree. Для квантования изображения 1920*1080 занимает около 450 мс, и если уровень -2, это составляет около 100 мс.
Хорошо, вот и все. Прежде чем я написал это, я чувствовал, что хочу много сказать, но я не знал, что сказать, когда написал это. Пожалуйста, прости меня.
Суммировать
Выше приведено все содержание этой статьи о простой реализации Java примеров кода обработки изображений Octree, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!