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


2 Answers

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

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

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

Question

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

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

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




إذا كنت لا تزال تبحث عن إجابة ، فإليك ما نجح في ذلك ، وإن لم يكن ناجعًا بشكل فظيع:

from PIL import Image

def compute_average_image_color(img):
    width, height = img.size

    r_total = 0
    g_total = 0
    b_total = 0

    count = 0
    for x in range(0, width):
        for y in range(0, height):
            r, g, b = img.getpixel((x,y))
            r_total += r
            g_total += g
            b_total += b
            count += 1

    return (r_total/count, g_total/count, b_total/count)

img = Image.open('image.png')
#img = img.resize((50,50))  # Small optimization
average_color = compute_average_image_color(img)
print(average_color)



أدناه مثال 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();
}



Related