ตอนนี้ฉันทำงานมาระยะหนึ่งแล้ว ฉันกำลังเขียนบล็อกเป็นครั้งแรก ฉันไม่รู้วิธีเขียน มาอ่านกันเถอะ โปรดแก้ไขฉันหากคุณมีคำที่ไม่ถูกต้อง
เมื่อเร็ว ๆ นี้มีการใช้ฟังก์ชั่นการบีบอัดภาพในการทำงาน ฉันพบเครื่องมือบางอย่าง แต่ไม่มีทางเลือกที่ดี ในที่สุดฉันเลือกคนที่ชื่อ Jdeli แต่ประสิทธิภาพก็กลายเป็นปัญหาอีกครั้ง ฉันไม่มีทางเลือกนอกจากต้องศึกษาซอร์สโค้ดของมัน แต่พบว่าฉันสนใจในอัลกอริทึมการลบเชิงปริมาณอย่างใดอย่างหนึ่ง อย่างไรก็ตามฉันอายที่ฉันไม่เข้าใจว่ามันกำลังเขียนอะไรเลยดังนั้นฉันจึงมีความคิดในการใช้อัลกอริทึมสีเชิงปริมาณด้วยตัวเอง
ฉันพบข้อมูลบางอย่างด้วยตัวเองและพบอัลกอริธึมการประมวลผลสีที่ใช้กันทั่วไปอีกสามรายการ:
อัลกอริทึมสียอดนิยม:
อัลกอริทึมที่เฉพาะเจาะจงคือการนับจำนวนครั้งที่สีทั้งหมดปรากฏขึ้นเป็นครั้งแรกเลือกสี 256 สีที่มีเหตุการณ์มากที่สุดเป็นสีของจานสีของภาพจากนั้นวนซ้ำผ่านพิกเซลทั้งหมดของภาพอีกครั้งค้นหาสีที่ใกล้เคียงที่สุดในจานสีแต่ละพิกเซล (ฉันใช้วิธีการแปรผันที่นี่ การใช้อัลกอริทึมนี้ค่อนข้างง่าย แต่การบิดเบือนค่อนข้างร้ายแรง ภาพบางภาพปรากฏที่ความถี่ต่ำ แต่เอฟเฟกต์ภาพต่อตามนุษย์ค่อนข้างชัดเจน ข้อมูลจะหายไป ตัวอย่างเช่นจุดที่มีความสว่างสูงในภาพอาจไม่ได้รับการคัดเลือกโดยอัลกอริทึมเนื่องจากมีจำนวนน้อยเกิดขึ้นและจะหายไป
อัลกอริทึมการหั่นเฉลี่ย:
ฉันยังไม่ได้ศึกษาอัลกอริทึมนี้ ผู้ที่ต้องการทราบสามารถอ่านบทความนี้ซึ่งมีการแนะนำอัลกอริทึมสามครั้ง
ต้นแปด
อัลกอริทึมนี้เป็นอัลกอริทึมสุดท้ายที่ฉันเลือก แนวคิดหลักของมันคือการแปลงค่าสี RGB ของภาพเป็นการกระจายไบนารีเป็น Octree ตัวอย่างเช่น (173,234,144)
ในการแปลงเป็นไบนารีคือ (10101101, 11101010, 10010000), นำบิตแรกของ R, G, B เป็นรูปแบบ (111) และทำหน้าที่เป็นโหนดเด็กของโหนดรูทโดยที่ 111 คือดัชนีของโหนดโหนดลูกบนสายปล่อย ดูภาพรายละเอียด
หนึ่งในสิ่งที่ฉันสับสนมากขึ้นคือกลยุทธ์การผสานของโหนดใบไม้ วิธีที่โง่ที่สุดที่ฉันใช้ที่นี่คือการค้นหาโหนดที่ลึกที่สุดแล้วรวมเข้าด้วยกัน มันค่อนข้างง่ายและหยาบ มีวิธีอื่น ๆ ที่ดีกว่า กรุณาฝากข้อความถึงฉัน ภาพมีขนาดใหญ่เกินไปและไม่สามารถอัปโหลดได้ดังนั้นฉันจึงอัปโหลดรหัส รหัสยังไม่ได้รับการปรับปรุงใหม่เพื่อให้ทุกคนสามารถอ่านได้
แพ็คเกจ com.gys.pngquant.octree; นำเข้า java.util.arraylist; นำเข้า java.util.hashmap; นำเข้า java.util.list; นำเข้า java.util.map;/** * * @classname ชื่อคลาส: Node * @description ฟังก์ชั่น *****************************************************</p>*/โหนดระดับสาธารณะ {ความลึก int ส่วนตัว = 0; // เมื่อเป็น 0 มันเป็นรูตโหนดส่วนตัว piexls = 0; แผนที่ส่วนตัว <จำนวนเต็ม, รายการ <node>> levelmapping; // เก็บความสัมพันธ์ระหว่างลำดับชั้นและโหนดสาธารณะ int int getrgbvalue () {int r = this.rnum / this.piexls; int g = this.gnum / this.piexls; b);} แผนที่สาธารณะ <จำนวนเต็ม, รายการ <Node>> getLevelMapping () {return levelmapping;} โมฆะสาธารณะ aftersetparam () {ถ้า (this.getParent () == null && this.depth == 0) {levelmapping.put (i, arraylist ใหม่ <node> ());}}} public int getrnum () {return rnum;} โมฆะสาธารณะ setrnum (int rnum) {ถ้า (! isleaf) setgnum (int gnum) {ถ้า (! isleaf) {โยน unsupportedoperationException ใหม่ ();} this.gnum = gnum;} สาธารณะ int getBnum () {return bnum;} void สาธารณะ setBnum (int bnum) {ถ้า (! getPiexls () {return piexls;} โมฆะสาธารณะ setpiexls (int piexls) {ถ้า (! isleaf) {โยน unsupportedoperationException ใหม่ ();} this.piexls = piexls; MergerLeafNode () {ถ้า (this.isleaf) {return 1;} this.setleaf (true); int rnum = 0; int gnum = 0; int bnum = 0; int pixel = 0; int i = 0; child.getGnum (); bnum += child.getBnum (); Pixel += child.getPiexls (); i += 1;} this.setrnum (rnum); this.setgnum (gnum); this.setbnum (bnum); Nodepublic Node getDepestNode () {สำหรับ (int i = 7; i> 0; i--) {list <node> levellist = this.levelmapping.get (i); ถ้า (! levellist.isempty () {return levellist.remove (levellist.size () getleafnum () {ถ้า (isleaf) {return 1;} int i = 0; สำหรับ (โหนดเด็ก: this.children) {ถ้า (เด็ก! = null) {i += child.getleafnum ();}} return i; setParent (โหนดพาเรนต์) {this.parent = parent;} โหนดสาธารณะ [] getChildren () {return children;} โหนดสาธารณะ getChild (ดัชนี int) {return children [index];} โมฆะสาธารณะ setchild (int ดัชนี, โหนด) {children [ดัชนี] = node; b) {this.rnum += r; this.gnum += g; this.bnum += b; this.piexls += 1;} โมฆะสาธารณะ setleaf (บูลีน isleaf) {this.isleaf = isleaf; ใหม่ unsupportedOperationException ();} int speed = 7 + 1-_Speed; int r = _taget >> 16 & 0xff; int g = _taget >> 8 & 0xff; int b = _taget & 0xff; node pronode = this; สำหรับ (int i = 7; I & 1) << 1) + (b >> i & 1); โหนดเด็ก = pronode.getChild (รายการ); ถ้า (เด็ก == null) {child = new node (); child.setDepth (8-i); child.setparent (pronode); เด็ก);} if (i == ความเร็ว) {child.setleaf (true);} ถ้า (child.isleaf ()) {child.setpixel (r, g, b); break;} pronode = child;}} โหนดคงที่สาธารณะ สำหรับ (int [] แถว: matrix) {สำหรับ (int cell: row) {root.add8bite2root (เซลล์, ความเร็ว);}} ส่งคืนรูท;} ไบต์สาธารณะคงที่ [] mergecolors (node root, int maxcolors) {byte [] bytearray = new Byte = root.getleafnum (); ลอง {ในขณะที่ (leafnum> maxColors) {int mergerleafnode = root.getDepestNode (). Mergerleafnode (); leafnum - = (mergerleafnode - 1); : ผลลัพธ์) {bytearray [i ++] = byte1;} ส่งคืน bytearray;} โมฆะคงที่แบบคงที่ส่วนตัว fillarray (โหนดโหนด, รายการ <byte> ผลลัพธ์, int onfset) {ถ้า (node == null) {return;} if (node.isleaf () node.getPiexls ())); result.add ((byte) (node.getGnum () / node.getPiexls ())); add.Add ((ไบต์) (node.getBnum () / node. ); อื่น {สำหรับ (โหนดเด็ก: node.getChildren ()) {fullArray (ลูก, ผลลัพธ์, ออฟเซ็ต);}}}}}}แย่โครงสร้างข้อมูลเดียวของฉันในวิทยาลัย รหัสใช้ Octree เท่านั้น ใช้เวลาประมาณ 450ms ในการหาปริมาณภาพ 1920*1080 และถ้าระดับ -2 มันจะอยู่ที่ประมาณ 100ms
โอเคมันแค่ไหน ก่อนที่ฉันจะเขียนมันฉันรู้สึกว่าฉันอยากจะพูดมาก แต่ฉันไม่รู้ว่าจะพูดอะไรเมื่อฉันเขียนมัน โปรดยกโทษให้ฉัน
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการใช้งานรหัสการประมวลผลภาพ Octree อย่างง่ายของ Java ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!