亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java簡單實現八叉樹圖像處理代碼示例

2024-07-13 10:15:11
字體:
來源:轉載
供稿:網友

一晃工作有段時間了,第一次寫博客,有點不知道怎么寫,大家將就著看吧,說的有什么不正確的也請大家指正。

最近工作中用到了一個圖像壓縮的功能。找了一些工具,沒有太好的選擇。最后選了一個叫jdeli的,奈何效率又成了問題。我迫于無奈就只能研究了下它的源碼,卻發現自己對它的一個減色量化算法起了興趣,可是尷尬的自己完全不明白它寫的什么,就起了一個自己實現一個量化顏色算法的念頭。

自己找了一些資料,找到三個比較常用的顏色處理算法:

流行色算法:

具體的算法就是,先對一個圖像的所有顏色出現的次數進行統計,選舉出出現次數最多的256個顏色作為圖片的調色板的顏色,然后再次遍歷圖片的所有像素,對每個像素找出調色板中的最接近的顏色(這里我用的是方差的方式),寫回到圖片中。這個算法的實現比較簡單,但是失真比較嚴重,圖像中一些出現頻率較低,但對人眼的視覺效挺明顯的信息將丟失。比如,圖像中存在的高亮度斑點,由于出現的次數少,很可能不能被算法選中,將被丟失。

中位切分算法:

這個算法我沒有研究,想要了解的同學,可以看下這篇文章,里面有三種算法的介紹。

八叉樹

這個算法就是我最后選用的算法,它的主要思想就是把圖像的RGB顏色值轉成二進制分布到八叉樹中,例如:(173,234,144)

轉成二進制就是(10101101,11101010,10010000),將R,G,B的第一位取出來組成(111),作為root節點的子節點,其中111作為root子節點數組的索引,以此類推,一直到最后一位,然后在葉子節點上存放這個顏色的分量值以及其出現的次數。具體看圖。

java,圖像處理,代碼,八叉樹

其中我比較疑惑的有一個處理就是葉子節點的合并策略,這兒我用的最笨的一個方法,就是找到層次最深的節點,然后合并,有點簡單粗暴,有別的比較好的方法,也請大家給我留言。圖片太大上傳不了了,直接上代碼了,代碼沒有重構,大家湊合看吧。

package com.gys.pngquant.octree;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** *  * * @ClassName  類名:Node * @Description 功能說明:  * <p> *   八叉樹實現 * </p> *  *  2015-12-16  guoys 創建該類功能。 * ********************************************************** * </p> */public class Node{	private int depth = 0;	// 為0時為root節點	private Node parent;	private Node[] children = new Node[8];	private Boolean isLeaf = false;	private int rNum = 0;	private int gNum = 0;	private int bNum = 0;	private int piexls = 0;	private Map<Integer, List<Node>> levelMapping;	// 存放層次和node的關系	public int getRGBValue(){		int r = this.rNum / this.piexls;		int g = this.gNum / this.piexls;		int b = this.bNum / this.piexls;		return (r << 16 | g << 8 | 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>>();			for (int i = 1; i <= 8; i++) {				levelMapping.put(i, new ArrayList<Node>());			}		}	}	public int getrNum() {		return rNum;	}	public void setrNum(int rNum) {		if(!isLeaf){			throw new UnsupportedOperationException();		}		this.rNum = rNum;	}	public int getgNum() {		return gNum;	}	public void setgNum(int gNum) {		if(!isLeaf){			throw new UnsupportedOperationException();		}		this.gNum = gNum;	}	public int getbNum() {		return bNum;	}	public void setbNum(int bNum) {		if(!isLeaf){			throw new UnsupportedOperationException();		}		this.bNum = bNum;	}	public int getPiexls() {		return piexls;	}	public void setPiexls(int piexls) {		if(!isLeaf){			throw new UnsupportedOperationException();		}		this.piexls = piexls;	}	public int getDepth() {		return depth;	}	// 返回節點原有的子節點數量	public int mergerLeafNode(){		if(this.isLeaf){			return 1;		}		this.setLeaf(true);		int rNum = 0;		int gNum = 0;		int bNum = 0;		int pixel = 0;		int i = 0;		for (Node child : this.children) {			if(child == null){				continue;			}			rNum += child.getrNum();			gNum += 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;		return i;	}	// 獲取最深層次的node	public 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);			}		}		return null;	}	// 獲取葉子節點的數量	public int 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 depth) {		this.depth = depth;	}	public Node getParent() {		return parent;	}	public void setParent(Node parent) {		this.parent = parent;	}	public Node[] getChildren() {		return children;	}	public Node getChild(int index){		return children[index];	}	public void setChild(int index, Node node){		children[index] = node;	}	public Boolean isLeaf() {		return isLeaf;	}	public void setPixel(int r, int 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 add8Bite2Root(int _taget, int _speed){		if(depth != 0 || this.parent != null){			throw new UnsupportedOperationException();		}		int speed = 7 + 1 - _speed;		int r = _taget >> 16 & 0xFF;		int g = _taget >> 8 & 0xFF;		int b = _taget & 0xFF;		Node proNode = this;		for (int i=7;i>=speed;i--){			int item = ((r >> i & 1) << 2) + ((g >> i & 1) << 1) + (b >> i & 1);			Node child = proNode.getChild(item);			if(child == null){				child = new Node();				child.setDepth(8-i);				child.setParent(proNode);				child.afterSetParam();				this.levelMapping.get(child.getDepth()).add(child);				proNode.setChild(item, child);			}			if(i == speed){				child.setLeaf(true);			}			if(child.isLeaf()){				child.setPixel(r, g, b);				break;			}			proNode = child;		}	}	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.printStackTrace();		}		fillArray(root, result, 0);		int i = 0;		for (byte byte1 : result) {			byteArray[i++] = byte1;		}		return byteArray;	}	private static void fillArray(Node node, List<byte> result, int offset){		if(node == null){			return;		}		if(node.isLeaf()){			result.add((byte) (node.getrNum() / node.getPiexls()));			result.add((byte) (node.getgNum() / node.getPiexls()));			result.add((byte) (node.getbNum() / node.getPiexls()));		} else{			for (Node child : node.getChildren()) {				fillArray(child, result, offset);			}		}	}}

可憐我大學唯二掛的數據結構。代碼實現的只是八叉樹,對一個1920*1080圖片量化,耗時大概是450ms,如果層次-2的話大概是100ms左右。

好吧,這篇就這樣吧,本來寫之前,感覺自己想說的挺多的,結果寫的時候就不知道怎么說了,大家見諒。

總結

以上就是本文關于java簡單實現八叉樹圖像處理代碼示例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美视频不卡中文| 国产精品欧美亚洲777777| 国产精品高潮在线| 美女福利视频一区| 日韩大片在线观看视频| 日韩欧美在线一区| 国产激情999| 奇米4444一区二区三区| 精品久久久久久| 精品国产乱码久久久久久天美| 在线视频免费一区二区| 精品国产一区二区三区久久久| 国产精品1234| 亚洲国语精品自产拍在线观看| 精品国产一区二区三区久久久狼| 国产精品免费视频xxxx| 亚洲第一av在线| 国产精品www| 中文字幕欧美专区| 91精品国产成人www| 2020欧美日韩在线视频| 亚洲电影免费观看高清完整版在线| 日本一区二区三区在线播放| 亚洲深夜福利视频| 456国产精品| 黄色精品一区二区| 成年人精品视频| 一区二区欧美日韩视频| 亚洲国产女人aaa毛片在线| 欧美成人精品一区二区| 精品激情国产视频| 国产精品久久久久久久av电影| 久久精品免费电影| 日韩精品免费在线播放| 亚洲国产日韩一区| 欧美亚洲另类制服自拍| 欧美日韩国产精品一区二区三区四区| 日韩av影片在线观看| 国产日韩欧美在线看| 日韩av一区二区在线| 日韩av不卡电影| 久久九九国产精品怡红院| 亚洲第一中文字幕| 亚洲一级片在线看| 日韩av在线免费看| 亚洲天堂免费在线| 亚洲一区二区三区四区在线播放| 久久人人爽人人爽人人片av高请| 韩剧1988免费观看全集| 国产在线视频欧美| 欧美猛交ⅹxxx乱大交视频| 亚洲男人7777| 亚洲男人第一网站| 欧美区二区三区| 亚洲精品久久久久久久久久久久久| 欧美猛男性生活免费| 91在线中文字幕| 中文字幕视频一区二区在线有码| 日韩精品免费在线视频观看| 精品亚洲一区二区三区在线播放| 国产91精品最新在线播放| 青青在线视频一区二区三区| 在线播放国产一区中文字幕剧情欧美| 国产精品极品尤物在线观看| 国产精品吴梦梦| 亚洲天堂免费视频| 亚洲精品免费av| 亚洲va久久久噜噜噜| 国产日韩欧美视频在线| 欧美成人免费在线观看| 欧美日韩另类在线| 精品香蕉一区二区三区| 欧美体内谢she精2性欧美| 91精品国产高清久久久久久91| 国产精品v日韩精品| 日韩中文字幕免费视频| 国产91精品高潮白浆喷水| 日韩中文字幕网站| 久久久久久久久网站| 日韩欧美亚洲范冰冰与中字| 91网站免费观看| 都市激情亚洲色图| 亚洲一区二区三区成人在线视频精品| 国产成人精品优优av| 亚洲丁香久久久| 亚洲成av人乱码色午夜| 最近中文字幕日韩精品| 日韩精品在线免费| 亚洲毛片在线观看.| zzjj国产精品一区二区| 91禁外国网站| 亚洲人成在线播放| 欧美精品videossex性护士| 国产激情视频一区| 国产精品99免视看9| 欧美日韩午夜激情| 日韩亚洲第一页| 国产玖玖精品视频| 国产日韩欧美日韩大片| 一区二区三区久久精品| 57pao国产精品一区| 日产精品久久久一区二区福利| 91美女片黄在线观看游戏| 国产精品入口日韩视频大尺度| 日韩高清人体午夜| 日韩欧美a级成人黄色| 国产精品香蕉在线观看| 亚洲欧美视频在线| 欧美国产日韩一区二区在线观看| 国产精品男女猛烈高潮激情| 色午夜这里只有精品| 成人国产在线视频| 国产精品精品久久久| 在线观看国产精品日韩av| 亚洲国产精品成人va在线观看| 成人免费激情视频| 亚洲综合最新在线| 日韩欧美在线播放| 亚洲第一二三四五区| 欧美精品性视频| 国产91热爆ts人妖在线| 日韩二区三区在线| 色琪琪综合男人的天堂aⅴ视频| 欧美丰满少妇xxxx| 国产美女精品免费电影| 欧美电影在线免费观看网站| 狠狠色狠色综合曰曰| 成人h片在线播放免费网站| 欧美一级在线播放| 欧美肥老妇视频| 久久久999国产精品| 国产成人亚洲综合91精品| 亚洲а∨天堂久久精品喷水| 色综合久久88色综合天天看泰| 久久精品国产69国产精品亚洲| 啊v视频在线一区二区三区| 亚洲一区二区中文| 欧美综合在线观看| …久久精品99久久香蕉国产| 亚洲最大福利网站| 国产精品久久久久久久久借妻| 91成品人片a无限观看| 全球成人中文在线| 久久不射热爱视频精品| 亚洲人成电影网站色xx| 亚洲人成网站色ww在线| 欧美综合国产精品久久丁香| 91九色在线视频| 亚洲第一页在线| 精品在线小视频| 亚洲乱码国产乱码精品精| 亚洲第一av网站| 久久久欧美精品| 色综合男人天堂| 欧美老少做受xxxx高潮| 亚洲成**性毛茸茸| 亚洲专区中文字幕| 国产mv免费观看入口亚洲| 久久精品国产免费观看| 日韩成人在线观看| 久久久久久999| 日韩有码在线电影| 日韩精品久久久久久久玫瑰园| 欧美最顶级的aⅴ艳星|