আইটিউনস 11 এর গানের তালিকাকে রঙ করার জন্য অ্যালগরিদম কীভাবে কাজ করবে? [বন্ধ]


297

নতুন আইটিউনস 11-এ অ্যালবামের গানের তালিকার জন্য খুব সুন্দর ভিউ রয়েছে, অ্যালবামের কভারের ফাংশনে ফন্ট এবং পটভূমির জন্য রঙ বেছে নেওয়া। অ্যালগরিদম কীভাবে কাজ করে তা কেউ বুঝতে পেরেছেন?

তৃতীয় উদাহরণ


9
ডাব্লু 3 সি রঙের বিপরীতে সূত্রটি উত্তরের অংশ হতে পারে। আমার নিজস্ব ইমরিকাল পরীক্ষাগুলি দেখায় যে এই সূত্রটি এমএস ওয়ার্ডের দ্বারা এটি স্বয়ংক্রিয় রঙের ফন্ট স্থির করতে ব্যবহৃত হয়। "বর্ণের উজ্জ্বলতা নিম্নলিখিত সূত্র দ্বারা নির্ধারিত হয়" অনুসন্ধান করুন [w3c রঙের বিপরীতে সূত্র] [1] [1]: w3.org/TR/AERT#color-contrast
bluedog

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

1
অন্য কিছু খেয়াল করার বিষয় হ'ল এটি ম্যাক ওএস এবং উইন্ডোজের মধ্যে পার্থক্য বলে মনে হচ্ছে: twitter.com/ग्रीmfrog
টম ইরভিং

2
আমি কল্পনা করতে পারি যে কেবল রঙের পরিমাণই নয়, তবে তাদের সংশ্লেষের মানগুলিও গণনার অংশ: আমার পরীক্ষাগুলি আমাকে এই সিদ্ধান্তে নিয়ে গেছে, যে হাইলাইট রঙগুলি প্রায়শই পটভূমির রঙ হিসাবে বেছে নেওয়া হয় যদিও সেগুলি কয়েকটি অঞ্চলে ঘটে occur চিত্র। এ কারণেই আমি বিশ্বাস করি যে কভার চিত্রের হিস্টোগ্রাম এবং এর শিখরগুলি দরকারী হতে পারে এবং কিছু সূক্ষ্ম সুরযুক্ত প্যারামিটারের উপর ভিত্তি করে রঙটি বেছে নেওয়া হয়েছে।
রাফেল 20

উত্তর:


423

উদাহরণ 1

আমি ম্যাথমেটিকায় আইটিউনস 11 রঙের অ্যালগরিদমটি আনুমানিক হিসাবে অ্যালবামের কভারটি ইনপুট হিসাবে দিয়েছি:

আউটপুট 1

আমি এটা কিভাবে করেছি

পরীক্ষার এবং ত্রুটির মধ্য দিয়ে আমি একটি অ্যালগরিদম নিয়ে এসেছি যা ~ 80% অ্যালবামের সাথে কাজ করে যা আমি এটি পরীক্ষা করেছি।

রঙের পার্থক্য

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

অতএব, আমি আরজিবি রঙগুলিকে (আকারে {1,1,1}) YUV তে রূপান্তর করার জন্য একটি ফাংশন লিখেছিলাম , এটি একটি বর্ণের স্থান যা রঙ উপলব্ধি অনুমানের তুলনায় অনেক ভাল:

(সম্পাদনা: @ ক্রমুলিয়ান এবং @ ড্রেক উল্লেখ করেছেন যে ম্যাথমেটিকার অন্তর্নির্মিত সিআইএলএবি এবং সিআইইলইউভিওর রঙের স্থানগুলি যথাযথ হবে ... দেখে মনে হচ্ছে আমি এখানে চাকাটিকে কিছুটা নতুনভাবে আবিষ্কার করেছি)

convertToYUV[rawRGB_] :=
    Module[{yuv},
        yuv = {{0.299, 0.587, 0.114}, {-0.14713, -0.28886, 0.436},
            {0.615, -0.51499, -0.10001}};
        yuv . rawRGB
    ]

এরপরে, আমি উপরের রূপান্তরটির সাথে রঙের দূরত্ব গণনা করতে একটি ফাংশন লিখেছিলাম:

ColorDistance[rawRGB1_, rawRGB2_] := 
    EuclideanDistance[convertToYUV @ rawRGB1, convertToYUV @ rawRGB2]

প্রভাবশালী রং

আমি দ্রুত আবিষ্কার করেছি যে বিল্ট-ইন ম্যাথমেটিকা ​​ফাংশন DominantColorsআইটিউনস যে অ্যালগরিদম ব্যবহার করে তা আনুমানিকভাবে যথেষ্ট সূক্ষ্ম কন্ট্রোল নিয়ন্ত্রণের অনুমতি দেয় না। পরিবর্তে আমি আমার নিজস্ব ফাংশন লিখেছি ...

একদল পিক্সেলের প্রভাবশালী রঙ গণনা করার একটি সহজ পদ্ধতি হ'ল সমস্ত পিক্সেলকে একই রঙের বালতিতে সংগ্রহ করা এবং তারপরে বৃহত্তম বালতিটি সন্ধান করা।

DominantColorSimple[pixelArray_] :=
    Module[{buckets},
        buckets = Gather[pixelArray, ColorDistance[#1,#2] < .1 &];
        buckets = Sort[buckets, Length[#1] > Length[#2] &];
        RGBColor @@ Mean @ First @ buckets
    ]

নোটটি .1হ'ল বিভিন্ন রঙকে পৃথক হিসাবে বিবেচনা করতে হবে তার সহনশীলতা। আরও মনে রাখবেন যে ইনপুটটি কাঁচা ট্রিপলেট আকারে পিক্সেলের একটি অ্যারে ( {{1,1,1},{0,0,0}}) হলেও আমি RGBColorঅন্তর্নির্মিত DominantColorsফাংশনটিকে আরও ভালভাবে অনুমান করার জন্য একটি গাণিতিক উপাদান ফেরত দেব ।

আমার আসল ফাংশন প্রদত্ত অন্য রঙিন ফিল্টার করার পরে প্রভাবশালী রঙগুলিতে DominantColorsNewফিরে আসার বিকল্প যুক্ত করে n। এটি প্রতিটি রঙের তুলনার জন্য সহনশীলতা প্রকাশ করে:

DominantColorsNew[pixelArray_, threshold_: .1, n_: 1, 
    numThreshold_: .2, filterColor_: 0, filterThreshold_: .5] :=
    Module[
        {buckets, color, previous, output},
        buckets = Gather[pixelArray, ColorDistance[#1, #2] < threshold &];
        If[filterColor =!= 0, 
        buckets = 
            Select[buckets, 
                ColorDistance[ Mean[#1], filterColor] > filterThreshold &]];
        buckets = Sort[buckets, Length[#1] > Length[#2] &];
        If[Length @ buckets == 0, Return[{}]];
        color = Mean @ First @ buckets;
        buckets = Drop[buckets, 1];
        output = List[RGBColor @@ color];
        previous = color;
        Do[
            If[Length @ buckets == 0, Return[output]];
            While[
                ColorDistance[(color = Mean @ First @ buckets), previous] < 
                    numThreshold, 
                If[Length @ buckets != 0, buckets = Drop[buckets, 1], 
                    Return[output]]
            ];
            output = Append[output, RGBColor @@ color];
            previous = color,
            {i, n - 1}
        ];
        output
    ]

অ্যালগোরিদমের বাকী অংশ

প্রথমে আমি দ্বিপাক্ষিক ফিল্টার সহ অ্যালবামের কভার ( 36px, 36px) এবং হ্রাস বিশদটি পুনরায় আকার দিয়েছি

image = Import["http://i.imgur.com/z2t8y.jpg"]
thumb = ImageResize[ image, 36, Resampling -> "Nearest"];
thumb = BilateralFilter[thumb, 1, .2, MaxIterations -> 2];

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

thumb = ImageCrop[thumb, 34];

এর পরে, আমি এর ডিফল্ট সহনশীলতার সাথে চিত্রটির বাইরেরতম প্রান্তে প্রভাবশালী রঙ (উপরে নতুন ফাংশন সহ) পেয়েছি .1

border = Flatten[
    Join[ImageData[thumb][[1 ;; 34 ;; 33]] , 
        Transpose @ ImageData[thumb][[All, 1 ;; 34 ;; 33]]], 1];
background = DominantColorsNew[border][[1]];

শেষ অবধি, আমি পুরো চিত্রটিতে 2 টি প্রভাবশালী রং ফিরিয়েছি, ফাংশনটিকে পাশাপাশি ব্যাকগ্রাউন্ডের রঙটিও ফিল্টার করতে বলেছি।

highlights = DominantColorsNew[Flatten[ImageData[thumb], 1], .1, 2, .2, 
    List @@ background, .5];
title = highlights[[1]];
songs = highlights[[2]];

উপরের সহনশীলতার মানগুলি নিম্নরূপ: .1"পৃথক" রঙের মধ্যে ন্যূনতম পার্থক্য; .2অসংখ্য প্রভাবশালী রঙের মধ্যে ন্যূনতম পার্থক্য (একটি কম মান কালো এবং গা gray় ধূসর রঙ ফিরে আসতে পারে, তবে একটি উচ্চতর মান প্রভাবশালী রঙগুলিতে আরও বৈচিত্র্য নিশ্চিত করে); .5প্রভাবশালী রঙ এবং পটভূমির মধ্যে ন্যূনতম পার্থক্য (একটি উচ্চতর মান উচ্চতর-বিপরীতে রঙের সংমিশ্রণ উত্পন্ন করবে)

ভাল খবর!

Graphics[{background, Disk[]}]
Graphics[{title, Disk[]}]
Graphics[{songs, Disk[]}]

ফাইনাল আউটপুট

মন্তব্য

অ্যালগরিদম খুব সাধারণভাবে প্রয়োগ করা যেতে পারে। আমি উপরের সেটিংস এবং সহনশীলতার মানগুলি সেই স্থানে টিক করেছি যেখানে তারা আমার পরীক্ষিত অ্যালবামের ~ 80% এর জন্য সাধারণত সঠিক রঙ উত্পাদন করতে কাজ করে। DominantColorsNewহাইলাইটগুলির জন্য ফিরে আসতে দুটি রঙ না পেয়ে যখন কয়েকটি কিনারা ঘটে (যেমন অ্যালবামের কভারটি একরঙা থাকে তখন)। আমার অ্যালগরিদম এই কেসগুলিকে সম্বোধন করে না, তবে আইটিউনসের কার্যকারিতা ডুপ্লিকেট করা তুচ্ছ হবে: অ্যালবামটি যখন কম দুটি হাইলাইট দেয় তখন শিরোনামটি সাদা বা কালো হয়ে যায় ব্যাকগ্রাউন্ডের সাথে সর্বোত্তম বিপরীতে নির্ভর করে। তারপরে গানগুলি একটি হাইলাইট রঙে পরিণত হয় বা শিরোনামের রঙটি কিছুটা ব্যাকগ্রাউন্ডে ম্লান হয়ে যায়।

আরও উদাহরণ

আরও উদাহরণ


3
ঠিক আছে @ শেঠ থম্পসন, এটি খুব আশাব্যঞ্জক বলে মনে হচ্ছে। আমি এটি আমার নিজের চেষ্টা করতে যাচ্ছি, এটি আমাকে কয়েক দিন সময় নেবে, দয়া করে ধৈর্য ধরুন।
লুইস্পিনোজা

6
খুব দুর্দান্ত সমাধান। এখন ম্যাথামেটিকা ​​থেকে অবজেক্টিভ-সি পর্যন্ত একটি বন্দর দরকার, এটি একটি কঠিন লড়াই।
loretoparisi

1
এই বিস্তারিত উত্তর জন্য +1!
মারিয়াস শুল্জ

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

6
এটিই আমি একটি "চক নরিস উত্তর" বলতে চাই
এমসিকেপুর

44

@ শেঠ-থম্পসনের উত্তর এবং @ ব্লুয়েডোগের মন্তব্যে আমি একটি চিত্রের কার্যকরীতে রঙিন পরিকল্পনা তৈরি করতে কিছুটা অবজেক্টিভ-সি (কোকো-টাচ) প্রকল্প তৈরি করি।

আপনি প্রকল্পটি এখানে পরীক্ষা করতে পারেন:

https://github.com/luisespinoza/LEColorPicker

আপাতত, LEColorPicker করছেন:

  1. চিত্রটি 36x36 পিক্সেল থেকে ছোট করা হয়েছে (এটি গণনার সময় হ্রাস করে)।
  2. এটি চিত্র থেকে একটি পিক্সেল অ্যারে উত্পন্ন করে।
  3. পিক্সেল অ্যারে YUV স্পেসে রূপান্তর করে।
  4. শেঠ থম্পসনের কোড যেমন করে তেমন রঙগুলি সংগ্রহ করুন।
  5. রঙের সেটগুলি গণনা অনুসারে বাছাই করা হয়।
  6. অ্যালগরিদম তিনটি প্রভাবশালী রঙ নির্বাচন করে।
  7. সর্বাধিক প্রভাবশালী ব্যাকগ্রাউন্ড হিসাবে স্বাক্ষরিত হয়।
  8. দ্বিতীয় এবং তৃতীয় সর্বাধিক প্রভাবশালীদের ডাব্লু 3 সি রঙের বিপরীতে সূত্রটি ব্যবহার করে পরীক্ষা করা হয়, ব্যাকগ্রাউন্ডের সাথে রঙগুলি বিপরীতে এসেছে কিনা তা পরীক্ষা করতে।
  9. যদি কোনও পাঠ্যের রঙ পরীক্ষায় পাস না করে, তবে ওয়াই উপাদানটির উপর নির্ভর করে সাদা বা কালোতে স্বাক্ষরিত।

এটি এখনই, আমি রঙিন টিউনস প্রকল্পটি ( https://github.com/Dannvix/ColorTunes ) এবং নতুন বৈশিষ্ট্যের জন্য ওয়েড কসগ্রোভ প্রকল্পটি যাচাই করব । এছাড়াও রঙিন স্কিমের ফলাফলের উন্নতি করার জন্য আমার কাছে কিছু নতুন ধারণা রয়েছে।

Screenshot_Mona


2
+1 - খুব দুর্দান্ত স্টাফ, এবং কীভাবে অ্যালগরিদম বিকাশ এবং অ্যাপ্লিকেশন ডেভলপমেন্ট উভয়ের
নিজস্বভাবে

1
বিপরীতে পরীক্ষা করার জন্য +1।
ব্রায়ানমার্ন

হ্যাঁ দুর্দান্ত তবে আপনি প্রতিটি রঙের জন্য হ্যাশ মানগুলি কীভাবে গোল করছেন? আমি মনে করি আমি সহজেই নীচের ডানদিকে কিছুটা কালো এবং সাদা "স্পষ্টালিপি" লোগো যুক্ত করে এই অ্যালগরিদমটি খুব সহজেই ভেঙে ফেলতে পারি, আপনি সত্যিই কালো এবং সাদা জন্য একটি ফোকাস যুক্ত করছেন। যাইহোক, এই অ্যালগরিদমটি ক্লিপ আর্ট ভিত্তিক চিত্রগুলির জন্য আরও ভাল কাজ করবে, তবে আপনার যদি চিত্রটি 36x36 এ থাকে তবে এই ব্যর্থ মামলাগুলি অ্যান্টি-এলিয়াসিং দ্বারা আরও বিরল হয়ে যাবে
জ্যাক ফ্রাঞ্জেন

একটি শব্দ: অভিনব!
টেডি

16

প্যানিকের ওয়েড কসগ্রোভ তাঁর একটি অ্যালগরিদম বাস্তবায়নের বর্ণনা দিয়ে একটি সুন্দর ব্লগ পোস্ট লিখেছিলেন যা আইটিউনস-এর একটিটিকে প্রায় সমান করে দেয়। এটি উদ্দেশ্য-সি-তে একটি নমুনা বাস্তবায়ন অন্তর্ভুক্ত করে।


15

আপনি এমএমসিকিউ (মিডিয়ান কাট কালার কোয়ান্টাইজেশন) অ্যালগরিদম ব্যবহার করে এমন আইটিউন অ্যালবাম ভিউর এইচটিএমএল বাস্তবায়ন যা রঙিন টিউনসও চেকআউট করতে পারেন ।


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

কালার টিউনসে গুরুত্বপূর্ণ মন্তব্যটি হ'ল (মিডিয়ান কাট কোয়ান্টাইজেশন অ্যালগরিদম) [ লেপটোনিকা / পেপারস / মিডিয়ানকুট.পিডিএফ] এর উল্লেখ । আমি এটি প্রায় 2 ঘন্টার মধ্যে অজগরটিতে এটি প্রয়োগ করেছি কেবল কাগজে বর্ণিত বিবরণটি তৈরি করেছি এবং এটি আমার উপরের শেঠের অ্যালগরিদমের প্রয়োগের পক্ষে পছন্দ করি। আমি ফলাফলগুলি আরও ভালভাবে পছন্দ করি তবে সবচেয়ে গুরুত্বপূর্ণ এটি বেশ খানিকটা দ্রুত (অবশ্যই, আমি শেঠের অ্যালগরিদম ভুলভাবে প্রয়োগ করতে পারতাম)।
brianmearns

@ sh1ftst0rm আপনার কি গাথুব বা অন্য কোথাও অজগর বাস্তবায়ন রয়েছে? চিয়ার্স
এ্যানট্রপিক

@ অ্যান্ট্রোপিক দুঃখিত, আমি তা করি না। এটি যে একটি বেসরকারী প্রকল্পে আমি কাজ করছিলাম তার অংশ ছিল এবং আমি এটিকে একেবারেই বের করে আনিনি। আমি যদি সুযোগ পাই, তবে আমি এটি অন্য কোথাও পোস্ট করার চেষ্টা করব, তবে সম্ভবত এটি আর খুব শীঘ্রই হবে না।
brianmearn 1

5

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

https://gist.github.com/philix/5688064#file-simpleimage-php-L81

এটি http://festea.com.br এ কভার ফটোগুলির পটভূমি পূরণ করতে ব্যবহৃত হচ্ছে used



4

আমি একই প্রশ্নটি অন্য প্রসঙ্গে জিজ্ঞাসা করেছি এবং একটিটির জন্য http://charlesleifer.com/blog/using-python-and-k-means-to-find-the-dominant-colors-in-images/ এ চিহ্নিত করা হয়েছিল অ্যালগরিদম (কে মিনস) শিখতে যা রাগলি ইমেজটিতে এলোমেলো পয়েন্টগুলি ব্যবহার করে একই কাজ করে। এইভাবে, অ্যালগরিদম নিজে থেকেই প্রভাবশালী রঙগুলি আবিষ্কার করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.