لقد كنت أعمل لفترة من الوقت الآن. أنا أكتب مدونة لأول مرة. لا أعرف كيف أكتبها. دعنا نقرأها فقط. الرجاء تصحيح لي إذا كان لديك أي كلمات غير صحيحة.
في الآونة الأخيرة ، تم استخدام وظيفة ضغط الصورة في العمل. لقد وجدت بعض الأدوات ، لكن لم يكن هناك خيار جيد. أخيرًا ، اخترت شخصًا يدعى Jdeli ، لكن الكفاءة أصبحت مشكلة مرة أخرى. لم يكن لدي أي خيار سوى دراسة رمز المصدر الخاص بها ، لكنني وجدت أنني مهتم بأحد خوارزميات تحديد الكميات الطرفية. ومع ذلك ، شعرت بالحرج من أنني لم أفهم ما كانت تكتبه على الإطلاق ، لذلك كان لدي فكرة عن تنفيذ خوارزمية ألوان كمية بنفسي.
لقد وجدت بعض المعلومات بنفسي ووجدت ثلاث خوارزميات معالجة الألوان أكثر شيوعًا:
خوارزمية الألوان الشعبية:
تتمثل الخوارزمية المحددة أولاً في حساب عدد المرات التي تظهر فيها جميع الألوان في صورة ما ، وتحديد اللون 256 مع معظم الأحداث مثل لون لوحة الصورة ، ثم التكرار من خلال جميع وحدات البكسل من الصورة مرة أخرى ، والعثور على أقرب لون في اللوحة لكل بكسل (أنا أستخدم طريقة التباين هنا) ، واكتبها إلى الصورة. إن تنفيذ هذه الخوارزمية بسيط نسبيًا ، لكن التشويه خطير نسبيًا. تظهر بعض الصور بتردد منخفض ، لكن التأثير البصري على العين البشرية واضح تمامًا. سيتم فقد المعلومات. على سبيل المثال ، قد لا يتم اختيار البقع ذات السحر المرتفع في الصورة بواسطة الخوارزمية بسبب عدد قليل من الأحداث وسيضيع.
خوارزمية تقطيع متوسط:
لم أدرس هذه الخوارزمية. يمكن لأولئك الذين يرغبون في معرفته قراءة هذا المقال ، والذي يحتوي على مقدمات لثلاث خوارزميات.
شجرة أوكتاف
هذه الخوارزمية هي الخوارزمية الأخيرة التي اخترتها. فكرتها الرئيسية هي تحويل قيمة لون RGB للصورة إلى توزيع ثنائي إلى Octree ، على سبيل المثال: (173،234،144)
للتحويل إلى الثنائي هو (10101101 ، 11101010 ، 10010000) ، قم بإخراج الأجزاء الأولى من R ، G ، B ، B إلى النموذج (111) ، وتكون بمثابة العقد الفرعية لعقدة الجذر ، حيث 111 هو مؤشر مجموعة العقدة الجذرية ، وما إلى ذلك ، حتى آخر شيء ، ثم تخزين قيمة المكونات لهذا اللون وعملية الحدوث في أوراق الأوراق. انظر الصورة للحصول على التفاصيل.
أحد الأشياء التي أشعر بالارتباك أكثر هي استراتيجية دمج العقد الأوراق. أغبى طريقة أستخدمها هنا هي العثور على أعمق العقدة ثم الاندماج. انها بسيطة بعض الشيء وخام. هناك طرق أخرى أفضل. من فضلك اترك لي رسالة. الصورة كبيرة جدًا ولا يمكن تحميلها ، لذلك أقوم فقط بتحميل الكود. لم يتم إعادة تمثيل الكود ، حتى يتمكن الجميع من قراءته.
package com.gys.pngquant.octree ؛ استيراد java.util.arraylist ؛ استيراد java.util.hashmap ؛ استيراد java.util.list ؛ استيراد java.util.map ؛/** * * @classname اسم الفئة: node * description discription الوصف: * <p> procet tree enderation * </p> * * * * * ***********************************************************</p>*/node class public {private int depth = 0 ؛ piexls = 0 ؛ خريطة خاصة <integer ، قائمة <Node>> levelmapping ؛ // تخزين العلاقة بين التسلسل الهرمي والعقدة العامة int getrgbvalue () {int r = this.rnum / this.piexls ؛ int g = this.gnum / this.piexls ؛ int b = this.bnum / this.piexls ؛ ب) ؛} الخريطة العامة <integer ، قائمة <Node>> getLevelMapping () {return listermapping ؛} public void effsetparam () {if (this.getParent () == null && this.depth == 0) {LevelMapping.put (i ، ArrayList جديد <Node> ()) ؛}}} public int getRnum () {return rnum ؛} public void setrnum (int rnum) {if (! isLeaf) {throw unsuportedoperationexception () ؛} this.rnum = rnum ؛}} setgnum (int gnum) {if (! isLeaf) {رمي جديد UnsupportedOperationException () ؛} هذا. getPiexls () {return piexls ؛} public void setPiexls (int piexls) {if (! isLeaf) {رمي new UnsupportedOperationException () ؛} this.piexls = piexls ؛ 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 (ild == null) {conter ؛ child.getgnum () ؛ bnum += child.getBnum () ؛ pixel += child.getPiexls () ؛ i += 1 ؛} this.setrnum (rnum) ؛ this.setgnum (gnum) ؛ this.setbnum (bnum) ؛ this.setpiexls (pixel) ؛ getDepestNode () {for (int i = 7 ؛ i> 0 ؛ i--) {list <Node> levellist = this.levelmapping.get (i) ؛ if (! levellist.isempty ()) getleafnum () {if (isLeaf) {return 1 ؛} int i = 0 ؛ for (node child: this.children) {if (child! = null) {i += child.getleafnum () ؛ setParent (Node Parent) {this.parent = parent ؛} node public [] getChildren () {return Kids ؛} node getChild (int index) {return children [index] ؛} public void setChild (int index ، int int int ind (index] = node ؛ ب) {this.rnum += r ؛ this.gnum += g ؛ this.bnum += b ؛ this.piexls += 1 ؛} public void setleaf (boolean 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 ؛ & 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 () ؛ child) ؛} if (i == speed) {child.setLeaf (true) ؛} if (child.isleaf ()) {child.setpixel (r ، g ، b) ؛ break ؛} pronode = child ؛}} بناء عقدة ثابتة عامة (int [] matrix ، int ape) {node root = new node () لـ (int [] الصف: المصفوفة) {for (int cell: row) {root.addd8bite2root (cell ، speed) ؛}} return root ؛} البايت الثابت العام [] = root.getleafnum () ؛ حاول {بينما (leafnum> maxcolors) {int mergerleafnode = root.getDepestNode (). : النتيجة) {bytearray [i ++] = byte1 ؛} إرجاع bytearray ؛} fillarray static private static (Node Node ، list <Byte> ، int stompset) {if (node == null) {return ؛} if (node.isleaf () {result.add node.getpiexls ()))) ؛ result.add ((byte) (node.getgnum () / node.getpiexls ())) ؛ result.add ((byte) (node.getBnum () / node.getpiexls ())) ؛ آخر {for (Node Child: Node.getChildren ()) {fillarray (طفل ، نتيجة ، إزاحة) ؛}}}}}فقير بنية البيانات الخاصة بي الوحيدة في الكلية. الرمز ينفذ فقط Octree. يتطلب الأمر حوالي 450 مللي ثانية لتحديد صورة 1920*1080 ، وإذا كان المستوى -2 ، فهو حوالي 100 مللي ثانية.
حسنًا ، هذا كل شيء. قبل أن أكتبها ، شعرت أنني أردت أن أقول الكثير ، لكنني لم أكن أعرف ماذا أقول عندما كتبت ذلك. رجائاً أعطني.
لخص
ما ورد أعلاه هو كل محتوى هذه المقالة حول تطبيق Java البسيط لأمثلة رمز معالجة صور Octree ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!