সামঞ্জস্যতা / পার্থক্যের জন্য কীভাবে দুটি রঙের তুলনা করা যায়


171

আমি এমন একটি প্রোগ্রাম ডিজাইন করতে চাই যা ৫ টি প্রাক-সংজ্ঞায়িত রঙগুলির মধ্যে যা আমাকে একটি ভেরিয়েবল রঙের সাথে আরও বেশি মিল এবং কত শতাংশের সাথে তা নির্ধারণ করতে সহায়তা করতে পারে। জিনিসটি হ'ল আমি জানি না কীভাবে ম্যানুয়ালি এই পদক্ষেপটি করতে হবে। সুতরাং একটি প্রোগ্রাম চিন্তা করা আরও কঠিন।

আরও বিশদ: রঙগুলি বিভিন্ন রঙ হিসাবে জেলযুক্ত নলগুলির ফটোগ্রাফ থেকে। আমার কাছে বিভিন্ন রঙের সাথে 5 টি টিউব রয়েছে প্রতিটি 5 টির মধ্যে 1 টি প্রতিনিধি। আমি অন্যান্য নমুনার ফটোগ্রাফ নিতে চাই এবং কম্পিউটারে রঙের তুলনা করে সেই নমুনাটি কোন স্তরের অন্তর্ভুক্ত তা নির্ধারণ করতে চাই এবং আমি এটিও জানতে পারি যে শতকরা প্রায় এক শতাংশও। আমি এমন একটি প্রোগ্রাম চাই যা এই জাতীয় কিছু করে: http://www.colortools.net/color_matcher.html

আপনি যদি আমাকে বলতে পারেন তবে কী পদক্ষেপ নিতে হবে, এমনকি যদি সেগুলি আমার নিজের মতো করে ভাবতে ও করার জিনিস। এটা খুবই সহায়ক হবে।


1
আমি পাঠ্যটিতে একটি সামান্য পরিবর্তন করেছি, পর্তুগিজ শব্দটি পরিবর্তন করে যা আমার কাছে সঠিক ইংরেজী সমতুল্য বলে মনে হয় ... আমি ভুল হয়ে গেলে এটিকে আবার পরিবর্তন করুন।
বেসকা

13
আছে: রঙ পার্থক্য সম্পর্কে উইকিপিডিয়া নিবন্ধ en.wikipedia.org/wiki/Color_difference
Ocaso Protal

4
এটি আকর্ষণীয় হওয়া উচিত: stevehanov.ca/blog/index.php?id=116 এটি তিনটি ভিন্ন রঙের মডেলের মধ্যে পার্থক্যটির সন্ধান করে।
ভ্লাদ

আরে @ ওকাসোপ্রোটাল, এটি ভাগ করে নেওয়ার জন্য একটি দুর্দান্ত লিঙ্ক ধন্যবাদ। এবং ওপি, আকর্ষণীয় প্রশ্ন।
উপলব্ধি

কোনও সম্ভাব্য ফটোগ্রাফিক ভেরিয়েবলিটিও হ্রাস করার চেষ্টা করুন ... নীচে উত্তরে আরও বিশদ।
বেসকা

উত্তর:


130

ডান দিকের জন্য রঙের পার্থক্য সম্পর্কিত উইকিপিডিয়ায় নিবন্ধটি দেখুন । মূলত, আপনি কয়েকটি বহুমাত্রিক রঙিন স্থানে একটি দূরত্বের মেট্রিক গণনা করতে চান। তবে আরজিবি "বুদ্ধিমানভাবে অভিন্ন" নয়, সুতরাং ভাদিমের পরামর্শ অনুসারে আপনার ইউক্লিডিয়ান আরজিবি দূরত্বের মেট্রিক রঙের মধ্যে মানব-অনুভূত দূরত্বের সাথে মেলে না। শুরু করার জন্য, L a b * একটি ধারণক্ষেত্রের মতো ইউনিফর্ম কালার স্পেস হিসাবে চিহ্নিত এবং ডেল্টা মেট্রিকটি সাধারণত ব্যবহৃত হয়। তবে আরও পরিশ্রুত রঙিনক্ষেত্র এবং আরও পরিশ্রুত ব-দ্বীপ সূত্র রয়েছে যা মানুষের উপলব্ধির সাথে মিলিয়ে যায়।

রূপান্তরগুলি করতে আপনাকে রঙের স্থান এবং আলোকসজ্জা সম্পর্কে আরও শিখতে হবে। কিন্তু একটি দ্রুত সূত্র ইউক্লিডিয় আরজিবি মেট্রিক বেশী ভালো জন্য, শুধু কি এই: অনুমান আপনার আরজিবি মান জগৎ colorspace আছে, এল যাও জগৎ খুঁজে একটি , বি * রূপান্তর সূত্র এল আপনার জগৎ রং রূপান্তর একটি খ *, এবং আপনার দুটি এল a বি * মানগুলির মধ্যে গণনা করুন ডেলটাই । এটি গণনামূলকভাবে ব্যয়বহুল নয়, এটি কেবলমাত্র কিছু ননলাইনার সূত্র এবং কিছু গুণক এবং যোগ।


11
"ডেল্টা" এর জন্য +1, এটি সর্বাধিক মানযুক্ত তুলনা পদ্ধতি এবং বিভিন্ন ব্যবহারের ক্ষেত্রে ডেল্টা সূত্রের অভিযোজন রয়েছে।
মার্টিন হেনিংস

9
আপনি এখানে রূপান্তর সূত্রগুলি খুঁজে পেতে পারেন: brucelindbloom.com/index.html?Equations.html
গিলারমো

4
অথবা, আপনি যদি রুবিতে কাজ করছেন, অন্য রঙের ক্রিয়াকলাপগুলির মধ্যে ডেল্টা প্রয়োগ করে এমন colorরত্নটি দেখুন
মাইক জারেমা

জাভাস্ক্রিপ্ট gist.github.com/ryancat/9972419b2a78f329ce3aebb7f1a09152
Ryan.C

46

আমার মনে প্রথম একটি ধারণা এসেছিল (দুঃখিত যদি নির্বোধ)) রঙের তিনটি উপাদানকে পয়েন্টের 3 ডি স্থানাঙ্ক হিসাবে ধরে নেওয়া যায় এবং তারপরে আপনি পয়েন্টগুলির মধ্যে দূরত্ব গণনা করতে পারেন।

ফাঃ

Point1 has R1 G1 B1
Point2 has R2 G2 B2

রঙের মধ্যে দূরত্ব

d=sqrt((r2-r1)^2+(g2-g1)^2+(b2-b1)^2)

শতাংশ হয়

p=d/sqrt((255)^2+(255)^2+(255)^2)

28
আমরা যদি আরজিবি রঙের স্থানটি 2 রঙের মধ্যে পার্থক্যটি ব্যবহার করি তবে মানুষ তার পার্থক্যটি কীভাবে উপলব্ধি করতে পারে তার মতো নয়। তবে হ্যাঁ, মূল ধারণাটি সর্বত্র একরকম - আমাদের কেবল এটি অন্য রঙের জায়গাতে ম্যাপ করতে হবে (আমি যে ল্যাব মনে করি)
ভু

6
@ ভু: আমি সম্মত, এইচএসভি / এইচএসএল / ল্যাব দূরত্ব-ভিত্তিক মিলের জন্য আরজিবি থেকে তুলনামূলকভাবে আরও ভাল রঙ স্পেস হতে পারে।
জন পূর্ব ২

4
এটি কীভাবে দুটি দুটি রঙের হয় তা আপনাকে বলার একটি ভাল উপায় তবে তারা কীভাবে আলাদা থাকবে তা আপনাকে জানানোর একটি দুর্বল কাজ। মানুষের চোখগুলি নিখুঁত থেকে দূরে: আমরা লাল বা নীল থেকে সবুজ রঙের প্রতি বেশি সংবেদনশীল, আমাদের উজ্জ্বলতা উপলব্ধি লোগারিডমিক ইত্যাদি OP তবে মানুষের দৃষ্টির জন্য বিশেষভাবে তৈরি অ্যালগরিদমের জন্য এখানে দেখুন
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

এটি আমার প্রথম ধারণা।
এসটি 3

9
এখানে অন্য সমস্যাটি হল 255, 0, 0 0, 255, 0 থেকে একই দূরত্ব যেমন 0, 0, 255

27

কয়েক মাস আগে আমি একই পথে হাঁটলাম। প্রশ্নের সঠিক কোনও উত্তর নেই (যা এখানে বেশ কয়েকবার জিজ্ঞাসা করা হয়েছিল ) তবে এর পরে আরও একটি পরিশীলিত স্কয়ার্ট (আরআর) ইত্যাদি উত্তর রয়েছে এবং সমস্ত ধরণের বিকল্প রঙের স্পেসে না গিয়ে আরজিবিতে সরাসরি অভিব্যক্ত করা আরও সহজ। আমি এই সূত্রটি এখানে পেয়েছি যা বেশ জটিল বাস্তব সূত্রের স্বল্প ব্যয় হিসাবে অনুমান করা হয় (সিআইই দ্বারা বর্ণের ডাব্লু 3 সি, যেহেতু এটি একটি সমাপ্ত অনুসন্ধান নয়, আপনি সেখানে পুরানো এবং সাধারণ রঙের পার্থক্য সমীকরণগুলি খুঁজে পেতে পারেন)। শুভকামনা

সম্পাদনা: উত্তরোত্তর জন্য, এখানে প্রাসঙ্গিক সি কোড রয়েছে:

typedef struct {
     unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
    long rmean = ( (long)e1.r + (long)e2.r ) / 2;
    long r = (long)e1.r - (long)e2.r;
    long g = (long)e1.g - (long)e2.g;
    long b = (long)e1.b - (long)e2.b;
    return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}

এই পদ্ধতিটি আমার পক্ষে কাজ করেছিল। এটি আমাকে রঙের নামের তালিকা থেকে নিকটতম রঙ খুঁজতে সহায়তা করেছে।
ফয়সালভাগত

23

রঙের মানটির একাধিক মাত্রা থাকে, সুতরাং দুটি রঙের তুলনা করার কোনও অভ্যন্তরীণ উপায় নেই। আপনাকে আপনার ব্যবহারের ক্ষেত্রে রঙগুলির অর্থ এবং এর মাধ্যমে কীভাবে সর্বোত্তম তুলনা করতে হবে তা নির্ধারণ করতে হবে।

সম্ভবত আপনি রঙের হিউ, স্যাচুরেশন এবং / অথবা লাইটনেস বৈশিষ্ট্যগুলি লাল / সবুজ / নীল উপাদানগুলির সাথে তুলনা করতে চান। আপনি কীভাবে তাদের তুলনা করতে চান তা বুঝতে যদি সমস্যা হয়, কিছু জোড়া নমুনা রঙ নিন এবং তাদের মানসিকভাবে তুলনা করুন, তবে সেগুলি কেন অনুরূপ / ভিন্ন তা নিজেকে ন্যায্যতা / ব্যাখ্যা করার চেষ্টা করুন।

আপনি যে রঙগুলির বৈশিষ্ট্য / উপাদানগুলির সাথে তুলনা করতে চান তা একবার জানতে পারবেন, তারপরে আপনাকে কীভাবে রঙ থেকে সেই তথ্যটি বের করতে হবে তা নির্ধারণ করতে হবে।

সম্ভবত আপনাকে কেবল রেডগ্রাইন ব্লু প্রতিনিধিত্ব থেকে রঙটিকে হিউস্যাচুরেশন লাইটনেসে রূপান্তর করতে হবে এবং এর পরে এমন কিছু গণনা করতে হবে

avghue = (color1.hue + color2.hue)/2
distance = abs(color1.hue-avghue)

এই উদাহরণটি আপনাকে একটি সাধারণ স্কেলারের মান দেয় যা নির্দেশ করে যে রঙগুলির গ্রেডিয়েন্ট / রঙ একে অপরের থেকে কতটা দূরে।

উইকিপিডিয়ায় এইচএসএল এবং এইচএসভি দেখুন ।


2
এই জিনিসগুলি সম্পর্কে আমার বক্তৃতাগুলিতে আমার যে জিনিসগুলি মনে আছে সেগুলি থেকে আমি চিত্রটি ল্যাব রঙের জায়গাতে রূপান্তর করব এবং এইচএসভি / এইচএসএল নয়। যে বাছাইয়ের জন্য কোন যুক্তি?
ভু

নাঃ। আরজিবি এবং এইচএসএল হ'ল আমি যার সাথে সবচেয়ে বেশি পরিচিত, তাই এইচএসএলকে কেবলমাত্র "ডিফল্ট" আরজিবিই একমাত্র বিকল্প নয় - এই ধারণাটি আবেদনের উপর নির্ভর করে কেবল এই ধারণাটিকেই অধিকতর করতে আমি বেছে নিয়েছি। ল্যাব রঙের স্থান সম্পর্কে আমাকে জানানোর জন্য ধন্যবাদ।
13 ই

1
আমি আপনাকে যাইহোক +1 দিয়েছি কারণ এখানে মূল নীতিটি হ'ল "ডান" উত্তর (রঙের স্পেসে রূপান্তরিত যা অনুভূত পার্থক্যকে একত্রে পরিচালনা করে তারপরে তুলনা করুন)। আমি নিশ্চিত নই যে কোন স্থানটি সবচেয়ে ভাল হবে - এই সমস্ত রঙের স্পেসগুলি নরকের ইমো হিসাবে বিভ্রান্ত করছে;)
ভু

21

আপনার যদি দুটি Colorঅবজেক্ট থাকে c1এবং c2আপনি কেবল প্রতিটি আরজিবি মান এর c1সাথে তুলনা করতে পারেন c2

int diffRed   = Math.abs(c1.getRed()   - c2.getRed());
int diffGreen = Math.abs(c1.getGreen() - c2.getGreen());
int diffBlue  = Math.abs(c1.getBlue()  - c2.getBlue());

এই মানগুলি আপনি কেবল পার্থক্য সংশ্লেষের পরিমাণ দ্বারা ভাগ করতে পারেন (255), এবং আপনি উভয়ের মধ্যে পার্থক্য পাবেন।

float pctDiffRed   = (float)diffRed   / 255;
float pctDiffGreen = (float)diffGreen / 255;
float pctDiffBlue   = (float)diffBlue  / 255;

যার পরে আপনি শতাংশের মধ্যে গড় রঙের পার্থক্যটি সন্ধান করতে পারেন।

(pctDiffRed + pctDiffGreen + pctDiffBlue) / 3 * 100

কোনটি আপনি মধ্যে শতকরা মধ্যে একটি পার্থক্য দিতে হবে c1এবং c2


আরও 2 টি ছোট ছোট জিনিস: <b> 1 </b> pctDiffRed = diffRed / 255;আপনাকে 0 দিচ্ছে যদি না আপনি কোথাও কোনও ফ্লোটে না ফেলে। <b> 2 </b> শতাংশ পেতে আপনার কোথাও 100 টি গুণ করা দরকার।
ওয়াঘানড্রয়েড

18
এটি সেরা "দৃশ্যমান" পার্থক্যটি নাও দিতে পারে, যেহেতু মানুষের চোখের বর্ণের পরিবর্তন হয় ভিন্ন। বলা হচ্ছে, আমি অনুমান করছি এটি ঠিক সে যা খুঁজছিল, কারণ তিনি সম্ভবত পার্থক্যযুক্ত পার্থক্যের চেয়ে সমান পরিমাণে পার্থক্য খুঁজছেন। কেবল ভেবেছি এটি প্রাসঙ্গিক হলে বিবেচনা করার মতো কিছু হিসাবে আমি এখান থেকে বেরিয়ে এসেছি।
বেসকা

14

মানব উপলব্ধি দ্বারা দুটি রঙের তুলনা করার সেরা পদ্ধতির একটি হ'ল সিআইই 76। পার্থক্যটিকে ডেল্টা-ই বলা হয়। এটি যখন 1 এর কম হয় তখন মানুষের চোখ পার্থক্যটি চিনতে পারে না।

কালার ইউটিলিটিস (নীচের কোড) এর দুর্দান্ত রঙের ইউটিলিটিগুলি শ্রেণি রয়েছে, যার মধ্যে সিআইই 7676 তুলনা পদ্ধতি রয়েছে। এটি রচনা করেছেন জুরিখ বিশ্ববিদ্যালয় ড্যানিয়েল স্ট্রেবেল।

কালার ইউটিলস ক্লাস থেকে আমি পদ্ধতিটি ব্যবহার করি:

static double colorDifference(int r1, int g1, int b1, int r2, int g2, int b2)

আর 1, জি 1, বি 1 - প্রথম রঙের আরজিবি মান

আর 2, জি 2, বি 2 - আরজিবিতে দ্বিতীয় রঙটি তুলনা করতে চান ot

আপনি যদি অ্যান্ড্রয়েডের সাথে কাজ করেন তবে আপনি এই মানগুলি পেতে পারেন:

r1 = Color.red(pixel);

g1 = Color.green(pixel);

b1 = Color.blue(pixel);


ড্যানিয়েল স্ট্রেবেল, জুরিখ বিশ্ববিদ্যালয় দ্বারা রঙিন ইউটিস.ক্লাস:

import android.graphics.Color;

public class ColorUtil {
public static int argb(int R, int G, int B) {
    return argb(Byte.MAX_VALUE, R, G, B);
}

public static int argb(int A, int R, int G, int B) {
    byte[] colorByteArr = {(byte) A, (byte) R, (byte) G, (byte) B};
    return byteArrToInt(colorByteArr);
}

public static int[] rgb(int argb) {
    return new int[]{(argb >> 16) & 0xFF, (argb >> 8) & 0xFF, argb & 0xFF};
}

public static int byteArrToInt(byte[] colorByteArr) {
    return (colorByteArr[0] << 24) + ((colorByteArr[1] & 0xFF) << 16)
            + ((colorByteArr[2] & 0xFF) << 8) + (colorByteArr[3] & 0xFF);
}

public static int[] rgb2lab(int R, int G, int B) {
    //http://www.brucelindbloom.com

    float r, g, b, X, Y, Z, fx, fy, fz, xr, yr, zr;
    float Ls, as, bs;
    float eps = 216.f / 24389.f;
    float k = 24389.f / 27.f;

    float Xr = 0.964221f;  // reference white D50
    float Yr = 1.0f;
    float Zr = 0.825211f;

    // RGB to XYZ
    r = R / 255.f; //R 0..1
    g = G / 255.f; //G 0..1
    b = B / 255.f; //B 0..1

    // assuming sRGB (D65)
    if (r <= 0.04045)
        r = r / 12;
    else
        r = (float) Math.pow((r + 0.055) / 1.055, 2.4);

    if (g <= 0.04045)
        g = g / 12;
    else
        g = (float) Math.pow((g + 0.055) / 1.055, 2.4);

    if (b <= 0.04045)
        b = b / 12;
    else
        b = (float) Math.pow((b + 0.055) / 1.055, 2.4);


    X = 0.436052025f * r + 0.385081593f * g + 0.143087414f * b;
    Y = 0.222491598f * r + 0.71688606f * g + 0.060621486f * b;
    Z = 0.013929122f * r + 0.097097002f * g + 0.71418547f * b;

    // XYZ to Lab
    xr = X / Xr;
    yr = Y / Yr;
    zr = Z / Zr;

    if (xr > eps)
        fx = (float) Math.pow(xr, 1 / 3.);
    else
        fx = (float) ((k * xr + 16.) / 116.);

    if (yr > eps)
        fy = (float) Math.pow(yr, 1 / 3.);
    else
        fy = (float) ((k * yr + 16.) / 116.);

    if (zr > eps)
        fz = (float) Math.pow(zr, 1 / 3.);
    else
        fz = (float) ((k * zr + 16.) / 116);

    Ls = (116 * fy) - 16;
    as = 500 * (fx - fy);
    bs = 200 * (fy - fz);

    int[] lab = new int[3];
    lab[0] = (int) (2.55 * Ls + .5);
    lab[1] = (int) (as + .5);
    lab[2] = (int) (bs + .5);
    return lab;
}

/**
 * Computes the difference between two RGB colors by converting them to the L*a*b scale and
 * comparing them using the CIE76 algorithm { http://en.wikipedia.org/wiki/Color_difference#CIE76}
 */
public static double getColorDifference(int a, int b) {
    int r1, g1, b1, r2, g2, b2;
    r1 = Color.red(a);
    g1 = Color.green(a);
    b1 = Color.blue(a);
    r2 = Color.red(b);
    g2 = Color.green(b);
    b2 = Color.blue(b);
    int[] lab1 = rgb2lab(r1, g1, b1);
    int[] lab2 = rgb2lab(r2, g2, b2);
    return Math.sqrt(Math.pow(lab2[0] - lab1[0], 2) + Math.pow(lab2[1] - lab1[1], 2) + Math.pow(lab2[2] - lab1[2], 2));
}
}

উপরের কোডটি rgb2lab এ ত্রুটি রয়েছে: 12 দ্বারা বিভাগ দ্বারা 12,92 দ্বারা r, g এবং b রূপান্তরকে প্রতিস্থাপন করা উচিত। অন্যথায় ফাংশনটি r = 0.04045 এ অবিচ্ছিন্ন নয়
জন স্মিথ

10

আরও একটি উত্তর, যদিও এটি সুপারির অনুরূপ - ঠিক একটি ভিন্ন রঙের স্থান।

জিনিসটি হ'ল: মানুষ রঙের পার্থক্যটি অভিন্নভাবে উপলব্ধি করে এবং আরজিবি রঙের স্থান এটিকে উপেক্ষা করে। ফলস্বরূপ আপনি যদি আরজিবি রঙের স্থান ব্যবহার করেন এবং 2 রঙের মধ্যে কেবল ইউক্যালিডিয়ান দূরত্বটি গণনা করেন তবে আপনি একটি পার্থক্য পেতে পারেন যা গাণিতিকভাবে একেবারে সঠিক, তবে মানুষ আপনাকে যা বলবে তার সাথে মিলছে না।

এটি কোনও সমস্যা নাও হতে পারে - পার্থক্যটি এতটা বড় নয় বলে আমি মনে করি তবে আপনি যদি এই "আরও ভাল" সমাধান করতে চান তবে আপনার আরজিবি রঙগুলিকে এমন একটি বর্ণের জায়গায় রূপান্তর করতে হবে যা উপরের সমস্যাটি এড়াতে বিশেষভাবে ডিজাইন করা হয়েছিল। পূর্ববর্তী মডেলগুলির থেকে বেশ কয়েকটি রয়েছে, উন্নতি (যেহেতু এটি মানুষের উপলব্ধি উপর ভিত্তি করে আমাদের পরীক্ষামূলক তথ্যের উপর ভিত্তি করে "সঠিক" মান পরিমাপ করা প্রয়োজন)। এখানে ল্যাব রঙের স্থান রয়েছে যা আমি মনে করি সেরা হতে পারে যদিও এটি রূপান্তর করতে কিছুটা জটিল। সিম্পলটি সিআইই এক্সওয়াইজেড এক হবে।

এখানে এমন একটি সাইট যা সূত্রকে বিভিন্ন রঙের জায়গার মধ্যে রূপান্তর করতে তালিকাবদ্ধ করে যাতে আপনি কিছুটা পরীক্ষা করতে পারেন।


3

নীচের সমস্ত পদ্ধতি 0-100 থেকে স্কেলে ফলাফল দেয়।

internal static class ColorDifference
{
    internal enum Method
    {
        Binary, // true or false, 0 is false
        Square,
        Dimensional,
        CIE76
    }

    public static double Calculate(Method method, int argb1, int argb2)
    {
        int[] c1 = ColorConversion.ArgbToArray(argb1);
        int[] c2 = ColorConversion.ArgbToArray(argb2);
        return Calculate(method, c1[1], c2[1], c1[2], c2[2], c1[3], c2[3], c1[0], c2[0]);
    }

    public static double Calculate(Method method, int r1, int r2, int g1, int g2, int b1, int b2, int a1 = -1, int a2 = -1)
    {
        switch (method)
        {
            case Method.Binary:
                return (r1 == r2 && g1 == g2 && b1 == b2 && a1 == a2) ? 0 : 100;
            case Method.CIE76:
                return CalculateCIE76(r1, r2, g1, g2, b1, b2);
            case Method.Dimensional:
                if (a1 == -1 || a2 == -1) return Calculate3D(r1, r2, g1, g2, b1, b2);
                else return Calculate4D(r1, r2, g1, g2, b1, b2, a1, a2);
            case Method.Square:
                return CalculateSquare(r1, r2, g1, g2, b1, b2, a1, a2);
            default:
                throw new InvalidOperationException();
        }
    }

    public static double Calculate(Method method, Color c1, Color c2, bool alpha)
    {
        switch (method)
        {
            case Method.Binary:
                return (c1.R == c2.R && c1.G == c2.G && c1.B == c2.B && (!alpha || c1.A == c2.A)) ? 0 : 100;
            case Method.CIE76:
                if (alpha) throw new InvalidOperationException();
                return CalculateCIE76(c1, c2);
            case Method.Dimensional:
                if (alpha) return Calculate4D(c1, c2);
                else return Calculate3D(c1, c2);
            case Method.Square:
                if (alpha) return CalculateSquareAlpha(c1, c2);
                else return CalculateSquare(c1, c2);
            default:
                throw new InvalidOperationException();
        }
    }

    // A simple idea, based on on a Square
    public static double CalculateSquare(int argb1, int argb2)
    {
        int[] c1 = ColorConversion.ArgbToArray(argb1);
        int[] c2 = ColorConversion.ArgbToArray(argb2);
        return CalculateSquare(c1[1], c2[1], c1[2], c2[2], c1[3], c2[3]);
    }

    public static double CalculateSquare(Color c1, Color c2)
    {
        return CalculateSquare(c1.R, c2.R, c1.G, c2.G, c1.B, c2.B);
    }

    public static double CalculateSquareAlpha(int argb1, int argb2)
    {
        int[] c1 = ColorConversion.ArgbToArray(argb1);
        int[] c2 = ColorConversion.ArgbToArray(argb2);
        return CalculateSquare(c1[1], c2[1], c1[2], c2[2], c1[3], c2[3], c1[0], c2[0]);
    }

    public static double CalculateSquareAlpha(Color c1, Color c2)
    {
        return CalculateSquare(c1.R, c2.R, c1.G, c2.G, c1.B, c2.B, c1.A, c2.A);
    }

    public static double CalculateSquare(int r1, int r2, int g1, int g2, int b1, int b2, int a1 = -1, int a2 = -1)
    {
        if (a1 == -1 || a2 == -1) return (Math.Abs(r1 - r2) + Math.Abs(g1 - g2) + Math.Abs(b1 - b2)) / 7.65;
        else return (Math.Abs(r1 - r2) + Math.Abs(g1 - g2) + Math.Abs(b1 - b2) + Math.Abs(a1 - a2)) / 10.2;
    }

    // from:http://stackoverflow.com/questions/9018016/how-to-compare-two-colors
    public static double Calculate3D(int argb1, int argb2)
    {
        int[] c1 = ColorConversion.ArgbToArray(argb1);
        int[] c2 = ColorConversion.ArgbToArray(argb2);
        return Calculate3D(c1[1], c2[1], c1[2], c2[2], c1[3], c2[3]);
    }

    public static double Calculate3D(Color c1, Color c2)
    {
        return Calculate3D(c1.R, c2.R, c1.G, c2.G, c1.B, c2.B);
    }

    public static double Calculate3D(int r1, int r2, int g1, int g2, int b1, int b2)
    {
        return Math.Sqrt(Math.Pow(Math.Abs(r1 - r2), 2) + Math.Pow(Math.Abs(g1 - g2), 2) + Math.Pow(Math.Abs(b1 - b2), 2)) / 4.41672955930063709849498817084;
    }

    // Same as above, but made 4D to include alpha channel
    public static double Calculate4D(int argb1, int argb2)
    {
        int[] c1 = ColorConversion.ArgbToArray(argb1);
        int[] c2 = ColorConversion.ArgbToArray(argb2);
        return Calculate4D(c1[1], c2[1], c1[2], c2[2], c1[3], c2[3], c1[0], c2[0]);
    }

    public static double Calculate4D(Color c1, Color c2)
    {
        return Calculate4D(c1.R, c2.R, c1.G, c2.G, c1.B, c2.B, c1.A, c2.A);
    }

    public static double Calculate4D(int r1, int r2, int g1, int g2, int b1, int b2, int a1, int a2)
    {
        return Math.Sqrt(Math.Pow(Math.Abs(r1 - r2), 2) + Math.Pow(Math.Abs(g1 - g2), 2) + Math.Pow(Math.Abs(b1 - b2), 2) + Math.Pow(Math.Abs(a1 - a2), 2)) / 5.1;
    }

    /**
    * Computes the difference between two RGB colors by converting them to the L*a*b scale and
    * comparing them using the CIE76 algorithm { http://en.wikipedia.org/wiki/Color_difference#CIE76}
    */
    public static double CalculateCIE76(int argb1, int argb2)
    {
        return CalculateCIE76(Color.FromArgb(argb1), Color.FromArgb(argb2));
    }

    public static double CalculateCIE76(Color c1, Color c2)
    {
        return CalculateCIE76(c1.R, c2.R, c1.G, c2.G, c1.B, c2.B);
    }

    public static double CalculateCIE76(int r1, int r2, int g1, int g2, int b1, int b2)
    {
        int[] lab1 = ColorConversion.ColorToLab(r1, g1, b1);
        int[] lab2 = ColorConversion.ColorToLab(r2, g2, b2);
        return Math.Sqrt(Math.Pow(lab2[0] - lab1[0], 2) + Math.Pow(lab2[1] - lab1[1], 2) + Math.Pow(lab2[2] - lab1[2], 2)) / 2.55;
    }
}


internal static class ColorConversion
{

    public static int[] ArgbToArray(int argb)
    {
        return new int[] { (argb >> 24), (argb >> 16) & 0xFF, (argb >> 8) & 0xFF, argb & 0xFF };
    }

    public static int[] ColorToLab(int R, int G, int B)
    {
        // http://www.brucelindbloom.com

        double r, g, b, X, Y, Z, fx, fy, fz, xr, yr, zr;
        double Ls, fas, fbs;
        double eps = 216.0f / 24389.0f;
        double k = 24389.0f / 27.0f;

        double Xr = 0.964221f;  // reference white D50
        double Yr = 1.0f;
        double Zr = 0.825211f;

        // RGB to XYZ
        r = R / 255.0f; //R 0..1
        g = G / 255.0f; //G 0..1
        b = B / 255.0f; //B 0..1

        // assuming sRGB (D65)
        if (r <= 0.04045) r = r / 12;
        else r = (float)Math.Pow((r + 0.055) / 1.055, 2.4);

        if (g <= 0.04045) g = g / 12;
        else g = (float)Math.Pow((g + 0.055) / 1.055, 2.4);

        if (b <= 0.04045) b = b / 12;
        else b = (float)Math.Pow((b + 0.055) / 1.055, 2.4);

        X = 0.436052025f * r + 0.385081593f * g + 0.143087414f * b;
        Y = 0.222491598f * r + 0.71688606f * g + 0.060621486f * b;
        Z = 0.013929122f * r + 0.097097002f * g + 0.71418547f * b;

        // XYZ to Lab
        xr = X / Xr;
        yr = Y / Yr;
        zr = Z / Zr;

        if (xr > eps) fx = (float)Math.Pow(xr, 1 / 3.0);
        else fx = (float)((k * xr + 16.0) / 116.0);

        if (yr > eps) fy = (float)Math.Pow(yr, 1 / 3.0);
        else fy = (float)((k * yr + 16.0) / 116.0);

        if (zr > eps) fz = (float)Math.Pow(zr, 1 / 3.0);
        else fz = (float)((k * zr + 16.0) / 116);

        Ls = (116 * fy) - 16;
        fas = 500 * (fx - fy);
        fbs = 200 * (fy - fz);

        int[] lab = new int[3];
        lab[0] = (int)(2.55 * Ls + 0.5);
        lab[1] = (int)(fas + 0.5);
        lab[2] = (int)(fbs + 0.5);
        return lab;
    }
}

2

ভাল উপায় হ'ল ডেল্টা। ডেল্টা এমন একটি সংখ্যা যা রঙের পার্থক্য দেখায়। যদি ডেল্টে <1 হয় তবে পার্থক্যটি মানুষের চোখ দিয়ে চিনতে পারে না। আমি ক্যানভাসে একটি কোড লিখেছি এবং জেএসবিতে ল্যাবে আরজিবি রূপান্তর করার জন্য এবং তারপর ডেল্টা ই গণনা করার জন্য। এই উদাহরণে কোডটি পিক্সেলগুলি স্বীকৃতি দিচ্ছে যার একটি বেস রঙের সাথে আলাদা রঙ রয়েছে যা আমি LAB1 হিসাবে সংরক্ষণ করেছি। এবং তারপরে যদি এটি আলাদা হয় তবে সেগুলি পিক্সেলগুলিকে লাল করে তোলে। আপনি ইনক্রাইয়ের সাথে রঙের পার্থক্যের সংবেদনশীলতা বাড়াতে বা হ্রাস করতে পারেন বা ডেল্টা ই এর গ্রহণযোগ্য পরিসরকে হ্রাস করতে পারেন। এই উদাহরণে আমি যে লাইনে লিখেছি (ডেল্টা <= 10) ডেল্টায়ে জন্য 10 নিযুক্ত করেছি:

<script>   
  var constants = {
    canvasWidth: 700, // In pixels.
    canvasHeight: 600, // In pixels.
    colorMap: new Array() 
          };



  // -----------------------------------------------------------------------------------------------------

  function fillcolormap(imageObj1) {


    function rgbtoxyz(red1,green1,blue1){ // a converter for converting rgb model to xyz model
 var red2 = red1/255;
 var green2 = green1/255;
 var blue2 = blue1/255;
 if(red2>0.04045){
      red2 = (red2+0.055)/1.055;
      red2 = Math.pow(red2,2.4);
 }
 else{
      red2 = red2/12.92;
 }
 if(green2>0.04045){
      green2 = (green2+0.055)/1.055;
      green2 = Math.pow(green2,2.4);    
 }
 else{
      green2 = green2/12.92;
 }
 if(blue2>0.04045){
      blue2 = (blue2+0.055)/1.055;
      blue2 = Math.pow(blue2,2.4);    
 }
 else{
      blue2 = blue2/12.92;
 }
 red2 = (red2*100);
 green2 = (green2*100);
 blue2 = (blue2*100);
 var x = (red2 * 0.4124) + (green2 * 0.3576) + (blue2 * 0.1805);
 var y = (red2 * 0.2126) + (green2 * 0.7152) + (blue2 * 0.0722);
 var z = (red2 * 0.0193) + (green2 * 0.1192) + (blue2 * 0.9505);
 var xyzresult = new Array();
 xyzresult[0] = x;
 xyzresult[1] = y;
 xyzresult[2] = z;
 return(xyzresult);
} //end of rgb_to_xyz function
function xyztolab(xyz){ //a convertor from xyz to lab model
 var x = xyz[0];
 var y = xyz[1];
 var z = xyz[2];
 var x2 = x/95.047;
 var y2 = y/100;
 var z2 = z/108.883;
 if(x2>0.008856){
      x2 = Math.pow(x2,1/3);
 }
 else{
      x2 = (7.787*x2) + (16/116);
 }
 if(y2>0.008856){
      y2 = Math.pow(y2,1/3);
 }
 else{
      y2 = (7.787*y2) + (16/116);
 }
 if(z2>0.008856){
      z2 = Math.pow(z2,1/3);
 }
 else{
      z2 = (7.787*z2) + (16/116);
 }
 var l= 116*y2 - 16;
 var a= 500*(x2-y2);
 var b= 200*(y2-z2);
 var labresult = new Array();
 labresult[0] = l;
 labresult[1] = a;
 labresult[2] = b;
 return(labresult);

}

    var canvas = document.getElementById('myCanvas');
    var context = canvas.getContext('2d');
    var imageX = 0;
    var imageY = 0;

    context.drawImage(imageObj1, imageX, imageY, 240, 140);
    var imageData = context.getImageData(0, 0, 240, 140);
    var data = imageData.data;
    var n = data.length;
   // iterate over all pixels

    var m = 0;
    for (var i = 0; i < n; i += 4) {
      var red = data[i];
      var green = data[i + 1];
      var blue = data[i + 2];
    var xyzcolor = new Array();
    xyzcolor = rgbtoxyz(red,green,blue);
    var lab = new Array();
    lab = xyztolab(xyzcolor);
    constants.colorMap.push(lab); //fill up the colormap array with lab colors.         
      } 

  }

// ------------------------------------------------ -------------------------------------------------- ---

    function colorize(pixqty) {

         function deltae94(lab1,lab2){    //calculating Delta E 1994

         var c1 = Math.sqrt((lab1[1]*lab1[1])+(lab1[2]*lab1[2]));
         var c2 =  Math.sqrt((lab2[1]*lab2[1])+(lab2[2]*lab2[2]));
         var dc = c1-c2;
         var dl = lab1[0]-lab2[0];
         var da = lab1[1]-lab2[1];
         var db = lab1[2]-lab2[2];
         var dh = Math.sqrt((da*da)+(db*db)-(dc*dc));
         var first = dl;
         var second = dc/(1+(0.045*c1));
         var third = dh/(1+(0.015*c1));
         var deresult = Math.sqrt((first*first)+(second*second)+(third*third));
         return(deresult);
          } // end of deltae94 function
    var lab11 =  new Array("80","-4","21");
    var lab12 = new Array();
    var k2=0;
    var canvas = document.getElementById('myCanvas');
                                        var context = canvas.getContext('2d');
                                        var imageData = context.getImageData(0, 0, 240, 140);
                                        var data = imageData.data;

    for (var i=0; i<pixqty; i++) {

    lab12 = constants.colorMap[i];

    var deltae = deltae94(lab11,lab12);     
                                        if (deltae <= 10) {

                                        data[i*4] = 255;
                                        data[(i*4)+1] = 0;
                                        data[(i*4)+2] = 0;  
                                        k2++;
                                        } // end of if 
                                } //end of for loop
    context.clearRect(0,0,240,140);
    alert(k2);
    context.putImageData(imageData,0,0);
} 
// -----------------------------------------------------------------------------------------------------

$(window).load(function () {    
  var imageObj = new Image();
  imageObj.onload = function() {
  fillcolormap(imageObj);    
  }
  imageObj.src = './mixcolor.png';
});

// ---------------------------------------------------------------------------------------------------
 var pixno2 = 240*140; 
 </script>

1
আমি আপনার কয়েকটি পূর্ণসংখ্যা বিভাগ দ্বারা কিছুটা চিন্তিত। 1/3এবং 16/116উভয়ই মূল্যায়ন করে 0যা আপনি যা চান তা প্রায় নয়। সম্ভবত আপনার অ্যালগরিদম সঠিক, তবে আপনার কোড অবশ্যই তা নয়।
দাউদ ইবনে কেরেম

আপনি সিআইই-ল্যাব dE94 বর্ণনা করছেন। ডেল্টা ই এর অর্থ ইউক্লিডিয়ান পরিবর্তন। যা স্ট্যান্ডার্ড ল্যাব রঙের স্পেসে বলতে হবে, আপনার খুব স্ট্যান্ডার্ড ইউক্লিডিয়ান দূরত্বের সূত্রের দ্বারা প্রদত্ত ইউক্লিডিয়ান দূরত্ব। যেখানে ডেল্টা ই এর সংশোধনগুলি 94 76, ৯৪, ২০০০ (এখানে ডেল্টা ই, সিএমসি যা টেক্সটাইলগুলির জন্য ব্যবহৃত হয়) ল্যাব রঙের জায়গার মধ্যে অবস্থানের মধ্যে বিভিন্ন দূরত্বের সূত্র। ল্যাবের জন্য কোড প্রতিটিতে একই, রঙের পার্থক্যের জন্য কোডটি নয়। । সংক্ষেপে, ডেল্টা ই, এটিকে বলা হয় না।
টাটারাইজ

2

একটি সহজ পদ্ধতি যা কেবল আরজিবি ব্যবহার করে

cR=R1-R2 
cG=G1-G2 
cB=B1-B2 
uR=R1+R2 
distance=cR*cR*(2+uR/256) + cG*cG*4 + cB*cB*(2+(255-uR)/256)

আমি এটি এখন সময়ের জন্য ব্যবহার করেছি এবং বেশিরভাগ উদ্দেশ্যে এটি যথেষ্ট ভাল কাজ করে।


উপরের সূত্রটি ব্যবহার করে, দূরত্বের মানগুলির সীমাটি কী
আমান আগরওয়াল

এটি ইউক্লিডিয়ান রঙের পার্থক্য আনুমানিকের খুব কাছাকাছি। আমি অনুমান করছি যে এটি গণনার গতি বাড়ানোর জন্য মূল উপাদানটি এড়িয়ে চলেছে, সুতরাং এটি 0 থেকে 100। 3 অবধি। আপনি যদি 100 এ স্বাভাবিক হতে চান তবে এর পাওয়ারের দূরত্ব করুন1/3
ড্যানিয়েল

2

আমি এটি আমার অ্যান্ড্রয়েডে ব্যবহার করেছি এবং এটি সন্তোষজনক বলে মনে হচ্ছে যদিও আরজিবি জায়গার প্রস্তাব দেওয়া হয়নি:

    public double colourDistance(int red1,int green1, int blue1, int red2, int green2, int blue2)
{
      double rmean = ( red1 + red2 )/2;
    int r = red1 - red2;
    int g = green1 - green2;
    int b = blue1 - blue2;
    double weightR = 2 + rmean/256;
    double weightG = 4.0;
    double weightB = 2 + (255-rmean)/256;
    return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b);
}

তারপরে আমি নিম্নলিখিত ব্যবহার করে শতাংশের মিল খুঁজে পেয়েছি:

double maxColDist = 764.8339663572415;
double d1 = colourDistance(red1,green1,blue1,red2,green2,blue2);
String s1 = (int) Math.round(((maxColDist-d1)/maxColDist)*100) + "% match";

এটি যথেষ্ট ভাল কাজ করে।


2

আমি বিভিন্ন পদ্ধতি যেমন ল্যাব রঙের স্থান, এইচএসভি তুলনা চেষ্টা করেছি এবং আমি পেয়েছি যে আলোকিততা এই উদ্দেশ্যে খুব ভাল কাজ করে।

পাইথন সংস্করণ এখানে

def lum(c):
    def factor(component):
        component = component / 255;
        if (component <= 0.03928):
            component = component / 12.92;
        else:
            component = math.pow(((component + 0.055) / 1.055), 2.4);

        return component
    components = [factor(ci) for ci in c]

    return (components[0] * 0.2126 + components[1] * 0.7152 + components[2] * 0.0722) + 0.05;

def color_distance(c1, c2):

    l1 = lum(c1)
    l2 = lum(c2)
    higher = max(l1, l2)
    lower = min(l1, l2)

    return (higher - lower) / higher


c1 = ImageColor.getrgb('white')
c2 = ImageColor.getrgb('yellow')
print(color_distance(c1, c2))

তোমাকে দিবে

0.0687619047619048

এর উত্স কী ImageColor? সম্পাদনা আমি খুঁজে পেয়েছি, এটি হলfrom PIL import ImageColor
ademar111190

আলোকিততা কি কোনও রঙের উজ্জ্বলতা নয়? সুতরাং এক্ষেত্রে সবুজ, নীল এবং লাল বর্ণের যতক্ষণ উজ্জ্বলতা থাকবে ততক্ষণ আলাদা হবে না?
পিটার বি

1

আমি আশা করি আপনি শেষে একটি সম্পূর্ণ চিত্র বিশ্লেষণ করতে চান, তাই না? সুতরাং আপনি পরিচয় বর্ণের ম্যাট্রিক্সের মধ্যে সবচেয়ে ছোট / সর্বোচ্চ পার্থক্যটি পরীক্ষা করতে পারেন।

গ্রাফিক্স প্রসেসিংয়ের জন্য বেশিরভাগ গণিতের ক্রিয়াকলাপগুলি ম্যাট্রিকগুলি ব্যবহার করে, কারণ এগুলি ব্যবহার করে সম্ভাব্য অ্যালগরিদমগুলি প্রায়শই পয়েন্ট দূরত্ব এবং তুলনামূলক গণনার দ্বারা ক্লাসিকাল পয়েন্টের চেয়ে দ্রুত হয়। (যেমন ডাইরেক্টএক্স, ওপেনজিএল, ...

সুতরাং আমি মনে করি আপনার এখানে শুরু করা উচিত:

http://en.wikipedia.org/wiki/Identity_matrix

http://en.wikipedia.org/wiki/Matrix_difference_equation

... এবং যেমন বেসকা ইতিমধ্যে উপরে মন্তব্য করেছে:

এটি সেরা "দৃশ্যমান" পার্থক্যটি নাও দিতে পারে ...

যার অর্থ এটিও হ'ল যদি আপনি চিত্রগুলি প্রক্রিয়াকরণ করেন তবে আপনার অ্যালগরিদম আপনার "অনুরূপ" এর নির্ধারণের উপর নির্ভর করে।


1

কোটলিন সংস্করণ আপনি কত শতাংশের সাথে মিল করতে চান।

শতাংশ .চ্ছিক যুক্তির সাথে পদ্ধতি কল

isMatchingColor(intColor1, intColor2, 95) // should match color if 95% similar

পদ্ধতি শরীর

private fun isMatchingColor(intColor1: Int, intColor2: Int, percent: Int = 90): Boolean {
    val threadSold = 255 - (255 / 100f * percent)

    val diffAlpha = abs(Color.alpha(intColor1) - Color.alpha(intColor2))
    val diffRed = abs(Color.red(intColor1) - Color.red(intColor2))
    val diffGreen = abs(Color.green(intColor1) - Color.green(intColor2))
    val diffBlue = abs(Color.blue(intColor1) - Color.blue(intColor2))

    if (diffAlpha > threadSold) {
        return false
    }

    if (diffRed > threadSold) {
        return false
    }

    if (diffGreen > threadSold) {
        return false
    }

    if (diffBlue > threadSold) {
        return false
    }

    return true
}

0

মানুষের যেভাবে দেখছে সেভাবে তুলনা করতে আপনাকে যে কোনও আরজিবি রঙগুলিকে ল্যাব রঙের জায়গাতে রূপান্তর করতে হবে। অন্যথায় আপনি কিছু খুব অদ্ভুত উপায়ে 'মেলে' এমন আরজিবি রঙ পেয়ে যাবেন।

কালার ডিফারেন্সে উইকিপিডিয়া লিঙ্কটি আপনাকে বছরের পর বছর ধরে সংজ্ঞায়িত করা বিভিন্ন ল্যাব রঙের স্পেস ডিফারেন্স অ্যালগরিদমগুলিতে একটি ভূমিকা দেয়। সবচেয়ে সহজ যা কেবল দুটি ল্যাব রঙের ইউক্যালিডিয়ান দূরত্ব পরীক্ষা করে, কাজ করে তবে কয়েকটি ত্রুটি রয়েছে।

সুবিধার্থে ওপেনআইএমজেজে প্রকল্পে আরও পরিশীলিত সিআইইডিইডি 2000 অ্যালগরিদমের জাভা প্রয়োগ রয়েছে । এটি আপনার দুটি ল্যাব রঙের সেট সরবরাহ করুন এবং এটি আপনাকে একক দূরত্বের মান প্রদান করবে।


0

রঙগুলির তুলনা করার একমাত্র "ডান" উপায়টি এটি সিল্যাব বা সিআইএলওএল-এর ব-দ্বীপের সাথে করা।

তবে প্রচুর অ্যাপ্লিকেশনগুলির জন্য আমি মনে করি এটি যথেষ্ট পরিমাণে আনুমানিক:

distance = 3 * |dR| + 4 * |dG| + 3 * |dB|

আমি মনে করি রঙগুলির সাথে তুলনা করার সময় একটি ওজনযুক্ত ম্যানহাটনের দূরত্ব অনেক বেশি অর্থবোধ করে। মনে রাখবেন যে রঙের প্রাথমিকগুলি কেবল আমাদের মাথায় থাকে। তাদের কোনও শারীরিক তাত্পর্য নেই। সিআইএলএব এবং সিআইএলভ বর্ণ সম্পর্কে আমাদের বর্ণের ধারণা থেকে মডেল করা হয়েছে।


0

দ্রুত এবং নোংরা জন্য, আপনি করতে পারেন

import java.awt.Color;
private Color dropPrecision(Color c,int threshold){
    return new Color((c.getRed()/threshold),
                     (c.getGreen()/threshold),
                     (c.getBlue()/threshold));
}
public boolean inThreshold(Color _1,Color _2,int threshold){
    return dropPrecision(_1,threshold)==dropPrecision(_2,threshold);
}

রং পরিমাণে পূর্ণসংখ্যার বিভাগ ব্যবহার করে।


0

সুইফট 5 উত্তর

আমি এই থ্রেডটি পেয়েছি কারণ আমার এই প্রশ্নের একটি সুইফ্ট সংস্করণ প্রয়োজন। সমাধানের সাথে যেহেতু কেউ উত্তর দেয়নি, এখানে আমার:

extension UIColor {

    var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        getRed(&red, green: &green, blue: &blue, alpha: &alpha)

        return (red, green, blue, alpha)
    }

    func isSimilar(to colorB: UIColor) -> Bool {
        let rgbA = self.rgba
        let rgbB = colorB.rgba

        let diffRed = abs(CGFloat(rgbA.red) - CGFloat(rgbB.red))
        let diffGreen = abs(rgbA.green - rgbB.green)
        let diffBlue = abs(rgbA.blue - rgbB.blue)

        let pctRed = diffRed
        let pctGreen = diffGreen
        let pctBlue = diffBlue

        let pct = (pctRed + pctGreen + pctBlue) / 3 * 100

        return pct < 10 ? true : false
    }
}

ব্যবহার:

let black: UIColor = UIColor.black
let white: UIColor = UIColor.white

let similar: Bool = black.isSimilar(to: white)

অনুরূপ রঙগুলি ফিরিয়ে আনতে আমি 10% এরও কম পার্থক্য নির্ধারণ করেছি, তবে আপনি এটি নিজের পছন্দসই করতে পারেন।


0

অ্যান্ড্রয়েড ColorUtils এপিআই RGBToHSL জন্য: দুটো ছিল int- এ argb রং (রঙ 1, রঙ 2) এবং আমি দুটি রং মধ্যে দূরত্ব / পার্থক্য পেতে চেয়েছিলেন। আমি যা করেছি তা এখানে;

private float getHue(int color) {
    int R = (color >> 16) & 0xff;
    int G = (color >>  8) & 0xff;
    int B = (color      ) & 0xff;
    float[] colorHue = new float[3];
    ColorUtils.RGBToHSL(R, G, B, colorHue);
    return colorHue[0];
}

তারপরে আমি দুটি বর্ণের মধ্যে দূরত্ব খুঁজতে কোডের নীচে ব্যবহার করেছি।

private float getDistance(getHue(color1), getHue(color2)) {
    float avgHue = (hue1 + hue2)/2;
    return Math.abs(hue1 - avgHue);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.