كيف أحصل على خوارزمية ملء الفيضان للتعامل مع الدوائر المغلقة؟

StackOverflow https://stackoverflow.com/questions/1816809

  •  08-07-2019
  •  | 
  •  

سؤال

لديّ تطبيق يقبل الصور كمدخلات ويزيل الخلفية التي تم التقاط الصورة عليها. على سبيل المثال ، إذا قمت بتمرير صورة لكتاب على بطانية ، فستكون الصورة الناتجة مجرد كتاب ذي خلفية شفافة.

المشكلة التي أواجهها هي عند إدخال صورة تحتوي على مساحة فارغة كبيرة فيها ، على سبيل المثال نطاق مرن. تبدأ خوارزمية Floodfill من زوايا الصورة وتزيل خلفية الصورة ، ولكنها بالطبع لا تجعلها في الجزء الداخلي من النطاق المرن.

هل هناك طريقة لتنفيذ هذا بحيث يمكنني التقاط صورة لدائرة مغلقة على خلفية وأعود الحلقة نفسها ، مع عدم وجود خلفية داخلها أو خارجها؟

هل كانت مفيدة؟

المحلول

هذا السؤال, وتتناول إجاباتها مشكلة مشابهة جدًا.

نصائح أخرى

يمكنك دائمًا إعادة تشكيل الصورة بعد كل ملء الفيضان ، وإعادة تشغيلها كلما وجدت لونًا يطابق الخلفية الأصلية.

تم تصميم خوارزميات تعبئة الفيضان لتبدأ في بقعة واحدة ، ومن هناك تملأ منطقة محدودة ، وهي منطقة ذات ألوان مماثلة. لا تتطابق الدائرة إلى لون الخلفية ، وبالتالي فإن خوارزمية التعبئة لا "تقفز" للعثور على الآخرين.

الحل هو إغراق المناطق المختلفة.

إليكم خوارزمية تعبئة الفيضان البطيئة للغاية ، المتكررة ، (من الذاكرة ، غير المختبرة):

public void floodfill(Image img, int x, int y, Color oldColor, Color newColor) {
    // Check boundary
    if (img.contains(x, y)) {
        // Get current pixel color
        Color currentColor = img.getColor(x, y);
        // Check color match
        if (currentColor.equals(oldColor)) {
            // Set to new color
            img.setColor(x, y, newColor);

            // Start again on each of the neighbors
            floodFill(img, x - 1, y, oldColor, newColor);
            floodFill(img, x + 1, y, oldColor, newColor);
            floodFill(img, x, y - 1, oldColor, newColor);
            floodFill(img, x, y + 1, oldColor, newColor);
        }
    }
}

يمكنك معرفة ماهية اللون السائد للخلفية (والتي يجب أن تكون قادرًا على القيام بها لأنك قادر على إزالة الخلفية التي تبدأ من الزوايا) والبحث عن هذا اللون في كل مكان في الصورة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top