Python - البحث عن اللون السائد / الأكثر شيوعًا في الصورة


Answers

لدى Python Imaging Library أسلوب getcolors على كائنات الصور:

im.getcolors () => قائمة من (عدد ، لون) tuples أو لا شيء

أعتقد أنه لا يزال بإمكانك محاولة تغيير حجم الصورة قبل ذلك ومعرفة ما إذا كان أداءها أفضل.

Question

أبحث عن طريقة للعثور على اللون / النغمة الأكثر استخدامًا في صورة ما باستخدام python. إما متوسط ​​الظل أو أكثر شيوعًا من RGB سوف يفعل. نظرت إلى مكتبة Python Imaging ، ولم أتمكن من العثور على أي شيء يتعلق بما كنت أبحث عنه في دليل المستخدم ، وكذلك لفترة وجيزة في VTK.

لكنني وجدت برنامج نصي PHP الذي يفعل ما أحتاج ، هنا (تسجيل الدخول مطلوب للتحميل). يبدو أن البرنامج النصي يقوم بتغيير حجم الصورة إلى 150 * 150 ، لإظهار الألوان السائدة. ومع ذلك ، بعد ذلك ، أنا فقدت إلى حد كبير. لقد فكرت في كتابة شيء من شأنه تغيير حجم الصورة إلى حجم صغير ، ثم تحقق من كل بكسلات أخرى أو صورتها ، على الرغم من أنني أتخيل أن هذا سيكون غير فعال للغاية (على الرغم من أن تنفيذ هذه الفكرة قد تكون وحدة C python نموذجًا).

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




للإضافة إلى إجابة بطرس ، إذا كان PIL يعطيك صورة مع الوضع "P" أو إلى حد كبير أي وضع غير "RGBA" ، فأنت بحاجة إلى تطبيق قناع ألفا لتحويله إلى RGBA. يمكنك القيام بذلك بسهولة مع:

if im.mode == 'P':
    im.putalpha(0)



أدناه مثال c ++ Ct تستند إلى تخمين لون الصورة السائد. يمكنك استخدام PyQt وترجمة نفس إلى Python المكافئ.

#include <Qt/QtGui>
#include <Qt/QtCore>
#include <QtGui/QApplication>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QPixmap pixmap("logo.png");
    QImage image = pixmap.toImage();
    QRgb col;
    QMap<QRgb,int> rgbcount;
    QRgb greatest = 0;

    int width = pixmap.width();
    int height = pixmap.height();

    int count = 0;
    for (int i = 0; i < width; ++i)
    {
        for (int j = 0; j < height; ++j)
        {
            col = image.pixel(i, j);
            if (rgbcount.contains(col)) {
                rgbcount[col] = rgbcount[col] + 1;
            }
            else  {
                rgbcount[col] = 1;
            }

            if (rgbcount[col] > count)  {
                greatest = col;
                count = rgbcount[col];
            }

        }
    }
    qDebug() << count << greatest;
    return app.exec();
}